VirtualBox

Changeset 82064 in vbox


Ignore:
Timestamp:
Nov 21, 2019 8:15:31 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134870
Message:

DevVGA: Converting more I/O ports. bugref:9218

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

Legend:

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

    r82062 r82064  
    120120#include <VBox/vmm/pdmdev.h>
    121121#include <VBox/vmm/pgm.h>
     122#include <VBox/AssertGuest.h>
    122123#ifdef IN_RING3
    123124# include <VBox/vmm/cpum.h>
     
    10121013}
    10131014
    1014 static int vbe_ioport_write_data(PVGASTATE pThis, uint32_t addr, uint32_t val)
     1015static VBOXSTRICTRC vbe_ioport_write_data(PVGASTATE pThis, uint32_t addr, uint32_t val)
    10151016{
    10161017    uint32_t max_bank;
     
    11801181             */
    11811182            pThis->pDrv->pfnLFBModeChange(pThis->pDrv, (val & VBE_DISPI_ENABLED) != 0);
    1182 #ifdef VBOX_WITH_HGSMI
     1183# ifdef VBOX_WITH_HGSMI
    11831184            VBVAOnVBEChanged(pThis);
    1184 #endif /* VBOX_WITH_HGSMI */
     1185# endif
    11851186
    11861187            /* The VGA region is (could be) affected by this change; reset all aliases we've created. */
     
    12071208            /* Changes in the VGA device are minimal. The device is bypassed. The driver does all work. */
    12081209            if (val == VBOX_VIDEO_DISABLE_ADAPTER_MEMORY)
    1209             {
    12101210                pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, NULL, 0);
    1211             }
    12121211            else if (val == VBOX_VIDEO_INTERPRET_ADAPTER_MEMORY)
    1213             {
    12141212                pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), pThis->vram_size);
    1215             }
    12161213            else if ((val & 0xFFFF0000) == VBOX_VIDEO_INTERPRET_DISPLAY_MEMORY_BASE)
    1217             {
    12181214                pThis->pDrv->pfnProcessDisplayData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), val & 0xFFFF);
    1219             }
    12201215#endif /* IN_RING3 */
    12211216            break;
     
    12261221            break;
    12271222        }
     1223
    12281224        if (fRecalculate)
    1229         {
    12301225            recalculate_data(pThis);
    1231         }
    12321226    }
    12331227    return VINF_SUCCESS;
     
    31053099
    31063100/**
    3107  * @callback_method_impl{FNIOMIOPORTOUT,VBE Data Port OUT handler.}
    3108  */
    3109 PDMBOTHCBDECL(int) vgaIOPortWriteVBEData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
     3101 * @callback_method_impl{FNIOMIOPORTNEWOUT,VBE Data Port OUT handler (0x1ce).}
     3102 */
     3103static DECLCALLBACK(VBOXSTRICTRC)
     3104vgaIoPortWriteVbeData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
    31103105{
    31113106    PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE);
     
    31213116        ||  pThis->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO)
    31223117    {
    3123         Log(("vgaIOPortWriteVBEData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n"));
     3118        Log(("vgaIoPortWriteVbeData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n"));
    31243119        return VINF_IOM_R3_IOPORT_WRITE;
    31253120    }
     
    31343129            {
    31353130                pThis->fWriteVBEData = false;
    3136                 return vbe_ioport_write_data(pThis, Port, u32 & 0xFF);
     3131                return vbe_ioport_write_data(pThis, offPort, u32 & 0xFF);
    31373132            }
    31383133
     
    31483143#endif
    31493144    if (cb == 2 || cb == 4)
    3150     {
    3151 //#ifdef IN_RC
    3152 //        /*
    3153 //         * The VBE_DISPI_INDEX_ENABLE memsets the entire frame buffer.
    3154 //         * Since we're not mapping the entire framebuffer any longer that
    3155 //         * has to be done on the host.
    3156 //         */
    3157 //        if (    (pThis->vbe_index == VBE_DISPI_INDEX_ENABLE)
    3158 //            &&  (u32 & VBE_DISPI_ENABLED))
    3159 //        {
    3160 //            Log(("vgaIOPortWriteVBEData: VBE_DISPI_INDEX_ENABLE & VBE_DISPI_ENABLED - Switching to host...\n"));
    3161 //            return VINF_IOM_R3_IOPORT_WRITE;
    3162 //        }
    3163 //#endif
    3164         return vbe_ioport_write_data(pThis, Port, u32);
    3165     }
    3166     AssertMsgFailed(("vgaIOPortWriteVBEData: Port=%#x cb=%d u32=%#x\n", Port, cb, u32));
     3145        return vbe_ioport_write_data(pThis, offPort, u32);
     3146    AssertMsgFailed(("vgaIoPortWriteVbeData: offPort=%#x cb=%d u32=%#x\n", offPort, cb, u32));
    31673147
    31683148    return VINF_SUCCESS;
     
    31713151
    31723152/**
    3173  * @callback_method_impl{FNIOMIOPORTOUT,VBE Index Port OUT handler.}
    3174  */
    3175 PDMBOTHCBDECL(int) vgaIOPortWriteVBEIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
     3153 * @callback_method_impl{FNIOMIOPORTNEWOUT,VBE Index Port OUT handler (0x1ce).}
     3154 */
     3155static DECLCALLBACK(VBOXSTRICTRC)
     3156vgaIoPortWriteVbeIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
    31763157{
    31773158    PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser);
     
    31883169        }
    31893170        pThis->fWriteVBEIndex = false;
    3190         vbe_ioport_write_index(pThis, Port, (pThis->cbWriteVBEIndex << 8) | (u32 & 0x00FF));
     3171        vbe_ioport_write_index(pThis, offPort, (pThis->cbWriteVBEIndex << 8) | (u32 & 0x00FF));
    31913172        return VINF_SUCCESS;
    31923173    }
     
    31943175
    31953176    if (cb == 2)
    3196         vbe_ioport_write_index(pThis, Port, u32);
     3177        vbe_ioport_write_index(pThis, offPort, u32);
    31973178    else
    3198         AssertMsgFailed(("vgaIOPortWriteVBEIndex: Port=%#x cb=%d u32=%#x\n", Port, cb, u32));
     3179        ASSERT_GUEST_MSG_FAILED(("vgaIoPortWriteVbeIndex: offPort=%#x cb=%d u32=%#x\n", offPort, cb, u32));
    31993180    return VINF_SUCCESS;
    32003181}
     
    32023183
    32033184/**
    3204  * @callback_method_impl{FNIOMIOPORTOUT,VBE Data Port IN handler.}
    3205  */
    3206 PDMBOTHCBDECL(int) vgaIOPortReadVBEData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
     3185 * @callback_method_impl{FNIOMIOPORTNEWOUT,VBE Data Port IN handler (0x1cf).}
     3186 */
     3187static DECLCALLBACK(VBOXSTRICTRC)
     3188vgaIoPortReadVbeData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
    32073189{
    32083190    PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser);
     
    32143196        if (!pThis->fReadVBEData)
    32153197        {
    3216             *pu32 = (vbe_ioport_read_data(pThis, Port) >> 8) & 0xFF;
     3198            *pu32 = (vbe_ioport_read_data(pThis, offPort) >> 8) & 0xFF;
    32173199            pThis->fReadVBEData = true;
    32183200            return VINF_SUCCESS;
    32193201        }
    3220         *pu32 = vbe_ioport_read_data(pThis, Port) & 0xFF;
     3202        *pu32 = vbe_ioport_read_data(pThis, offPort) & 0xFF;
    32213203        pThis->fReadVBEData = false;
    32223204        return VINF_SUCCESS;
     
    32253207    if (cb == 2)
    32263208    {
    3227         *pu32 = vbe_ioport_read_data(pThis, Port);
     3209        *pu32 = vbe_ioport_read_data(pThis, offPort);
    32283210        return VINF_SUCCESS;
    32293211    }
     
    32313213    {
    32323214        if (pThis->vbe_regs[VBE_DISPI_INDEX_ID] == VBE_DISPI_ID_CFG)
    3233             *pu32 = vbe_ioport_read_data(pThis, Port); /* New interface. */
     3215            *pu32 = vbe_ioport_read_data(pThis, offPort); /* New interface. */
    32343216        else
    32353217            *pu32 = pThis->vram_size; /* Quick hack for getting the vram size. */
    32363218        return VINF_SUCCESS;
    32373219    }
    3238     AssertMsgFailed(("vgaIOPortReadVBEData: Port=%#x cb=%d\n", Port, cb));
     3220    AssertMsgFailed(("vgaIoPortReadVbeData: offPort=%#x cb=%d\n", offPort, cb));
    32393221    return VERR_IOM_IOPORT_UNUSED;
    32403222}
     
    32423224
    32433225/**
    3244  * @callback_method_impl{FNIOMIOPORTOUT,VBE Index Port IN handler.}
    3245  */
    3246 PDMBOTHCBDECL(int) vgaIOPortReadVBEIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
     3226 * @callback_method_impl{FNIOMIOPORTNEWOUT,VBE Index Port IN handler (0x1cf).}
     3227 */
     3228static DECLCALLBACK(VBOXSTRICTRC)
     3229vgaIoPortReadVbeIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
    32473230{
    32483231    NOREF(pvUser);
     
    32553238        if (!pThis->fReadVBEIndex)
    32563239        {
    3257             *pu32 = (vbe_ioport_read_index(pThis, Port) >> 8) & 0xFF;
     3240            *pu32 = (vbe_ioport_read_index(pThis, offPort) >> 8) & 0xFF;
    32583241            pThis->fReadVBEIndex = true;
    32593242            return VINF_SUCCESS;
    32603243        }
    3261         *pu32 = vbe_ioport_read_index(pThis, Port) & 0xFF;
     3244        *pu32 = vbe_ioport_read_index(pThis, offPort) & 0xFF;
    32623245        pThis->fReadVBEIndex = false;
    32633246        return VINF_SUCCESS;
     
    32663249    if (cb == 2)
    32673250    {
    3268         *pu32 = vbe_ioport_read_index(pThis, Port);
     3251        *pu32 = vbe_ioport_read_index(pThis, offPort);
    32693252        return VINF_SUCCESS;
    32703253    }
    3271     AssertMsgFailed(("vgaIOPortReadVBEIndex: Port=%#x cb=%d\n", Port, cb));
     3254    AssertMsgFailed(("vgaIoPortReadVbeIndex: offPort=%#x cb=%d\n", offPort, cb));
    32723255    return VERR_IOM_IOPORT_UNUSED;
    32733256}
     
    67716754    REG_PORT(0x3da,  1, vgaIoPortCgaFcrWrite,   vgaIoPortCgaStRead,     "CGA Feature / status",     &pThis->hIoPortCgaFcrSt);
    67726755
     6756#ifdef CONFIG_BOCHS_VBE
     6757    REG_PORT(0x1ce,  1, vgaIoPortWriteVbeIndex, vgaIoPortReadVbeIndex,  "VBE Index",                &pThis->hIoPortVbeIndex);
     6758    REG_PORT(0x1cf,  1, vgaIoPortWriteVbeData,  vgaIoPortReadVbeData,   "VBE Data",                 &pThis->hIoPortVbeData);
     6759#endif /* CONFIG_BOCHS_VBE */
     6760
    67736761#ifdef VBOX_WITH_HGSMI
    67746762    /* Use reserved VGA IO ports for HGSMI. */
     
    67796767#endif /* VBOX_WITH_HGSMI */
    67806768
    6781 #ifdef CONFIG_BOCHS_VBE
    6782     rc = PDMDevHlpIOPortRegister(pDevIns,  0x1ce,  1, NULL, vgaIOPortWriteVBEIndex, vgaIOPortReadVBEIndex, NULL, NULL, "VGA/VBE - Index");
    6783     AssertRCReturn(rc, rc);
    6784     rc = PDMDevHlpIOPortRegister(pDevIns,  0x1cf,  1, NULL, vgaIOPortWriteVBEData, vgaIOPortReadVBEData, NULL, NULL, "VGA/VBE - Data");
    6785     AssertRCReturn(rc, rc);
    6786 #endif /* CONFIG_BOCHS_VBE */
    6787 
    67886769#undef REG_PORT
    6789 
    6790     /* guest context extension */
    6791     if (pDevIns->fRCEnabled)
    6792     {
    6793 #ifdef CONFIG_BOCHS_VBE
    6794         rc = PDMDevHlpIOPortRegisterRC(pDevIns,  0x1ce,  1, 0, "vgaIOPortWriteVBEIndex", "vgaIOPortReadVBEIndex", NULL, NULL, "VGA/VBE - Index (GC)");
    6795         if (RT_FAILURE(rc))
    6796             return rc;
    6797         rc = PDMDevHlpIOPortRegisterRC(pDevIns,  0x1cf,  1, 0, "vgaIOPortWriteVBEData", "vgaIOPortReadVBEData", NULL, NULL, "VGA/VBE - Data (GC)");
    6798         if (RT_FAILURE(rc))
    6799             return rc;
    6800 #endif /* CONFIG_BOCHS_VBE */
    6801     }
    6802 
    6803     /* R0 context extension */
    6804     if (pDevIns->fR0Enabled)
    6805     {
    6806 #ifdef CONFIG_BOCHS_VBE
    6807         rc = PDMDevHlpIOPortRegisterR0(pDevIns,  0x1ce,  1, 0, "vgaIOPortWriteVBEIndex", "vgaIOPortReadVBEIndex", NULL, NULL, "VGA/VBE - Index (GC)");
    6808         if (RT_FAILURE(rc))
    6809             return rc;
    6810         rc = PDMDevHlpIOPortRegisterR0(pDevIns,  0x1cf,  1, 0, "vgaIOPortWriteVBEData", "vgaIOPortReadVBEData", NULL, NULL, "VGA/VBE - Data (GC)");
    6811         if (RT_FAILURE(rc))
    6812             return rc;
    6813 #endif /* CONFIG_BOCHS_VBE */
    6814     }
    68156770
    68166771    /* vga mmio */
     
    74487403    AssertRCReturn(rc, rc);
    74497404
     7405    /*
     7406     * Set I/O port callbacks for this context.
     7407     * We just copy the ring-3 registration bits and remove the '&' before the handle.
     7408     */
    74507409#define REG_PORT(a_uPort, a_cPorts, a_pfnWrite, a_pfnRead, a_szDesc, a_hIoPort) do { \
    74517410            rc = PDMDevHlpIoPortSetUpContext(pDevIns, a_hIoPort, a_pfnWrite, a_pfnRead, NULL /*pvUser*/); \
     
    74657424    REG_PORT(0x3d4,  2, vgaIoPortCgaCrtWrite,   vgaIoPortCgaCrtRead,    "CGA CRT control",          pThis->hIoPortCgaCrt);
    74667425    REG_PORT(0x3da,  1, vgaIoPortCgaFcrWrite,   vgaIoPortCgaStRead,     "CGA Feature / status",     pThis->hIoPortCgaFcrSt);
     7426
     7427# ifdef CONFIG_BOCHS_VBE
     7428    REG_PORT(0x1ce,  1, vgaIoPortWriteVbeIndex, vgaIoPortReadVbeIndex,  "VBE Index",                pThis->hIoPortVbeIndex);
     7429    REG_PORT(0x1cf,  1, vgaIoPortWriteVbeData,  vgaIoPortReadVbeData,   "VBE Data",                 pThis->hIoPortVbeData);
     7430# endif /* CONFIG_BOCHS_VBE */
    74677431
    74687432#undef REG_PORT
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r82062 r82064  
    516516    /** @} */
    517517
     518    /** @name I/O ports for Boch VBE 0x1ce-0x1cf
     519     *  @{ */
     520    IOMIOPORTHANDLE             hIoPortVbeIndex;
     521    IOMIOPORTHANDLE             hIoPortVbeData;
     522    /** @} */
     523
    518524    /** The VBE extra data I/O port. */
    519525    IOMIOPORTHANDLE             hIoPortVbeExtra;
Note: See TracChangeset for help on using the changeset viewer.

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