VirtualBox

Changeset 20444 in vbox


Ignore:
Timestamp:
Jun 9, 2009 3:16:41 PM (16 years ago)
Author:
vboxsync
Message:

Protect VGA accesses with a critical section.

Location:
trunk/src/VBox/Devices/Graphics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r20374 r20444  
    21632163    uint32_t v, addr1, addr;
    21642164    vga_draw_line_func *vga_draw_line;
    2165     bool offsets_changed;
     2165    int offsets_changed;
    21662166
    21672167    offsets_changed = update_basic_params(s);
     
    30443044PDMBOTHCBDECL(int) vgaIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
    30453045{
     3046    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3047
     3048    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_WRITE);
     3049    if (rc != VINF_SUCCESS)
     3050        return rc;
     3051
    30463052    NOREF(pvUser);
    30473053    if (cb == 1)
    3048         vga_ioport_write(PDMINS_2_DATA(pDevIns, PVGASTATE), Port, u32);
     3054        vga_ioport_write(s, Port, u32);
    30493055    else if (cb == 2)
    30503056    {
    3051         vga_ioport_write(PDMINS_2_DATA(pDevIns, PVGASTATE), Port, u32 & 0xff);
    3052         vga_ioport_write(PDMINS_2_DATA(pDevIns, PVGASTATE), Port + 1, u32 >> 8);
    3053     }
     3057        vga_ioport_write(s, Port, u32 & 0xff);
     3058        vga_ioport_write(s, Port + 1, u32 >> 8);
     3059    }
     3060    PDMCritSectLeave(&s->lock);
    30543061    return VINF_SUCCESS;
    30553062}
     
    30693076PDMBOTHCBDECL(int) vgaIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
    30703077{
     3078    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    30713079    NOREF(pvUser);
     3080
     3081    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_READ);
     3082    if (rc != VINF_SUCCESS)
     3083        return rc;
     3084
     3085    rc = VERR_IOM_IOPORT_UNUSED;
    30723086    if (cb == 1)
    30733087    {
    3074         *pu32 = vga_ioport_read(PDMINS_2_DATA(pDevIns, PVGASTATE), Port);
    3075         return VINF_SUCCESS;
     3088        *pu32 = vga_ioport_read(s, Port);
     3089        rc = VINF_SUCCESS;
    30763090    }
    30773091    else if (cb == 2)
    30783092    {
    3079         *pu32 = vga_ioport_read(PDMINS_2_DATA(pDevIns, PVGASTATE), Port)
    3080              | (vga_ioport_read(PDMINS_2_DATA(pDevIns, PVGASTATE), Port + 1) << 8);
    3081         return VINF_SUCCESS;
    3082     }
    3083     return VERR_IOM_IOPORT_UNUSED;
     3093        *pu32 = vga_ioport_read(s, Port)
     3094             | (vga_ioport_read(s, Port + 1) << 8);
     3095        rc = VINF_SUCCESS;
     3096    }
     3097    PDMCritSectLeave(&s->lock);
     3098    return rc;
    30843099}
    30853100
     
    31003115    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    31013116
     3117    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_WRITE);
     3118    if (rc != VINF_SUCCESS)
     3119        return rc;
     3120
    31023121    NOREF(pvUser);
    31033122
     
    31073126    {
    31083127        HGSMIGuestWrite (s->pHGSMI, u32);
     3128        PDMCritSectLeave(&s->lock);
    31093129        return VINF_SUCCESS;
    31103130    }
     
    31123132    {
    31133133        HGSMIHostWrite (s->pHGSMI, u32);
     3134        PDMCritSectLeave(&s->lock);
    31143135        return VINF_SUCCESS;
    31153136    }
     
    31203141        Log(("vgaIOPortWriteVBEData: %s - Switching to host...\n",
    31213142             s->vbe_index == VBE_DISPI_INDEX_VBVA_HOST? "VBE_DISPI_INDEX_VBVA_HOST": "VBE_DISPI_INDEX_VBVA_GUEST"));
     3143        PDMCritSectLeave(&s->lock);
    31223144        return VINF_IOM_HC_IOPORT_WRITE;
    31233145    }
     
    31293151     * This has to be done on the host in order to execute the connector callbacks.
    31303152     */
    3131     if (s->vbe_index == VBE_DISPI_INDEX_ENABLE
    3132         || s->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO)
     3153    if (    s->vbe_index == VBE_DISPI_INDEX_ENABLE
     3154        ||  s->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO)
    31333155    {
    31343156        Log(("vgaIOPortWriteVBEData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n"));
     3157        PDMCritSectLeave(&s->lock);
    31353158        return VINF_IOM_HC_IOPORT_WRITE;
    31363159    }
     
    31453168            {
    31463169                s->fWriteVBEData = false;
    3147                 return vbe_ioport_write_data(s, Port, u32 & 0xFF);
     3170                rc = vbe_ioport_write_data(s, Port, u32 & 0xFF);
     3171                PDMCritSectLeave(&s->lock);
     3172                return rc;
    31483173            }
    31493174            else
     
    31513176                s->cbWriteVBEData = u32 & 0xFF;
    31523177                s->fWriteVBEData = true;
     3178                PDMCritSectLeave(&s->lock);
    31533179                return VINF_SUCCESS;
    31543180            }
     
    31773203//        }
    31783204//#endif
    3179         return vbe_ioport_write_data(s, Port, u32);
     3205        rc = vbe_ioport_write_data(s, Port, u32);
     3206        PDMCritSectLeave(&s->lock);
     3207        return rc;
    31803208    }
    31813209    else
    31823210        AssertMsgFailed(("vgaIOPortWriteVBEData: Port=%#x cb=%d u32=%#x\n", Port, cb, u32));
     3211
     3212    PDMCritSectLeave(&s->lock);
    31833213    return VINF_SUCCESS;
    31843214}
     
    31993229{
    32003230    NOREF(pvUser);
     3231    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3232
     3233    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_WRITE);
     3234    if (rc != VINF_SUCCESS)
     3235        return rc;
     3236
    32013237#ifdef VBE_BYTEWISE_IO
    32023238    if (cb == 1)
    32033239    {
    3204         VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    32053240        if (!s->fWriteVBEIndex)
    32063241        {
    32073242            s->cbWriteVBEIndex = u32 & 0x00FF;
    32083243            s->fWriteVBEIndex = true;
     3244            PDMCritSectLeave(&s->lock);
    32093245            return VINF_SUCCESS;
    32103246        }
     
    32133249            s->fWriteVBEIndex = false;
    32143250            vbe_ioport_write_index(s, Port, (s->cbWriteVBEIndex << 8) | (u32 & 0x00FF));
     3251            PDMCritSectLeave(&s->lock);
    32153252            return VINF_SUCCESS;
    32163253        }
     
    32193256#endif
    32203257    if (cb == 2)
    3221         vbe_ioport_write_index(PDMINS_2_DATA(pDevIns, PVGASTATE), Port, u32);
     3258        vbe_ioport_write_index(s, Port, u32);
    32223259    else
    32233260        AssertMsgFailed(("vgaIOPortWriteVBEIndex: Port=%#x cb=%d u32=%#x\n", Port, cb, u32));
     3261    PDMCritSectLeave(&s->lock);
    32243262    return VINF_SUCCESS;
    32253263}
     
    32403278{
    32413279    NOREF(pvUser);
     3280    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3281
     3282    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_READ);
     3283    if (rc != VINF_SUCCESS)
     3284        return rc;
    32423285
    32433286#ifdef VBOX_WITH_HGSMI
    3244     VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    32453287#ifdef IN_RING3
    32463288    if (s->vbe_index == VBE_DISPI_INDEX_VBVA_GUEST)
    32473289    {
    32483290        *pu32 = HGSMIGuestRead (s->pHGSMI);
     3291        PDMCritSectLeave(&s->lock);
    32493292        return VINF_SUCCESS;
    32503293    }
     
    32523295    {
    32533296        *pu32 = HGSMIHostRead (s->pHGSMI);
     3297        PDMCritSectLeave(&s->lock);
    32543298        return VINF_SUCCESS;
    32553299    }
     
    32603304        Log(("vgaIOPortWriteVBEData: %s - Switching to host...\n",
    32613305             s->vbe_index == VBE_DISPI_INDEX_VBVA_HOST? "VBE_DISPI_INDEX_VBVA_HOST": "VBE_DISPI_INDEX_VBVA_GUEST"));
     3306        PDMCritSectLeave(&s->lock);
    32623307        return VINF_IOM_HC_IOPORT_READ;
    32633308    }
     
    32683313    if (cb == 1)
    32693314    {
    3270         VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    3271 
    32723315        if (!s->fReadVBEData)
    32733316        {
    32743317            *pu32 = (vbe_ioport_read_data(s, Port) >> 8) & 0xFF;
    32753318            s->fReadVBEData = true;
     3319            PDMCritSectLeave(&s->lock);
    32763320            return VINF_SUCCESS;
    32773321        }
     
    32803324            *pu32 = vbe_ioport_read_data(s, Port) & 0xFF;
    32813325            s->fReadVBEData = false;
     3326            PDMCritSectLeave(&s->lock);
    32823327            return VINF_SUCCESS;
    32833328        }
     
    32873332    if (cb == 2)
    32883333    {
    3289         *pu32 = vbe_ioport_read_data(PDMINS_2_DATA(pDevIns, PVGASTATE), Port);
     3334        *pu32 = vbe_ioport_read_data(s, Port);
     3335        PDMCritSectLeave(&s->lock);
    32903336        return VINF_SUCCESS;
    32913337    }
    32923338    else if (cb == 4)
    32933339    {
    3294         VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    32953340        /* Quick hack for getting the vram size. */
    32963341        *pu32 = s->vram_size;
     3342        PDMCritSectLeave(&s->lock);
    32973343        return VINF_SUCCESS;
    32983344    }
    32993345    AssertMsgFailed(("vgaIOPortReadVBEData: Port=%#x cb=%d\n", Port, cb));
     3346    PDMCritSectLeave(&s->lock);
    33003347    return VERR_IOM_IOPORT_UNUSED;
    33013348}
     
    33163363{
    33173364    NOREF(pvUser);
     3365    VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3366
     3367    int rc = PDMCritSectEnter(&s->lock, VINF_IOM_HC_IOPORT_READ);
     3368    if (rc != VINF_SUCCESS)
     3369        return rc;
     3370
    33183371#ifdef VBE_BYTEWISE_IO
    33193372    if (cb == 1)
    33203373    {
    3321         VGAState *s = PDMINS_2_DATA(pDevIns, PVGASTATE);
    3322 
    33233374        if (!s->fReadVBEIndex)
    33243375        {
    33253376            *pu32 = (vbe_ioport_read_index(s, Port) >> 8) & 0xFF;
    33263377            s->fReadVBEIndex = true;
     3378            PDMCritSectLeave(&s->lock);
    33273379            return VINF_SUCCESS;
    33283380        }
     
    33313383            *pu32 = vbe_ioport_read_index(s, Port) & 0xFF;
    33323384            s->fReadVBEIndex = false;
     3385            PDMCritSectLeave(&s->lock);
    33333386            return VINF_SUCCESS;
    33343387        }
     
    33383391    if (cb == 2)
    33393392    {
    3340         *pu32 = vbe_ioport_read_index(PDMINS_2_DATA(pDevIns, PVGASTATE), Port);
     3393        *pu32 = vbe_ioport_read_index(s, Port);
     3394        PDMCritSectLeave(&s->lock);
    33413395        return VINF_SUCCESS;
    33423396    }
     3397    PDMCritSectLeave(&s->lock);
    33433398    AssertMsgFailed(("vgaIOPortReadVBEIndex: Port=%#x cb=%d\n", Port, cb));
    33443399    return VERR_IOM_IOPORT_UNUSED;
     
    33843439 *
    33853440 * @returns VBox status code.
    3386  * @param   pDevIns     Pointer device instance.
     3441 * @param   pThis       VGA device structure
    33873442 * @param   pvUser      User argument - ignored.
    33883443 * @param   GCPhysAddr  Physical address of memory to write.
     
    33913446 * @param   cItems      Number of data items to write.
    33923447 */
    3393 PDMBOTHCBDECL(int) vgaMMIOFill(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, uint32_t u32Item, unsigned cbItem, unsigned cItems)
    3394 {
    3395     PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3448static int vgaInternalMMIOFill(PVGASTATE pThis, void *pvUser, RTGCPHYS GCPhysAddr, uint32_t u32Item, unsigned cbItem, unsigned cItems)
     3449{
    33963450    uint32_t b;
    33973451    uint32_t write_mask, bit_mask, set_mask;
     
    33993453    unsigned i;
    34003454    NOREF(pvUser);
     3455
    34013456    for (i = 0; i < cbItem; i++)
    34023457    {
     
    35583613    return VINF_SUCCESS;
    35593614}
     3615
     3616/**
     3617 * Legacy VGA memory (0xa0000 - 0xbffff) write hook, to be called from IOM and from the inside of VGADeviceGC.cpp.
     3618 * This is the advanced version of vga_mem_writeb function.
     3619 *
     3620 * @returns VBox status code.
     3621 * @param   pDevIns     Pointer device instance.
     3622 * @param   pvUser      User argument - ignored.
     3623 * @param   GCPhysAddr  Physical address of memory to write.
     3624 * @param   u32Item     Data to write, up to 4 bytes.
     3625 * @param   cbItem      Size of data Item, only 1/2/4 bytes is allowed for now.
     3626 * @param   cItems      Number of data items to write.
     3627 */
     3628PDMBOTHCBDECL(int) vgaMMIOFill(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, uint32_t u32Item, unsigned cbItem, unsigned cItems)
     3629{
     3630    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3631
     3632    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_MMIO_WRITE);
     3633    if (rc != VINF_SUCCESS)
     3634        return rc;
     3635
     3636    rc = vgaInternalMMIOFill(pThis, pvUser, GCPhysAddr, u32Item, cbItem, cItems);
     3637    PDMCritSectLeave(&pThis->lock);
     3638    return rc;
     3639}
    35603640#undef APPLY_LOGICAL_AND_MASK
    35613641
     
    35753655    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
    35763656    STAM_PROFILE_START(&pThis->CTX_MID_Z(Stat,MemoryRead), a);
    3577     int rc = VINF_SUCCESS;
    35783657    NOREF(pvUser);
     3658
     3659    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_MMIO_READ);
     3660    if (rc != VINF_SUCCESS)
     3661        return rc;
     3662
    35793663    switch (cb)
    35803664    {
     
    36153699    }
    36163700    STAM_PROFILE_STOP(&pThis->CTX_MID_Z(Stat,MemoryRead), a);
     3701    PDMCritSectLeave(&pThis->lock);
    36173702    return rc;
    36183703}
     
    36323717    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
    36333718    uint8_t  *pu8 = (uint8_t *)pv;
    3634     int rc = VINF_SUCCESS;
    36353719    STAM_PROFILE_START(&pThis->CTX_MID_Z(Stat,MemoryWrite), a);
     3720
     3721    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_MMIO_WRITE);
     3722    if (rc != VINF_SUCCESS)
     3723        return rc;
    36363724
    36373725    switch (cb)
     
    36903778    }
    36913779    STAM_PROFILE_STOP(&pThis->CTX_MID_Z(Stat,MemoryWrite), a);
     3780    PDMCritSectLeave(&pThis->lock);
    36923781    return rc;
    36933782}
     
    37043793static int vgaLFBAccess(PVM pVM, PVGASTATE pThis, RTGCPHYS GCPhys, RTGCPTR GCPtr)
    37053794{
    3706     int rc;
     3795    int rc = PDMCritSectEnter(&pThis->lock, VINF_EM_RAW_EMULATE_INSTR);
     3796    if (rc != VINF_SUCCESS)
     3797        return rc;
    37073798
    37083799    /*
     
    37233814        rc = PGMShwModifyPage(PDMDevHlpGetVMCPU(pThis->CTX_SUFF(pDevIns)), GCPtr, 1, X86_PTE_RW, ~(uint64_t)X86_PTE_RW);
    37243815        if (RT_SUCCESS(rc))
     3816        {
     3817            PDMCritSectLeave(&pThis->lock);
    37253818            return VINF_SUCCESS;
     3819        }
    37263820        else
    37273821            AssertMsgFailed(("PGMShwModifyPage -> rc=%d\n", rc));
    37283822#else /* IN_RING3 : We don't have any virtual page address of the access here. */
    37293823        Assert(GCPtr == 0);
     3824        PDMCritSectLeave(&pThis->lock);
    37303825        return VINF_SUCCESS;
    37313826#endif
     
    37343829        AssertMsgFailed(("PGMHandlerPhysicalPageTempOff -> rc=%d\n", rc));
    37353830
     3831    PDMCritSectLeave(&pThis->lock);
    37363832    return rc;
    37373833}
     
    38493945{
    38503946    static int lastWasNotNewline = 0;  /* We are only called in a single-threaded way */
     3947    PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
     3948
     3949    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_IOPORT_WRITE);
     3950    if (rc != VINF_SUCCESS)
     3951        return rc;
     3952
    38513953    /*
    38523954     * VGA BIOS char printing.
     
    38743976            lastWasNotNewline = 1;
    38753977#endif
     3978        PDMCritSectLeave(&pThis->lock);
    38763979        return VINF_SUCCESS;
    38773980    }
    38783981
     3982    PDMCritSectLeave(&pThis->lock);
    38793983    /* not in use. */
    3880     return VINF_SUCCESS;
     3984    return VERR_IOM_IOPORT_UNUSED;
    38813985}
    38823986
     
    39044008    NOREF(Port);
    39054009
     4010    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_IOPORT_WRITE);
     4011    if (rc != VINF_SUCCESS)
     4012        return rc;
     4013
    39064014    if (cb == 2)
    39074015    {
    39084016        Log(("vbeIOPortWriteVBEExtra: addr=%#RX32\n", u32));
    39094017        pThis->u16VBEExtraAddress = u32;
    3910         return VINF_SUCCESS;
    3911     }
     4018    }
     4019    PDMCritSectLeave(&pThis->lock);
    39124020
    39134021    Log(("vbeIOPortWriteVBEExtra: Ignoring invalid cb=%d writes to the VBE Extra port!!!\n", cb));
     
    39334041    NOREF(Port);
    39344042
     4043    int rc = PDMCritSectEnter(&pThis->lock, VINF_IOM_HC_IOPORT_READ);
     4044    if (rc != VINF_SUCCESS)
     4045        return rc;
     4046
    39354047    if (pThis->u16VBEExtraAddress == 0xffff)
    39364048    {
    39374049        Log(("vbeIOPortReadVBEExtra: Requested number of 64k video banks\n"));
    39384050        *pu32 = pThis->vram_size / _64K;
    3939         return VINF_SUCCESS;
    3940     }
    3941 
     4051        rc = VINF_SUCCESS;
     4052    }
     4053    else
    39424054    if (    pThis->u16VBEExtraAddress >= pThis->cbVBEExtraData
    39434055        ||  pThis->u16VBEExtraAddress + cb > pThis->cbVBEExtraData)
     
    39464058        Log(("vbeIOPortReadVBEExtra: Requested address is out of VBE data!!! Address=%#x(%d) cbVBEExtraData=%#x(%d)\n",
    39474059             pThis->u16VBEExtraAddress, pThis->u16VBEExtraAddress, pThis->cbVBEExtraData, pThis->cbVBEExtraData));
    3948         return VINF_SUCCESS;
    3949     }
    3950 
     4060        rc = VINF_SUCCESS;
     4061    }
     4062    else
    39514063    if (cb == 1)
    39524064    {
     
    39544066
    39554067        Log(("vbeIOPortReadVBEExtra: cb=%#x %.*Rhxs\n", cb, cb, pu32));
    3956         return VINF_SUCCESS;
    3957     }
    3958 
     4068        rc = VINF_SUCCESS;
     4069    }
     4070    else
    39594071    if (cb == 2)
    39604072    {
     
    39634075
    39644076        Log(("vbeIOPortReadVBEExtra: cb=%#x %.*Rhxs\n", cb, cb, pu32));
    3965         return VINF_SUCCESS;
    3966     }
     4077        rc = VINF_SUCCESS;
     4078    }
     4079    else
     4080        rc = VERR_IOM_IOPORT_UNUSED;
     4081
    39674082    Log(("vbeIOPortReadVBEExtra: Invalid cb=%d read from the VBE Extra port!!!\n", cb));
    3968     return VERR_IOM_IOPORT_UNUSED;
     4083    PDMCritSectLeave(&pThis->lock);
     4084    return rc;
    39694085}
    39704086# endif /* VBE_NEW_DYN_LIST */
     
    46334749    PPDMDEVINS pDevIns = pThis->CTX_SUFF(pDevIns);
    46344750
     4751    int rc = PDMCritSectEnter(&pThis->lock, VERR_SEM_BUSY);
     4752    AssertRC(rc);
     4753
    46354754#ifndef VBOX_WITH_HGSMI
    46364755    /* This should be called only in non VBVA mode. */
     
    46384757    if (VBVAUpdateDisplay (pThis) == VINF_SUCCESS)
    46394758    {
     4759        PDMCritSectLeave(&pThis->lock);
    46404760        return VINF_SUCCESS;
    46414761    }
    46424762#endif /* VBOX_WITH_HGSMI */
    46434763
    4644     int rc = vga_update_display(pThis, false);
     4764    rc = vga_update_display(pThis, false);
    46454765    if (rc != VINF_SUCCESS)
     4766    {
     4767        PDMCritSectLeave(&pThis->lock);
    46464768        return rc;
     4769    }
    46474770
    46484771    if (pThis->fHasDirtyBits && pThis->GCPhysVRAM && pThis->GCPhysVRAM != NIL_RTGCPHYS32)
     
    46564779        pThis->fRemappedVGA = false;
    46574780    }
    4658 
     4781    PDMCritSectLeave(&pThis->lock);
    46594782    return VINF_SUCCESS;
    46604783}
     
    46794802#endif /* DEBUG_sunlover */
    46804803
     4804    int rc = PDMCritSectEnter(&pThis->lock, VERR_SEM_BUSY);
     4805    AssertRC(rc);
     4806
    46814807    pThis->graphic_mode = -1; /* force full update */
    46824808
    4683     int rc = vga_update_display(pThis, true);
     4809    rc = vga_update_display(pThis, true);
    46844810
    46854811    /* The dirty bits array has been just cleared, reset handlers as well. */
     
    46934819        pThis->fRemappedVGA = false;
    46944820    }
    4695 
     4821    PDMCritSectLeave(&pThis->lock);
    46964822    return rc;
    46974823}
     
    50775203    if (pThis->pDrv)
    50785204        pThis->pDrv->pfnRefresh(pThis->pDrv);
     5205
    50795206    if (pThis->cMilliesRefreshInterval)
    50805207        TMTimerSetMillies(pTimer, pThis->cMilliesRefreshInterval);
     
    57805907        return rc;
    57815908
     5909    /* Initialize the PDM lock. */
     5910    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->lock, "VGA");
     5911    if (RT_FAILURE(rc))
     5912    {
     5913        Log(("%s: Failed to create critical section.\n", __FUNCTION__));
     5914        return rc;
     5915    }
     5916
    57825917    /*
    57835918     * Create the refresh timer.
     
    58175952     * Allocate and initialize buffer for the VBE BIOS Extra Data.
    58185953     */
    5819     pThis->cbVBEExtraData = sizeof(VBEHEADER) + cb;
     5954    AssertRelease(sizeof(VBEHEADER) + cb < 65536);
     5955    pThis->cbVBEExtraData = (uint16_t)(sizeof(VBEHEADER) + cb);
    58205956    pThis->pu8VBEExtraData = (uint8_t *)PDMDevHlpMMHeapAllocZ(pDevIns, pThis->cbVBEExtraData);
    58215957    if (!pThis->pu8VBEExtraData)
     
    62016337#endif
    62026338
     6339    PDMR3CritSectDelete(&pThis->lock);
    62036340    return VINF_SUCCESS;
    62046341}
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r19844 r20444  
    305305    PPDMDEVINSR0                pDevInsR0;
    306306
     307    /** The critical section. */
     308    PDMCRITSECT                 lock;
     309
    307310    /** The display port base interface. */
    308311    PDMIBASE                    Base;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette