@@ -401,7 +401,7 @@ static void vlapic_icrtmr_write_handler(struct acrn_vlapic *vlapic)
401
401
}
402
402
}
403
403
404
- static uint64_t vlapic_get_tsc_deadline_msr (const struct acrn_vlapic * vlapic )
404
+ uint64_t vlapic_get_tsc_deadline_msr (const struct acrn_vlapic * vlapic )
405
405
{
406
406
uint64_t ret ;
407
407
if (!vlapic_lvtt_tsc_deadline (vlapic )) {
@@ -415,8 +415,7 @@ static uint64_t vlapic_get_tsc_deadline_msr(const struct acrn_vlapic *vlapic)
415
415
416
416
}
417
417
418
- static void vlapic_set_tsc_deadline_msr (struct acrn_vlapic * vlapic ,
419
- uint64_t val_arg )
418
+ void vlapic_set_tsc_deadline_msr (struct acrn_vlapic * vlapic , uint64_t val_arg )
420
419
{
421
420
struct hv_timer * timer ;
422
421
uint64_t val = val_arg ;
@@ -1754,17 +1753,13 @@ void vlapic_restore(struct acrn_vlapic *vlapic, const struct lapic_regs *regs)
1754
1753
vlapic_dcr_write_handler (vlapic );
1755
1754
}
1756
1755
1757
- static uint64_t
1758
- vlapic_get_apicbase (const struct acrn_vlapic * vlapic )
1756
+ uint64_t vlapic_get_apicbase (const struct acrn_vlapic * vlapic )
1759
1757
{
1760
-
1761
1758
return vlapic -> msr_apicbase ;
1762
1759
}
1763
1760
1764
- static int32_t
1765
- vlapic_set_apicbase (struct acrn_vlapic * vlapic , uint64_t new )
1761
+ int32_t vlapic_set_apicbase (struct acrn_vlapic * vlapic , uint64_t new )
1766
1762
{
1767
-
1768
1763
int32_t ret = 0 ;
1769
1764
uint64_t changed ;
1770
1765
changed = vlapic -> msr_apicbase ^ new ;
@@ -2046,8 +2041,7 @@ vlapic_x2apic_pt_icr_access(struct acrn_vm *vm, uint64_t val)
2046
2041
return ret ;
2047
2042
}
2048
2043
2049
- static int32_t vlapic_x2apic_access (struct acrn_vcpu * vcpu , uint32_t msr , bool write ,
2050
- uint64_t * val )
2044
+ int32_t vlapic_x2apic_read (struct acrn_vcpu * vcpu , uint32_t msr , uint64_t * val )
2051
2045
{
2052
2046
struct acrn_vlapic * vlapic ;
2053
2047
uint32_t offset ;
@@ -2061,99 +2055,55 @@ static int32_t vlapic_x2apic_access(struct acrn_vcpu *vcpu, uint32_t msr, bool w
2061
2055
if (is_x2apic_enabled (vlapic )) {
2062
2056
if (is_lapic_pt (vcpu -> vm )) {
2063
2057
switch (msr ) {
2064
- case MSR_IA32_EXT_APIC_ICR :
2065
- error = vlapic_x2apic_pt_icr_access (vcpu -> vm , * val );
2066
- break ;
2067
- case MSR_IA32_EXT_APIC_LDR :
2068
- case MSR_IA32_EXT_XAPICID :
2069
- if (!write ) {
2070
- offset = x2apic_msr_to_regoff (msr );
2071
- error = vlapic_read (vlapic , offset , val );
2072
- }
2073
- break ;
2074
- default :
2075
- pr_err ("%s: unexpected MSR[0x%x] access with lapic_pt" , __func__ , msr );
2076
- break ;
2058
+ case MSR_IA32_EXT_APIC_LDR :
2059
+ case MSR_IA32_EXT_XAPICID :
2060
+ offset = x2apic_msr_to_regoff (msr );
2061
+ error = vlapic_read (vlapic , offset , val );
2062
+ break ;
2063
+ default :
2064
+ pr_err ("%s: unexpected MSR[0x%x] read with lapic_pt" , __func__ , msr );
2065
+ break ;
2077
2066
}
2078
2067
} else {
2079
- offset = x2apic_msr_to_regoff (msr );
2080
- if (write ) {
2081
- if (!is_x2apic_read_only_msr (msr )) {
2082
- error = vlapic_write (vlapic , offset , * val );
2083
- }
2084
- } else {
2085
- if (!is_x2apic_write_only_msr (msr )) {
2086
- error = vlapic_read (vlapic , offset , val );
2087
- }
2068
+ if (!is_x2apic_write_only_msr (msr )) {
2069
+ offset = x2apic_msr_to_regoff (msr );
2070
+ error = vlapic_read (vlapic , offset , val );
2088
2071
}
2089
2072
}
2090
2073
}
2091
2074
2092
2075
return error ;
2093
2076
}
2094
2077
2095
- int32_t
2096
- vlapic_rdmsr (struct acrn_vcpu * vcpu , uint32_t msr , uint64_t * rval )
2097
- {
2098
- int32_t error = 0 ;
2099
- struct acrn_vlapic * vlapic ;
2100
-
2101
- dev_dbg (ACRN_DBG_LAPIC , "cpu[%hu] rdmsr: %x" , vcpu -> vcpu_id , msr );
2102
- vlapic = vcpu_vlapic (vcpu );
2103
-
2104
- switch (msr ) {
2105
- case MSR_IA32_APIC_BASE :
2106
- * rval = vlapic_get_apicbase (vlapic );
2107
- break ;
2108
-
2109
- case MSR_IA32_TSC_DEADLINE :
2110
- * rval = vlapic_get_tsc_deadline_msr (vlapic );
2111
- break ;
2112
-
2113
- default :
2114
- if (is_x2apic_msr (msr )) {
2115
- error = vlapic_x2apic_access (vcpu , msr , false, rval );
2116
- } else {
2117
- error = -1 ;
2118
- dev_dbg (ACRN_DBG_LAPIC ,
2119
- "Invalid vlapic msr 0x%x access\n" , msr );
2120
- }
2121
- break ;
2122
- }
2123
-
2124
- return error ;
2125
- }
2126
-
2127
- int32_t
2128
- vlapic_wrmsr (struct acrn_vcpu * vcpu , uint32_t msr , uint64_t wval )
2078
+ int32_t vlapic_x2apic_write (struct acrn_vcpu * vcpu , uint32_t msr , uint64_t val )
2129
2079
{
2130
- int32_t error = 0 ;
2131
2080
struct acrn_vlapic * vlapic ;
2081
+ uint32_t offset ;
2082
+ int32_t error = -1 ;
2132
2083
2084
+ /*
2085
+ * If vLAPIC is in xAPIC mode and guest tries to access x2APIC MSRs
2086
+ * inject a GP to guest
2087
+ */
2133
2088
vlapic = vcpu_vlapic (vcpu );
2134
-
2135
- switch (msr ) {
2136
- case MSR_IA32_APIC_BASE :
2137
- error = vlapic_set_apicbase (vlapic , wval );
2138
- break ;
2139
-
2140
- case MSR_IA32_TSC_DEADLINE :
2141
- vlapic_set_tsc_deadline_msr (vlapic , wval );
2142
- break ;
2143
-
2144
- default :
2145
- if (is_x2apic_msr (msr )) {
2146
- error = vlapic_x2apic_access (vcpu , msr , true, & wval );
2089
+ if (is_x2apic_enabled (vlapic )) {
2090
+ if (is_lapic_pt (vcpu -> vm )) {
2091
+ switch (msr ) {
2092
+ case MSR_IA32_EXT_APIC_ICR :
2093
+ error = vlapic_x2apic_pt_icr_access (vcpu -> vm , val );
2094
+ break ;
2095
+ default :
2096
+ pr_err ("%s: unexpected MSR[0x%x] write with lapic_pt" , __func__ , msr );
2097
+ break ;
2098
+ }
2147
2099
} else {
2148
- error = -1 ;
2149
- dev_dbg (ACRN_DBG_LAPIC ,
2150
- "Invalid vlapic msr 0x%x access\n" , msr );
2100
+ if (!is_x2apic_read_only_msr (msr )) {
2101
+ offset = x2apic_msr_to_regoff (msr );
2102
+ error = vlapic_write (vlapic , offset , val );
2103
+ }
2151
2104
}
2152
- break ;
2153
2105
}
2154
2106
2155
- dev_dbg (ACRN_DBG_LAPIC , "cpu[%hu] wrmsr: %x wval=%#x" ,
2156
- vcpu -> vcpu_id , msr , wval );
2157
2107
return error ;
2158
2108
}
2159
2109
0 commit comments