mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/HVM: fix x2APIC APIC_ID read emulation
APIC and x2APIC have different format for APIC_ID register. Need translation. Signed-off-by: Zhenguo Wang <wangzhenguo@huawei.com> Signed-off-by: Xiaowei Yang <xiaowei.yang@huawei.com> Convert code to use switch(), fixing coding style issue at once, and use GET_xAPIC_ID() on the value read instead of VLAPIC_ID() (reading the field again). In the course of this also properly reject both read and writes on the non-existing MSR corresponding to APIC_ICR2. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
44434f3c5e
commit
6859874b61
1 file changed
+20
-3
@@ -582,8 +582,19 @@ int hvm_x2apic_msr_read(struct vcpu *v, unsigned int msr, uint64_t *msr_content)
|
||||
return 1;
|
||||
|
||||
vlapic_read_aligned(vlapic, offset, &low);
|
||||
if ( offset == APIC_ICR )
|
||||
switch ( offset )
|
||||
{
|
||||
case APIC_ID:
|
||||
low = GET_xAPIC_ID(low);
|
||||
break;
|
||||
|
||||
case APIC_ICR:
|
||||
vlapic_read_aligned(vlapic, APIC_ICR2, &high);
|
||||
break;
|
||||
|
||||
case APIC_ICR2:
|
||||
return 1;
|
||||
}
|
||||
|
||||
*msr_content = (((uint64_t)high) << 32) | low;
|
||||
return 0;
|
||||
@@ -837,11 +848,17 @@ int hvm_x2apic_msr_write(struct vcpu *v, unsigned int msr, uint64_t msr_content)
|
||||
if ( !vlapic_x2apic_mode(vlapic) )
|
||||
return X86EMUL_UNHANDLEABLE;
|
||||
|
||||
if ( offset == APIC_ICR )
|
||||
switch ( offset )
|
||||
{
|
||||
int rc = vlapic_reg_write(v, APIC_ICR2, (uint32_t)(msr_content >> 32));
|
||||
int rc;
|
||||
|
||||
case APIC_ICR:
|
||||
rc = vlapic_reg_write(v, APIC_ICR2, (uint32_t)(msr_content >> 32));
|
||||
if ( rc )
|
||||
return rc;
|
||||
|
||||
case APIC_ICR2:
|
||||
return X86EMUL_UNHANDLEABLE;
|
||||
}
|
||||
|
||||
return vlapic_reg_write(v, offset, (uint32_t)msr_content);
|
||||
|
||||