Changeset 82064 in vbox
- Timestamp:
- Nov 21, 2019 8:15:31 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134870
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r82062 r82064 120 120 #include <VBox/vmm/pdmdev.h> 121 121 #include <VBox/vmm/pgm.h> 122 #include <VBox/AssertGuest.h> 122 123 #ifdef IN_RING3 123 124 # include <VBox/vmm/cpum.h> … … 1012 1013 } 1013 1014 1014 static intvbe_ioport_write_data(PVGASTATE pThis, uint32_t addr, uint32_t val)1015 static VBOXSTRICTRC vbe_ioport_write_data(PVGASTATE pThis, uint32_t addr, uint32_t val) 1015 1016 { 1016 1017 uint32_t max_bank; … … 1180 1181 */ 1181 1182 pThis->pDrv->pfnLFBModeChange(pThis->pDrv, (val & VBE_DISPI_ENABLED) != 0); 1182 # ifdef VBOX_WITH_HGSMI1183 # ifdef VBOX_WITH_HGSMI 1183 1184 VBVAOnVBEChanged(pThis); 1184 # endif /* VBOX_WITH_HGSMI */1185 # endif 1185 1186 1186 1187 /* The VGA region is (could be) affected by this change; reset all aliases we've created. */ … … 1207 1208 /* Changes in the VGA device are minimal. The device is bypassed. The driver does all work. */ 1208 1209 if (val == VBOX_VIDEO_DISABLE_ADAPTER_MEMORY) 1209 {1210 1210 pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, NULL, 0); 1211 }1212 1211 else if (val == VBOX_VIDEO_INTERPRET_ADAPTER_MEMORY) 1213 {1214 1212 pThis->pDrv->pfnProcessAdapterData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), pThis->vram_size); 1215 }1216 1213 else if ((val & 0xFFFF0000) == VBOX_VIDEO_INTERPRET_DISPLAY_MEMORY_BASE) 1217 {1218 1214 pThis->pDrv->pfnProcessDisplayData(pThis->pDrv, pThis->CTX_SUFF(vram_ptr), val & 0xFFFF); 1219 }1220 1215 #endif /* IN_RING3 */ 1221 1216 break; … … 1226 1221 break; 1227 1222 } 1223 1228 1224 if (fRecalculate) 1229 {1230 1225 recalculate_data(pThis); 1231 }1232 1226 } 1233 1227 return VINF_SUCCESS; … … 3105 3099 3106 3100 /** 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 */ 3103 static DECLCALLBACK(VBOXSTRICTRC) 3104 vgaIoPortWriteVbeData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 3110 3105 { 3111 3106 PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); … … 3121 3116 || pThis->vbe_index == VBE_DISPI_INDEX_VBOX_VIDEO) 3122 3117 { 3123 Log(("vgaI OPortWriteVBEData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n"));3118 Log(("vgaIoPortWriteVbeData: VBE_DISPI_INDEX_ENABLE - Switching to host...\n")); 3124 3119 return VINF_IOM_R3_IOPORT_WRITE; 3125 3120 } … … 3134 3129 { 3135 3130 pThis->fWriteVBEData = false; 3136 return vbe_ioport_write_data(pThis, Port, u32 & 0xFF);3131 return vbe_ioport_write_data(pThis, offPort, u32 & 0xFF); 3137 3132 } 3138 3133 … … 3148 3143 #endif 3149 3144 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)); 3167 3147 3168 3148 return VINF_SUCCESS; … … 3171 3151 3172 3152 /** 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 */ 3155 static DECLCALLBACK(VBOXSTRICTRC) 3156 vgaIoPortWriteVbeIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 3176 3157 { 3177 3158 PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser); … … 3188 3169 } 3189 3170 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)); 3191 3172 return VINF_SUCCESS; 3192 3173 } … … 3194 3175 3195 3176 if (cb == 2) 3196 vbe_ioport_write_index(pThis, Port, u32);3177 vbe_ioport_write_index(pThis, offPort, u32); 3197 3178 else 3198 A ssertMsgFailed(("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)); 3199 3180 return VINF_SUCCESS; 3200 3181 } … … 3202 3183 3203 3184 /** 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 */ 3187 static DECLCALLBACK(VBOXSTRICTRC) 3188 vgaIoPortReadVbeData(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 3207 3189 { 3208 3190 PVGASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVGASTATE); NOREF(pvUser); … … 3214 3196 if (!pThis->fReadVBEData) 3215 3197 { 3216 *pu32 = (vbe_ioport_read_data(pThis, Port) >> 8) & 0xFF;3198 *pu32 = (vbe_ioport_read_data(pThis, offPort) >> 8) & 0xFF; 3217 3199 pThis->fReadVBEData = true; 3218 3200 return VINF_SUCCESS; 3219 3201 } 3220 *pu32 = vbe_ioport_read_data(pThis, Port) & 0xFF;3202 *pu32 = vbe_ioport_read_data(pThis, offPort) & 0xFF; 3221 3203 pThis->fReadVBEData = false; 3222 3204 return VINF_SUCCESS; … … 3225 3207 if (cb == 2) 3226 3208 { 3227 *pu32 = vbe_ioport_read_data(pThis, Port);3209 *pu32 = vbe_ioport_read_data(pThis, offPort); 3228 3210 return VINF_SUCCESS; 3229 3211 } … … 3231 3213 { 3232 3214 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. */ 3234 3216 else 3235 3217 *pu32 = pThis->vram_size; /* Quick hack for getting the vram size. */ 3236 3218 return VINF_SUCCESS; 3237 3219 } 3238 AssertMsgFailed(("vgaI OPortReadVBEData: Port=%#x cb=%d\n",Port, cb));3220 AssertMsgFailed(("vgaIoPortReadVbeData: offPort=%#x cb=%d\n", offPort, cb)); 3239 3221 return VERR_IOM_IOPORT_UNUSED; 3240 3222 } … … 3242 3224 3243 3225 /** 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 */ 3228 static DECLCALLBACK(VBOXSTRICTRC) 3229 vgaIoPortReadVbeIndex(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 3247 3230 { 3248 3231 NOREF(pvUser); … … 3255 3238 if (!pThis->fReadVBEIndex) 3256 3239 { 3257 *pu32 = (vbe_ioport_read_index(pThis, Port) >> 8) & 0xFF;3240 *pu32 = (vbe_ioport_read_index(pThis, offPort) >> 8) & 0xFF; 3258 3241 pThis->fReadVBEIndex = true; 3259 3242 return VINF_SUCCESS; 3260 3243 } 3261 *pu32 = vbe_ioport_read_index(pThis, Port) & 0xFF;3244 *pu32 = vbe_ioport_read_index(pThis, offPort) & 0xFF; 3262 3245 pThis->fReadVBEIndex = false; 3263 3246 return VINF_SUCCESS; … … 3266 3249 if (cb == 2) 3267 3250 { 3268 *pu32 = vbe_ioport_read_index(pThis, Port);3251 *pu32 = vbe_ioport_read_index(pThis, offPort); 3269 3252 return VINF_SUCCESS; 3270 3253 } 3271 AssertMsgFailed(("vgaI OPortReadVBEIndex: Port=%#x cb=%d\n",Port, cb));3254 AssertMsgFailed(("vgaIoPortReadVbeIndex: offPort=%#x cb=%d\n", offPort, cb)); 3272 3255 return VERR_IOM_IOPORT_UNUSED; 3273 3256 } … … 6771 6754 REG_PORT(0x3da, 1, vgaIoPortCgaFcrWrite, vgaIoPortCgaStRead, "CGA Feature / status", &pThis->hIoPortCgaFcrSt); 6772 6755 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 6773 6761 #ifdef VBOX_WITH_HGSMI 6774 6762 /* Use reserved VGA IO ports for HGSMI. */ … … 6779 6767 #endif /* VBOX_WITH_HGSMI */ 6780 6768 6781 #ifdef CONFIG_BOCHS_VBE6782 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 6788 6769 #undef REG_PORT 6789 6790 /* guest context extension */6791 if (pDevIns->fRCEnabled)6792 {6793 #ifdef CONFIG_BOCHS_VBE6794 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_VBE6807 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 }6815 6770 6816 6771 /* vga mmio */ … … 7448 7403 AssertRCReturn(rc, rc); 7449 7404 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 */ 7450 7409 #define REG_PORT(a_uPort, a_cPorts, a_pfnWrite, a_pfnRead, a_szDesc, a_hIoPort) do { \ 7451 7410 rc = PDMDevHlpIoPortSetUpContext(pDevIns, a_hIoPort, a_pfnWrite, a_pfnRead, NULL /*pvUser*/); \ … … 7465 7424 REG_PORT(0x3d4, 2, vgaIoPortCgaCrtWrite, vgaIoPortCgaCrtRead, "CGA CRT control", pThis->hIoPortCgaCrt); 7466 7425 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 */ 7467 7431 7468 7432 #undef REG_PORT -
trunk/src/VBox/Devices/Graphics/DevVGA.h
r82062 r82064 516 516 /** @} */ 517 517 518 /** @name I/O ports for Boch VBE 0x1ce-0x1cf 519 * @{ */ 520 IOMIOPORTHANDLE hIoPortVbeIndex; 521 IOMIOPORTHANDLE hIoPortVbeData; 522 /** @} */ 523 518 524 /** The VBE extra data I/O port. */ 519 525 IOMIOPORTHANDLE hIoPortVbeExtra;
Note:
See TracChangeset
for help on using the changeset viewer.