aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/vlapic.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2013-03-28 20:16:37 +0000
committerKeir Fraser <keir@xen.org>2013-03-28 20:16:37 +0000
commit5082cc19524b6687ef1bc0a717538d75aae7cd00 (patch)
tree8d92d42373375c2a51a4a84c1d7392d49e0977d9 /xen/arch/x86/hvm/vlapic.c
parent9726b513b8d5fc11f30d3f40df58b342443e4cf4 (diff)
downloadxen-5082cc19524b6687ef1bc0a717538d75aae7cd00.tar.gz
xen-5082cc19524b6687ef1bc0a717538d75aae7cd00.tar.bz2
xen-5082cc19524b6687ef1bc0a717538d75aae7cd00.zip
hvm: Clean up vlapic_reg_write() error propagation.
In particular, correctly propagate errors through vlapic_apicv_write() and hvm_x2apic_msr_write(). Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/vlapic.c')
-rw-r--r--xen/arch/x86/hvm/vlapic.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
index d69e8af3d1..4b25cc8342 100644
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -680,10 +680,9 @@ static int vlapic_reg_write(struct vcpu *v,
break;
case APIC_SELF_IPI:
- if ( vlapic_x2apic_mode(vlapic) )
- vlapic_reg_write(v, APIC_ICR, 0x40000 | (val & 0xff));
- else
- rc = X86EMUL_UNHANDLEABLE;
+ rc = vlapic_x2apic_mode(vlapic)
+ ? vlapic_reg_write(v, APIC_ICR, 0x40000 | (val & 0xff))
+ : X86EMUL_UNHANDLEABLE;
break;
case APIC_ICR:
@@ -836,28 +835,25 @@ static int vlapic_write(struct vcpu *v, unsigned long address,
int vlapic_apicv_write(struct vcpu *v, unsigned int offset)
{
uint32_t val = vlapic_get_reg(vcpu_vlapic(v), offset);
-
- vlapic_reg_write(v, offset, val);
- return 0;
+ return vlapic_reg_write(v, offset, val);
}
int hvm_x2apic_msr_write(struct vcpu *v, unsigned int msr, uint64_t msr_content)
{
struct vlapic *vlapic = vcpu_vlapic(v);
uint32_t offset = (msr - MSR_IA32_APICBASE_MSR) << 4;
- int rc;
if ( !vlapic_x2apic_mode(vlapic) )
- return 1;
+ return X86EMUL_UNHANDLEABLE;
if ( offset == APIC_ICR )
- if ( vlapic_reg_write(v, APIC_ICR2 , (uint32_t)(msr_content >> 32)) )
- return 1;
-
- rc = vlapic_reg_write(v, offset, (uint32_t)msr_content);
+ {
+ int rc = vlapic_reg_write(v, APIC_ICR2, (uint32_t)(msr_content >> 32));
+ if ( rc )
+ return rc;
+ }
- /* X86EMUL_RETRY for SIPI */
- return ((rc != X86EMUL_OKAY) && (rc != X86EMUL_RETRY));
+ return vlapic_reg_write(v, offset, (uint32_t)msr_content);
}
static int vlapic_range(struct vcpu *v, unsigned long addr)