@@ -14,24 +14,30 @@ enum rw_mode {
14
14
READ_WRITE
15
15
};
16
16
17
- /*
18
- * List of intercepted MSRs.
19
- * If any MSRs appear in this array but not handled in any swith statements
20
- * in either rdmsr_vmexit_handler() or wrmsr_vmexit_handler(), a GP will
21
- * be thrown to the guest for any R/W accesses.
22
- */
23
- #define NUM_EMULATED_MSR 96U
24
- static const uint32_t emulated_msrs [NUM_EMULATED_MSR ] = {
25
- /* Emulated MSRs */
17
+ static const uint32_t emulated_guest_msrs [NUM_GUEST_MSRS ] = {
18
+ /*
19
+ * MSRs that trusty may touch and need isolation between secure and normal world
20
+ * This may include MSR_IA32_TSC_ADJUST, MSR_IA32_STAR, MSR_IA32_LSTAR, MSR_IA32_FMASK,
21
+ * MSR_IA32_KERNEL_GS_BASE, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_EIP
22
+ *
23
+ * Number of entries: NUM_WORLD_MSRS
24
+ */
25
+ MSR_IA32_PAT ,
26
+
27
+ /*
28
+ * MSRs don't need isolation between worlds
29
+ * Number of entries: NUM_COMMON_MSRS
30
+ */
26
31
MSR_IA32_TSC_DEADLINE ,
27
32
MSR_IA32_BIOS_UPDT_TRIG ,
28
33
MSR_IA32_BIOS_SIGN_ID ,
29
34
MSR_IA32_TIME_STAMP_COUNTER ,
30
- MSR_IA32_PAT ,
31
35
MSR_IA32_APIC_BASE ,
36
+ MSR_IA32_PERF_CTL
37
+ };
32
38
33
- MSR_IA32_PERF_CTL ,
34
-
39
+ #define NUM_MTRR_MSRS 13U
40
+ static const uint32_t mtrr_msrs [ NUM_MTRR_MSRS ] = {
35
41
MSR_IA32_MTRR_CAP ,
36
42
MSR_IA32_MTRR_DEF_TYPE ,
37
43
MSR_IA32_MTRR_FIX64K_00000 ,
@@ -44,10 +50,12 @@ static const uint32_t emulated_msrs[NUM_EMULATED_MSR] = {
44
50
MSR_IA32_MTRR_FIX4K_E0000 ,
45
51
MSR_IA32_MTRR_FIX4K_E8000 ,
46
52
MSR_IA32_MTRR_FIX4K_F0000 ,
47
- MSR_IA32_MTRR_FIX4K_F8000 ,
48
-
49
- /* Following MSRs intercepted, and throw GP for any access */
53
+ MSR_IA32_MTRR_FIX4K_F8000
54
+ };
50
55
56
+ /* Following MSRs are intercepted, but it throws GPs for any guest accesses */
57
+ #define NUM_UNSUPPORTED_MSRS 76U
58
+ static const uint32_t unsupported_msrs [NUM_UNSUPPORTED_MSRS ] = {
51
59
/* Variable MTRRs are not supported */
52
60
MSR_IA32_MTRR_PHYSBASE_0 ,
53
61
MSR_IA32_MTRR_PHYSMASK_0 ,
@@ -145,8 +153,8 @@ static const uint32_t emulated_msrs[NUM_EMULATED_MSR] = {
145
153
/* MSR 0xC90 ... 0xD8F, not in this array */
146
154
};
147
155
148
- #define NUM_X2APIC_MSR 44U
149
- static const uint32_t x2apic_msrs [NUM_X2APIC_MSR ] = {
156
+ #define NUM_X2APIC_MSRS 44U
157
+ static const uint32_t x2apic_msrs [NUM_X2APIC_MSRS ] = {
150
158
MSR_IA32_EXT_XAPICID ,
151
159
MSR_IA32_EXT_APIC_VERSION ,
152
160
MSR_IA32_EXT_APIC_TPR ,
@@ -241,7 +249,7 @@ static void intercept_x2apic_msrs(uint8_t *msr_bitmap_arg, enum rw_mode mode)
241
249
uint8_t * msr_bitmap = msr_bitmap_arg ;
242
250
uint32_t i ;
243
251
244
- for (i = 0U ; i < NUM_X2APIC_MSR ; i ++ ) {
252
+ for (i = 0U ; i < NUM_X2APIC_MSRS ; i ++ ) {
245
253
enable_msr_interception (msr_bitmap , x2apic_msrs [i ], mode );
246
254
}
247
255
}
@@ -263,12 +271,20 @@ void init_msr_emulation(struct acrn_vcpu *vcpu)
263
271
if (is_vcpu_bsp (vcpu )) {
264
272
msr_bitmap = vcpu -> vm -> arch_vm .msr_bitmap ;
265
273
266
- for (i = 0U ; i < NUM_EMULATED_MSR ; i ++ ) {
267
- enable_msr_interception (msr_bitmap , emulated_msrs [i ], READ_WRITE );
274
+ for (i = 0U ; i < NUM_GUEST_MSRS ; i ++ ) {
275
+ enable_msr_interception (msr_bitmap , emulated_guest_msrs [i ], READ_WRITE );
276
+ }
277
+
278
+ for (i = 0U ; i < NUM_MTRR_MSRS ; i ++ ) {
279
+ enable_msr_interception (msr_bitmap , mtrr_msrs [i ], READ_WRITE );
268
280
}
269
281
270
282
intercept_x2apic_msrs (msr_bitmap , READ_WRITE );
271
283
284
+ for (i = 0U ; i < NUM_UNSUPPORTED_MSRS ; i ++ ) {
285
+ enable_msr_interception (msr_bitmap , unsupported_msrs [i ], READ_WRITE );
286
+ }
287
+
272
288
/* RDT-A disabled: CPUID.07H.EBX[12], CPUID.10H */
273
289
for (msr = MSR_IA32_L3_MASK_0 ; msr < MSR_IA32_BNDCFGS ; msr ++ ) {
274
290
enable_msr_interception (msr_bitmap , msr , READ_WRITE );
0 commit comments