Changeset 17035 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Feb 23, 2009 10:26:39 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 43248
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r16859 r17035 520 520 { 521 521 PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM); 522 AssertMsgFailed(("Need to load the hidden bits too!\n")); 522 523 523 524 pCpumCpu->Guest.tr = tr; … … 888 889 889 890 890 VMMDECL(RTSEL) CPUMGetGuestTR(PVM pVM) 891 { 892 PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM); 893 891 VMMDECL(RTSEL) CPUMGetGuestTR(PVM pVM, PCPUMSELREGHID pHidden) 892 { 893 PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM); 894 if (pHidden) 895 *pHidden = pCpumCpu->Guest.trHid; 894 896 return pCpumCpu->Guest.tr; 895 897 } … … 1077 1079 1078 1080 return pCpumCpu->Guest.eflags.u32; 1079 }1080 1081 1082 VMMDECL(CPUMSELREGHID *) CPUMGetGuestTRHid(PVM pVM)1083 {1084 PCPUMCPU pCpumCpu = cpumGetCpumCpu(pVM);1085 1086 return &pCpumCpu->Guest.trHid;1087 1081 } 1088 1082 -
trunk/src/VBox/VMM/VMMAll/SELMAll.cpp
r13832 r17035 929 929 /* Else compatibility or 32 bits mode. */ 930 930 return (pHiddenSel->Attr.n.u1DefBig) ? CPUMODE_32BIT : CPUMODE_16BIT; 931 932 931 } 933 932 … … 961 960 * 962 961 * @param pVM VM Handle. 963 * @param ss Ring1 SS register value. 962 * @param ss Ring1 SS register value. Pass 0 if invalid. 964 963 * @param esp Ring1 ESP register value. 965 964 */ 966 VMMDECL(void) SELMSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp) 967 { 965 void selmSetRing1Stack(PVM pVM, uint32_t ss, RTGCPTR32 esp) 966 { 967 Assert((ss & 1) || esp == 0); 968 968 pVM->selm.s.Tss.ss1 = ss; 969 969 pVM->selm.s.Tss.esp1 = (uint32_t)esp; … … 974 974 /** 975 975 * Gets ss:esp for ring1 in main Hypervisor's TSS. 976 * 977 * Returns SS=0 if the ring-1 stack isn't valid. 976 978 * 977 979 * @returns VBox status code. … … 979 981 * @param pSS Ring1 SS register value. 980 982 * @param pEsp Ring1 ESP register value. 981 *982 * @todo Merge in the GC version of this, eliminating it - or move this to983 * SELM.cpp, making it SELMR3GetRing1Stack.984 983 */ 985 984 VMMDECL(int) SELMGetRing1Stack(PVM pVM, uint32_t *pSS, PRTGCPTR32 pEsp) … … 1040 1039 # endif 1041 1040 /* Update our TSS structure for the guest's ring 1 stack */ 1042 SELMSetRing1Stack(pVM, tss.ss0 | 1, (RTGCPTR32)tss.esp0);1041 selmSetRing1Stack(pVM, tss.ss0 | 1, (RTGCPTR32)tss.esp0); 1043 1042 pVM->selm.s.fSyncTSSRing0Stack = false; 1044 1043 } … … 1190 1189 VMMDECL(int) SELMGetTSSInfo(PVM pVM, PRTGCUINTPTR pGCPtrTss, PRTGCUINTPTR pcbTss, bool *pfCanHaveIOBitmap) 1191 1190 { 1192 if (!CPUMAreHiddenSelRegsValid(pVM)) 1193 { 1194 /* 1195 * Do we have a valid TSS? 1196 */ 1197 if ( pVM->selm.s.GCSelTss == RTSEL_MAX 1198 || !pVM->selm.s.fGuestTss32Bit) 1199 return VERR_SELM_NO_TSS; 1200 1201 /* 1202 * Fill in return values. 1203 */ 1204 *pGCPtrTss = (RTGCUINTPTR)pVM->selm.s.GCPtrGuestTss; 1205 *pcbTss = pVM->selm.s.cbGuestTss; 1206 if (pfCanHaveIOBitmap) 1207 *pfCanHaveIOBitmap = pVM->selm.s.fGuestTss32Bit; 1208 } 1209 else 1210 { 1211 CPUMSELREGHID *pHiddenTRReg; 1212 1213 pHiddenTRReg = CPUMGetGuestTRHid(pVM); 1214 1215 *pGCPtrTss = pHiddenTRReg->u64Base; 1216 *pcbTss = pHiddenTRReg->u32Limit; 1217 1218 if (pfCanHaveIOBitmap) 1219 *pfCanHaveIOBitmap = pHiddenTRReg->Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_AVAIL 1220 || pHiddenTRReg->Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY; 1221 } 1191 /* 1192 * The TR hidden register is always valid. 1193 */ 1194 CPUMSELREGHID trHid; 1195 RTSEL tr = CPUMGetGuestTR(pVM, &trHid); 1196 if (!(tr & X86_SEL_MASK)) 1197 return VERR_SELM_NO_TSS; 1198 1199 *pGCPtrTss = trHid.u64Base; 1200 *pcbTss = trHid.u32Limit + (trHid.u32Limit != UINT32_MAX); /* be careful. */ 1201 if (pfCanHaveIOBitmap) 1202 *pfCanHaveIOBitmap = trHid.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_AVAIL 1203 || trHid.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY; 1222 1204 return VINF_SUCCESS; 1223 1205 }
Note:
See TracChangeset
for help on using the changeset viewer.