Skip to content

Commit 79bf121

Browse files
ZideChen0NanlinXie
authored andcommitted
hv: throw GP for MSR accesses if they are disabled from guest CPUID
This patch places all unsupported MSRs in the intercepted_msrs[], but don't implement any handlers in the switch clauses. Hence any accesses from guests result in GP exceptions. Tracked-On: #1867 Signed-off-by: Zide Chen <zide.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 3836d30 commit 79bf121

File tree

1 file changed

+61
-2
lines changed
  • hypervisor/arch/x86/guest

1 file changed

+61
-2
lines changed

hypervisor/arch/x86/guest/vmsr.c

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ enum rw_mode {
2020
* in either rdmsr_vmexit_handler() or wrmsr_vmexit_handler(), a GP will
2121
* be thrown to the guest for any R/W accesses.
2222
*/
23-
#define NUM_EMULATED_MSR 58U
23+
#define NUM_EMULATED_MSR 96U
2424
static const uint32_t emulated_msrs[NUM_EMULATED_MSR] = {
2525
/* Emulated MSRs */
2626
MSR_IA32_TSC_DEADLINE,
@@ -89,6 +89,60 @@ static const uint32_t emulated_msrs[NUM_EMULATED_MSR] = {
8989
MSR_IA32_VMX_TRUE_EXIT_CTLS,
9090
MSR_IA32_VMX_TRUE_ENTRY_CTLS,
9191
MSR_IA32_VMX_VMFUNC,
92+
93+
/* SGX disabled: CPUID.12H.EAX[0], CPUID.07H.ECX[30] */
94+
MSR_IA32_SGXLEPUBKEYHASH0,
95+
MSR_IA32_SGXLEPUBKEYHASH1,
96+
MSR_IA32_SGXLEPUBKEYHASH2,
97+
MSR_IA32_SGXLEPUBKEYHASH3,
98+
99+
/* SGX disabled : CPUID.07H.EBX[2] */
100+
MSR_IA32_SGX_SVN_STATUS,
101+
102+
/* SGX disabled : CPUID.12H.EAX[0] */
103+
MSR_SGXOWNEREPOCH0,
104+
MSR_SGXOWNEREPOCH1,
105+
106+
/* Performance Counters and Events: CPUID.0AH.EAX[15:8] */
107+
MSR_IA32_PMC0,
108+
MSR_IA32_PMC1,
109+
MSR_IA32_PMC2,
110+
MSR_IA32_PMC3,
111+
MSR_IA32_PMC4,
112+
MSR_IA32_PMC5,
113+
MSR_IA32_PMC6,
114+
MSR_IA32_PMC7,
115+
MSR_IA32_PERFEVTSEL0,
116+
MSR_IA32_PERFEVTSEL1,
117+
MSR_IA32_PERFEVTSEL2,
118+
MSR_IA32_PERFEVTSEL3,
119+
MSR_IA32_A_PMC0,
120+
MSR_IA32_A_PMC1,
121+
MSR_IA32_A_PMC2,
122+
MSR_IA32_A_PMC3,
123+
MSR_IA32_A_PMC4,
124+
MSR_IA32_A_PMC5,
125+
MSR_IA32_A_PMC6,
126+
MSR_IA32_A_PMC7,
127+
/* CPUID.0AH.EAX[7:0] */
128+
MSR_IA32_FIXED_CTR_CTL,
129+
MSR_IA32_PERF_GLOBAL_STATUS,
130+
MSR_IA32_PERF_GLOBAL_CTRL,
131+
MSR_IA32_PERF_GLOBAL_OVF_CTRL,
132+
MSR_IA32_PERF_GLOBAL_STATUS_SET,
133+
MSR_IA32_PERF_GLOBAL_INUSE,
134+
135+
/* QOS Configuration disabled: CPUID.10H.ECX[2] */
136+
MSR_IA32_L3_QOS_CFG,
137+
MSR_IA32_L2_QOS_CFG,
138+
139+
/* RDT-M disabled: CPUID.07H.EBX[12], CPUID.07H.EBX[15] */
140+
MSR_IA32_QM_EVTSEL,
141+
MSR_IA32_QM_CTR,
142+
MSR_IA32_PQR_ASSOC
143+
144+
/* RDT-A disabled: CPUID.07H.EBX[12], CPUID.10H */
145+
/* MSR 0xC90 ... 0xD8F, not in this array */
92146
};
93147

94148
static const uint32_t x2apic_msrs[] = {
@@ -201,7 +255,7 @@ static void init_msr_area(struct acrn_vcpu *vcpu)
201255

202256
void init_msr_emulation(struct acrn_vcpu *vcpu)
203257
{
204-
uint32_t i;
258+
uint32_t msr, i;
205259
uint8_t *msr_bitmap;
206260
uint64_t value64;
207261

@@ -213,6 +267,11 @@ void init_msr_emulation(struct acrn_vcpu *vcpu)
213267
}
214268

215269
intercept_x2apic_msrs(msr_bitmap, READ_WRITE);
270+
271+
/* RDT-A disabled: CPUID.07H.EBX[12], CPUID.10H */
272+
for (msr = MSR_IA32_L3_MASK_0; msr < MSR_IA32_BNDCFGS; msr++) {
273+
enable_msr_interception(msr_bitmap, msr, READ_WRITE);
274+
}
216275
}
217276

218277
/* Setup MSR bitmap - Intel SDM Vol3 24.6.9 */

0 commit comments

Comments
 (0)