Changeset 81979 in vbox
- Timestamp:
- Nov 19, 2019 9:55:09 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134777
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevDMA.cpp
r81591 r81979 130 130 /* Complete DMA state information. */ 131 131 typedef struct { 132 DMAControl DMAC[2]; /* Two DMA controllers. */ 132 133 PPDMDEVINSR3 pDevIns; /* Device instance. */ 133 134 R3PTRTYPE(PCPDMDMACHLP) pHlp; /* PDM DMA helpers. */ 134 DMAControl DMAC[2]; /* Two DMA controllers. */ 135 bool fRZEnabled; 136 uint8_t abPadding[7]; 137 } DMAState; 135 } DMAState, DMASTATE; 136 /** Pointer to the shared DMA state information. */ 137 typedef DMASTATE *PDMASTATE; 138 138 139 139 /* DMA command register bits. */ … … 638 638 static DECLCALLBACK(bool) dmaRun(PPDMDEVINS pDevIns) 639 639 { 640 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);640 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 641 641 DMAControl *dc; 642 642 int ctlidx, chidx, mask; … … 670 670 PFNDMATRANSFERHANDLER pfnTransferHandler, void *pvUser) 671 671 { 672 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);672 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 673 673 DMAChannel *ch = &pThis->DMAC[DMACH2C(uChannel)].ChState[uChannel & 3]; 674 674 … … 721 721 void *pvBuffer, uint32_t off, uint32_t cbBlock) 722 722 { 723 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);723 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 724 724 DMAControl *dc = &pThis->DMAC[DMACH2C(uChannel)]; 725 725 DMAChannel *ch = &dc->ChState[uChannel & 3]; … … 757 757 const void *pvBuffer, uint32_t off, uint32_t cbBlock) 758 758 { 759 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);759 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 760 760 DMAControl *dc = &pThis->DMAC[DMACH2C(uChannel)]; 761 761 DMAChannel *ch = &dc->ChState[uChannel & 3]; … … 801 801 static DECLCALLBACK(void) dmaSetDREQ(PPDMDEVINS pDevIns, unsigned uChannel, unsigned uLevel) 802 802 { 803 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);803 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 804 804 DMAControl *dc = &pThis->DMAC[DMACH2C(uChannel)]; 805 805 int chidx; … … 821 821 static DECLCALLBACK(uint8_t) dmaGetChannelMode(PPDMDEVINS pDevIns, unsigned uChannel) 822 822 { 823 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);823 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 824 824 825 825 LogFlow(("dmaGetChannelMode: pThis=%p uChannel=%u\n", pThis, uChannel)); … … 837 837 static DECLCALLBACK(void) dmaReset(PPDMDEVINS pDevIns) 838 838 { 839 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);839 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 840 840 841 841 LogFlow(("dmaReset: pThis=%p\n", pThis)); … … 851 851 static int dmaIORegister(PPDMDEVINS pDevIns, bool fHighPage) 852 852 { 853 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);853 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 854 854 DMAControl *dc8 = &pThis->DMAC[0]; 855 855 DMAControl *dc16 = &pThis->DMAC[1]; … … 886 886 } 887 887 888 if (p This->fRZEnabled)888 if (pDevIns->fRCEnabled) 889 889 { 890 890 /* … … 920 920 AssertLogRelRCReturn(rc, rc); 921 921 } 922 922 } 923 if (pDevIns->fR0Enabled) 924 { 923 925 /* 924 926 * Ditto for ring-0. … … 958 960 } 959 961 960 static void dmaSaveController(P SSMHANDLE pSSM, DMAControl *dc)962 static void dmaSaveController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc) 961 963 { 962 964 int chidx; 963 965 964 966 /* Save controller state... */ 965 SSMR3PutU8(pSSM, dc->u8Command);966 SSMR3PutU8(pSSM, dc->u8Mask);967 SSMR3PutU8(pSSM, dc->fHiByte);968 SSMR3PutU32(pSSM, dc->is16bit);969 SSMR3PutU8(pSSM, dc->u8Status);970 SSMR3PutU8(pSSM, dc->u8Temp);971 SSMR3PutU8(pSSM, dc->u8ModeCtr);972 SSMR3PutMem(pSSM, &dc->au8Page, sizeof(dc->au8Page));973 SSMR3PutMem(pSSM, &dc->au8PageHi, sizeof(dc->au8PageHi));967 pHlp->pfnSSMPutU8(pSSM, dc->u8Command); 968 pHlp->pfnSSMPutU8(pSSM, dc->u8Mask); 969 pHlp->pfnSSMPutU8(pSSM, dc->fHiByte); 970 pHlp->pfnSSMPutU32(pSSM, dc->is16bit); 971 pHlp->pfnSSMPutU8(pSSM, dc->u8Status); 972 pHlp->pfnSSMPutU8(pSSM, dc->u8Temp); 973 pHlp->pfnSSMPutU8(pSSM, dc->u8ModeCtr); 974 pHlp->pfnSSMPutMem(pSSM, &dc->au8Page, sizeof(dc->au8Page)); 975 pHlp->pfnSSMPutMem(pSSM, &dc->au8PageHi, sizeof(dc->au8PageHi)); 974 976 975 977 /* ...and all four of its channels. */ … … 978 980 DMAChannel *ch = &dc->ChState[chidx]; 979 981 980 SSMR3PutU16(pSSM, ch->u16CurAddr);981 SSMR3PutU16(pSSM, ch->u16CurCount);982 SSMR3PutU16(pSSM, ch->u16BaseAddr);983 SSMR3PutU16(pSSM, ch->u16BaseCount);984 SSMR3PutU8(pSSM, ch->u8Mode);985 } 986 } 987 988 static int dmaLoadController(P SSMHANDLE pSSM, DMAControl *dc, int version)982 pHlp->pfnSSMPutU16(pSSM, ch->u16CurAddr); 983 pHlp->pfnSSMPutU16(pSSM, ch->u16CurCount); 984 pHlp->pfnSSMPutU16(pSSM, ch->u16BaseAddr); 985 pHlp->pfnSSMPutU16(pSSM, ch->u16BaseCount); 986 pHlp->pfnSSMPutU8(pSSM, ch->u8Mode); 987 } 988 } 989 990 static int dmaLoadController(PCPDMDEVHLPR3 pHlp, PSSMHANDLE pSSM, DMAControl *dc, int version) 989 991 { 990 992 uint8_t u8val; … … 992 994 int chidx; 993 995 994 SSMR3GetU8(pSSM, &dc->u8Command);995 SSMR3GetU8(pSSM, &dc->u8Mask);996 SSMR3GetU8(pSSM, &u8val);996 pHlp->pfnSSMGetU8(pSSM, &dc->u8Command); 997 pHlp->pfnSSMGetU8(pSSM, &dc->u8Mask); 998 pHlp->pfnSSMGetU8(pSSM, &u8val); 997 999 dc->fHiByte = !!u8val; 998 SSMR3GetU32(pSSM, &dc->is16bit);1000 pHlp->pfnSSMGetU32(pSSM, &dc->is16bit); 999 1001 if (version > DMA_SAVESTATE_OLD) 1000 1002 { 1001 SSMR3GetU8(pSSM, &dc->u8Status);1002 SSMR3GetU8(pSSM, &dc->u8Temp);1003 SSMR3GetU8(pSSM, &dc->u8ModeCtr);1004 SSMR3GetMem(pSSM, &dc->au8Page, sizeof(dc->au8Page));1005 SSMR3GetMem(pSSM, &dc->au8PageHi, sizeof(dc->au8PageHi));1003 pHlp->pfnSSMGetU8(pSSM, &dc->u8Status); 1004 pHlp->pfnSSMGetU8(pSSM, &dc->u8Temp); 1005 pHlp->pfnSSMGetU8(pSSM, &dc->u8ModeCtr); 1006 pHlp->pfnSSMGetMem(pSSM, &dc->au8Page, sizeof(dc->au8Page)); 1007 pHlp->pfnSSMGetMem(pSSM, &dc->au8PageHi, sizeof(dc->au8PageHi)); 1006 1008 } 1007 1009 … … 1013 1015 { 1014 1016 /* Convert from 17-bit to 16-bit format. */ 1015 SSMR3GetU32(pSSM, &u32val);1017 pHlp->pfnSSMGetU32(pSSM, &u32val); 1016 1018 ch->u16CurAddr = u32val >> dc->is16bit; 1017 SSMR3GetU32(pSSM, &u32val);1019 pHlp->pfnSSMGetU32(pSSM, &u32val); 1018 1020 ch->u16CurCount = u32val >> dc->is16bit; 1019 1021 } 1020 1022 else 1021 1023 { 1022 SSMR3GetU16(pSSM, &ch->u16CurAddr);1023 SSMR3GetU16(pSSM, &ch->u16CurCount);1024 pHlp->pfnSSMGetU16(pSSM, &ch->u16CurAddr); 1025 pHlp->pfnSSMGetU16(pSSM, &ch->u16CurCount); 1024 1026 } 1025 SSMR3GetU16(pSSM, &ch->u16BaseAddr);1026 SSMR3GetU16(pSSM, &ch->u16BaseCount);1027 SSMR3GetU8(pSSM, &ch->u8Mode);1027 pHlp->pfnSSMGetU16(pSSM, &ch->u16BaseAddr); 1028 pHlp->pfnSSMGetU16(pSSM, &ch->u16BaseCount); 1029 pHlp->pfnSSMGetU8(pSSM, &ch->u8Mode); 1028 1030 /* Convert from old save state. */ 1029 1031 if (version == DMA_SAVESTATE_OLD) 1030 1032 { 1031 1033 /* Remap page register contents. */ 1032 SSMR3GetU8(pSSM, &u8val);1034 pHlp->pfnSSMGetU8(pSSM, &u8val); 1033 1035 dc->au8Page[DMACX2PG(chidx)] = u8val; 1034 SSMR3GetU8(pSSM, &u8val);1036 pHlp->pfnSSMGetU8(pSSM, &u8val); 1035 1037 dc->au8PageHi[DMACX2PG(chidx)] = u8val; 1036 1038 /* Throw away dack, eop. */ 1037 SSMR3GetU8(pSSM, &u8val);1038 SSMR3GetU8(pSSM, &u8val);1039 pHlp->pfnSSMGetU8(pSSM, &u8val); 1040 pHlp->pfnSSMGetU8(pSSM, &u8val); 1039 1041 } 1040 1042 } … … 1045 1047 static DECLCALLBACK(int) dmaSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 1046 1048 { 1047 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *); 1048 1049 dmaSaveController(pSSM, &pThis->DMAC[0]); 1050 dmaSaveController(pSSM, &pThis->DMAC[1]); 1049 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 1050 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1051 1052 dmaSaveController(pHlp, pSSM, &pThis->DMAC[0]); 1053 dmaSaveController(pHlp, pSSM, &pThis->DMAC[1]); 1051 1054 return VINF_SUCCESS; 1052 1055 } … … 1055 1058 static DECLCALLBACK(int) dmaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 1056 1059 { 1057 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *); 1060 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 1061 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1058 1062 1059 1063 AssertMsgReturn(uVersion <= DMA_SAVESTATE_CURRENT, ("%d\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION); 1060 1064 Assert(uPass == SSM_PASS_FINAL); NOREF(uPass); 1061 1065 1062 dmaLoadController(p SSM, &pThis->DMAC[0], uVersion);1063 return dmaLoadController(p SSM, &pThis->DMAC[1], uVersion);1066 dmaLoadController(pHlp, pSSM, &pThis->DMAC[0], uVersion); 1067 return dmaLoadController(pHlp, pSSM, &pThis->DMAC[1], uVersion); 1064 1068 } 1065 1069 … … 1070 1074 { 1071 1075 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 1076 PDMASTATE pThis = PDMDEVINS_2_DATA(pDevIns, PDMASTATE); 1077 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 1072 1078 RT_NOREF(iInstance); 1073 DMAState *pThis = PDMDEVINS_2_DATA(pDevIns, DMAState *);1074 1079 1075 1080 /* … … 1079 1084 1080 1085 /* 1081 * Validate configuration.1086 * Validate and read the configuration. 1082 1087 */ 1083 if (!CFGMR3AreValuesValid(pCfg, "RZEnabled\0" 1084 "\0")) /* "HighPageEnable\0")) */ 1085 return VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES; 1086 1087 bool bHighPage = false; 1088 #if 0 1089 rc = CFGMR3QueryBool(pCfg, "HighPageEnable", &bHighPage); 1090 if (RT_FAILURE (rc)) 1091 return rc; 1092 #endif 1093 1094 int rc = CFGMR3QueryBoolDef(pCfg, "RZEnabled", &pThis->fRZEnabled, true); 1088 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "HighPageEnable", ""); 1089 1090 bool fHighPage = false; 1091 int rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "HighPageEnable", &fHighPage, false); 1092 AssertReturn(rc, rc); 1093 1094 /* 1095 * Register I/O callbacks. 1096 */ 1097 rc = dmaIORegister(pDevIns, fHighPage); 1095 1098 AssertLogRelRCReturn(rc, rc); 1096 1099 1097 rc = dmaIORegister(pDevIns, bHighPage);1098 AssertLogRelRCReturn(rc, rc);1099 1100 /* 1101 * Reset controller state. 1102 */ 1100 1103 dmaReset(pDevIns); 1101 1104 1105 /* 1106 * Register ourselves with PDM as the DMA controller. 1107 */ 1102 1108 PDMDMACREG Reg; 1103 1109 Reg.u32Version = PDM_DMACREG_VERSION; … … 1110 1116 1111 1117 rc = PDMDevHlpDMACRegister(pDevIns, &Reg, &pThis->pHlp); 1112 if (RT_FAILURE (rc)) 1113 return rc; 1114 1118 AssertReturn(rc, rc); 1119 1120 /* 1121 * Register the saved state. 1122 */ 1115 1123 rc = PDMDevHlpSSMRegister(pDevIns, DMA_SAVESTATE_CURRENT, sizeof(*pThis), dmaSaveExec, dmaLoadExec); 1116 if (RT_FAILURE(rc)) 1117 return rc; 1124 AssertReturn(rc, rc); 1118 1125 1119 1126 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.