Changeset 30862 in vbox for trunk/src/recompiler
- Timestamp:
- Jul 15, 2010 6:13:56 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63691
- Location:
- trunk/src/recompiler
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/recompiler/VBoxREMWrapper.cpp
r30263 r30862 520 520 }; 521 521 522 /* CPUM GetGuestMsr args */523 static const REMPARMDESC g_aArgsCPUM GetGuestMsr[] =522 /* CPUMQueryGuestMsr args */ 523 static const REMPARMDESC g_aArgsCPUMQueryGuestMsr[] = 524 524 { 525 525 { REMPARMDESC_FLAGS_INT, sizeof(PVMCPU), NULL }, 526 526 { REMPARMDESC_FLAGS_INT, sizeof(uint32_t), NULL }, 527 }; 528 529 /* CPUMGetGuestMsr args */ 527 { REMPARMDESC_FLAGS_INT, sizeof(uint64_t *), NULL }, 528 }; 529 530 /* CPUMSetGuestMsr args */ 530 531 static const REMPARMDESC g_aArgsCPUMSetGuestMsr[] = 531 532 { … … 727 728 { REMPARMDESC_FLAGS_INT, sizeof(PVMCPU), NULL }, 728 729 { REMPARMDESC_FLAGS_INT, sizeof(uint8_t), NULL } 729 };730 static const REMPARMDESC g_aArgsPDMApicWriteMSR[] =731 {732 { REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL },733 { REMPARMDESC_FLAGS_INT, sizeof(VMCPUID), NULL },734 { REMPARMDESC_FLAGS_INT, sizeof(uint32_t), NULL },735 { REMPARMDESC_FLAGS_INT, sizeof(uint64_t), NULL }736 };737 static const REMPARMDESC g_aArgsPDMApicReadMSR[] =738 {739 { REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL },740 { REMPARMDESC_FLAGS_INT, sizeof(VMCPUID), NULL },741 { REMPARMDESC_FLAGS_INT, sizeof(uint32_t), NULL },742 { REMPARMDESC_FLAGS_INT, sizeof(uint64_t *), NULL }743 730 }; 744 731 static const REMPARMDESC g_aArgsPDMGetInterrupt[] = … … 1187 1174 { "CPUMSetChangedFlags", VMM_FN(CPUMSetChangedFlags), &g_aArgsCPUMSetChangedFlags[0], RT_ELEMENTS(g_aArgsCPUMSetChangedFlags), REMFNDESC_FLAGS_RET_VOID, 0, NULL }, 1188 1175 { "CPUMGetGuestCPL", VMM_FN(CPUMGetGuestCPL), &g_aArgsCPUMGetGuestCpl[0], RT_ELEMENTS(g_aArgsCPUMGetGuestCpl), REMFNDESC_FLAGS_RET_INT, sizeof(unsigned), NULL }, 1189 { "CPUM GetGuestMsr", VMM_FN(CPUMGetGuestMsr), &g_aArgsCPUMGetGuestMsr[0], RT_ELEMENTS(g_aArgsCPUMGetGuestMsr),REMFNDESC_FLAGS_RET_INT, sizeof(uint64_t), NULL },1176 { "CPUMQueryGuestMsr", VMM_FN(CPUMQueryGuestMsr), &g_aArgsCPUMQueryGuestMsr[0], RT_ELEMENTS(g_aArgsCPUMQueryGuestMsr), REMFNDESC_FLAGS_RET_INT, sizeof(uint64_t), NULL }, 1190 1177 { "CPUMSetGuestMsr", VMM_FN(CPUMSetGuestMsr), &g_aArgsCPUMSetGuestMsr[0], RT_ELEMENTS(g_aArgsCPUMSetGuestMsr), REMFNDESC_FLAGS_RET_VOID, 0, NULL }, 1191 1178 { "CPUMGetGuestCpuId", VMM_FN(CPUMGetGuestCpuId), &g_aArgsCPUMGetGuestCpuId[0], RT_ELEMENTS(g_aArgsCPUMGetGuestCpuId), REMFNDESC_FLAGS_RET_VOID, 0, NULL }, … … 1235 1222 { "PDMApicSetBase", VMM_FN(PDMApicSetBase), &g_aArgsPDMApicSetBase[0], RT_ELEMENTS(g_aArgsPDMApicSetBase), REMFNDESC_FLAGS_RET_INT, sizeof(int), NULL }, 1236 1223 { "PDMApicSetTPR", VMM_FN(PDMApicSetTPR), &g_aArgsPDMApicSetTPR[0], RT_ELEMENTS(g_aArgsPDMApicSetTPR), REMFNDESC_FLAGS_RET_INT, sizeof(int), NULL }, 1237 { "PDMApicWriteMSR", VMM_FN(PDMApicWriteMSR), &g_aArgsPDMApicWriteMSR[0], RT_ELEMENTS(g_aArgsPDMApicWriteMSR), REMFNDESC_FLAGS_RET_INT, sizeof(int), NULL },1238 { "PDMApicReadMSR", VMM_FN(PDMApicReadMSR), &g_aArgsPDMApicReadMSR[0], RT_ELEMENTS(g_aArgsPDMApicReadMSR), REMFNDESC_FLAGS_RET_INT, sizeof(int), NULL },1239 1224 { "PDMR3DmaRun", VMM_FN(PDMR3DmaRun), &g_aArgsVM[0], RT_ELEMENTS(g_aArgsVM), REMFNDESC_FLAGS_RET_VOID, 0, NULL }, 1240 1225 { "PDMR3CritSectInit", VMM_FN(PDMR3CritSectInit), &g_aArgsPDMR3CritSectInit[0], RT_ELEMENTS(g_aArgsPDMR3CritSectInit), REMFNDESC_FLAGS_RET_INT, sizeof(int), NULL }, -
trunk/src/recompiler/VBoxRecompiler.c
r30453 r30862 4167 4167 /* -+- local apic -+- */ 4168 4168 4169 #if 0 /* CPUMSetGuestMsr does this now. */ 4169 4170 void cpu_set_apic_base(CPUX86State *env, uint64_t val) 4170 4171 { … … 4172 4173 LogFlow(("cpu_set_apic_base: val=%#llx rc=%Rrc\n", val, rc)); NOREF(rc); 4173 4174 } 4175 #endif 4174 4176 4175 4177 uint64_t cpu_get_apic_base(CPUX86State *env) … … 4205 4207 } 4206 4208 4207 4208 uint64_t cpu_apic_rdmsr(CPUX86State *env, uint32_t reg) 4209 { 4210 uint64_t value; 4211 int rc = PDMApicReadMSR(env->pVM, 0/* cpu */, reg, &value); 4212 if (RT_SUCCESS(rc)) 4213 { 4214 LogFlow(("cpu_apic_rdms returns %#x\n", value)); 4215 return value; 4216 } 4217 /** @todo: exception ? */ 4218 LogFlow(("cpu_apic_rdms returns 0 (rc=%Rrc)\n", rc)); 4219 return value; 4220 } 4221 4222 void cpu_apic_wrmsr(CPUX86State *env, uint32_t reg, uint64_t value) 4223 { 4224 int rc = PDMApicWriteMSR(env->pVM, 0 /* cpu */, reg, value); 4225 /** @todo: exception if error ? */ 4226 LogFlow(("cpu_apic_wrmsr: rc=%Rrc\n", rc)); NOREF(rc); 4227 } 4228 4229 uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr) 4209 /** 4210 * Read an MSR. 4211 * 4212 * @retval 0 success. 4213 * @retval -1 failure, raise \#GP(0). 4214 * @param env The cpu state. 4215 * @param idMsr The MSR to read. 4216 * @param puValue Where to return the value. 4217 */ 4218 int cpu_rdmsr(CPUX86State *env, uint32_t idMsr, uint64_t *puValue) 4230 4219 { 4231 4220 Assert(env->pVCpu); 4232 return CPUMGetGuestMsr(env->pVCpu, msr); 4233 } 4234 4235 void cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val) 4221 return CPUMQueryGuestMsr(env->pVCpu, idMsr, puValue) == VINF_SUCCESS ? 0 : -1; 4222 } 4223 4224 /** 4225 * Write to an MSR. 4226 * 4227 * @retval 0 success. 4228 * @retval -1 failure, raise \#GP(0). 4229 * @param env The cpu state. 4230 * @param idMsr The MSR to read. 4231 * @param puValue Where to return the value. 4232 */ 4233 int cpu_wrmsr(CPUX86State *env, uint32_t idMsr, uint64_t uValue) 4236 4234 { 4237 4235 Assert(env->pVCpu); 4238 CPUMSetGuestMsr(env->pVCpu, msr, val);4236 return CPUMSetGuestMsr(env->pVCpu, idMsr, uValue) == VINF_SUCCESS ? 0 : -1; 4239 4237 } 4240 4238 -
trunk/src/recompiler/target-i386/cpu.h
r18927 r30862 601 601 /* sysenter registers */ 602 602 uint32_t sysenter_cs; 603 #ifdef VBOX 604 uint32_t alignment0; 605 #endif 603 606 uint64_t sysenter_esp; 604 607 uint64_t sysenter_eip; 605 #ifdef VBOX606 uint32_t alignment0;607 #endif608 608 uint64_t efer; 609 609 uint64_t star; … … 926 926 #endif 927 927 #ifdef VBOX 928 uint64_t cpu_apic_rdmsr(CPUX86State *env, uint32_t reg); 929 void cpu_apic_wrmsr(CPUX86State *env, uint32_t reg, uint64_t value); 930 uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr); 931 void cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val); 928 int cpu_rdmsr(CPUX86State *env, uint32_t idMsr, uint64_t *puValue); 929 int cpu_wrmsr(CPUX86State *env, uint32_t idMsr, uint64_t uValue); 932 930 #endif 933 931 void cpu_smm_update(CPUX86State *env); -
trunk/src/recompiler/target-i386/op_helper.c
r29333 r30862 3690 3690 EAX = (uint32_t)(val); 3691 3691 EDX = (uint32_t)(val >> 32); 3692 ECX = cpu_rdmsr(env, MSR_K8_TSC_AUX); 3692 if (cpu_rdmsr(env, MSR_K8_TSC_AUX, &val) == 0) 3693 ECX = (uint32_t)(val); 3694 else 3695 ECX = 0; 3693 3696 } 3694 3697 #endif … … 3743 3746 break; 3744 3747 case MSR_IA32_APICBASE: 3748 #ifndef VBOX /* The CPUMSetGuestMsr call below does this now. */ 3745 3749 cpu_set_apic_base(env, val); 3750 #endif 3746 3751 break; 3747 3752 case MSR_EFER: … … 3795 3800 #ifndef VBOX 3796 3801 /* XXX: exception ? */ 3797 break; 3798 #else /* VBOX */ 3802 #endif 3803 break; 3804 } 3805 3806 #ifdef VBOX 3807 /* call CPUM. */ 3808 if (cpu_wrmsr(env, (uint32_t)ECX, val) != 0) 3799 3809 { 3800 uint32_t ecx = (uint32_t)ECX; 3801 /* In X2APIC specification this range is reserved for APIC control. */ 3802 if (ecx >= MSR_APIC_RANGE_START && ecx < MSR_APIC_RANGE_END) 3803 cpu_apic_wrmsr(env, ecx, val); 3804 /** @todo else exception? */ 3805 break; 3806 } 3807 case MSR_K8_TSC_AUX: 3808 cpu_wrmsr(env, MSR_K8_TSC_AUX, val); 3809 break; 3810 #endif /* VBOX */ 3811 } 3810 /** @todo be a brave man and raise a \#GP(0) here as we should... */ 3811 } 3812 #endif 3812 3813 } 3813 3814 … … 3842 3843 val = env->vm_hsave; 3843 3844 break; 3844 #ifdef VBOX 3845 case MSR_IA32_PERF_STATUS: 3846 case MSR_IA32_PLATFORM_INFO: 3847 case MSR_IA32_FSB_CLOCK_STS: 3848 case MSR_IA32_THERM_STATUS: 3849 val = CPUMGetGuestMsr(env->pVCpu, (uint32_t)ECX); 3850 break; 3851 #else 3845 #ifndef VBOX /* forward to CPUMQueryGuestMsr. */ 3852 3846 case MSR_IA32_PERF_STATUS: 3853 3847 /* tsc_increment_by_tick */ … … 3890 3884 /* XXX: exception ? */ 3891 3885 val = 0; 3892 break;3893 3886 #else /* VBOX */ 3887 if (cpu_rdmsr(env, (uint32_t)ECX, &val) != 0) 3894 3888 { 3895 uint32_t ecx = (uint32_t)ECX; 3896 /* In X2APIC specification this range is reserved for APIC control. */ 3897 if (ecx >= MSR_APIC_RANGE_START && ecx < MSR_APIC_RANGE_END) 3898 val = cpu_apic_rdmsr(env, ecx); 3899 else 3900 val = 0; /** @todo else exception? */ 3901 break; 3902 } 3903 case MSR_IA32_TSC: 3904 case MSR_K8_TSC_AUX: 3905 val = cpu_rdmsr(env, (uint32_t)ECX); 3906 break; 3907 #endif /* VBOX */ 3889 /** @todo be a brave man and raise a \#GP(0) here as we should... */ 3890 val = 0; 3891 } 3892 #endif 3893 break; 3908 3894 } 3909 3895 EAX = (uint32_t)(val); 3910 3896 EDX = (uint32_t)(val >> 32); 3897 3898 #ifdef VBOX_STRICT 3899 if (cpu_rdmsr(env, (uint32_t)ECX, &val) != 0) 3900 val = 0; 3901 AssertMsg(val == RT_MAKE_U32(EAX, EDX), ("idMsr=%#x val=%#llx eax:edx=%#llx\n", (uint32_t)ECX, val, RT_MAKE_U32(EAX, EDX))); 3902 #endif 3911 3903 } 3912 3904 #endif
Note:
See TracChangeset
for help on using the changeset viewer.