In preparation of making the value somewhat dynamic drop the constant. Replace its use in guest_wrmsr_x2apic() by actually fetching the LVR value.
Signed-off-by: Jan Beulich <[email protected]> --- v2: Use MASK_INSR() right here. --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -31,7 +31,6 @@ #include <public/hvm/ioreq.h> #include <public/hvm/params.h> -#define VLAPIC_VERSION 0x00050014 #define LVT_BIAS(reg) (((reg) - APIC_LVTT) >> 4) #define LVTS \ @@ -1015,7 +1014,7 @@ int guest_wrmsr_x2apic(struct vcpu *v, u case APIC_SPIV: if ( val & ~(APIC_VECTOR_MASK | APIC_SPIV_APIC_ENABLED | APIC_SPIV_FOCUS_DISABLED | - (VLAPIC_VERSION & APIC_LVR_DIRECTED_EOI + (vlapic_get_reg(vlapic, APIC_LVR) & APIC_LVR_DIRECTED_EOI ? APIC_SPIV_DIRECTED_EOI : 0)) ) return X86EMUL_EXCEPTION; break; @@ -1439,7 +1438,9 @@ static void vlapic_do_init(struct vlapic if ( !has_vlapic(vlapic_vcpu(vlapic)->domain) ) return; - vlapic_set_reg(vlapic, APIC_LVR, VLAPIC_VERSION); + vlapic_set_reg(vlapic, APIC_LVR, + MASK_INSR(0x14, APIC_LVR_VERSION_MASK) | + MASK_INSR(ARRAY_SIZE(lvt_reg) - 1, APIC_LVR_MAXLVT_MASK)); for ( i = 0; i < 8; i++ ) { --- a/xen/arch/x86/include/asm/apicdef.h +++ b/xen/arch/x86/include/asm/apicdef.h @@ -15,7 +15,10 @@ #define GET_xAPIC_ID(x) (((x)>>24)&0xFFu) #define SET_xAPIC_ID(x) (((x)<<24)) #define APIC_LVR 0x30 -#define APIC_LVR_MASK 0xFF00FF +#define APIC_LVR_VERSION_MASK 0xff +#define APIC_LVR_MAXLVT_MASK 0xff0000 +#define APIC_LVR_MASK (APIC_LVR_VERSION_MASK | \ + APIC_LVR_MAXLVT_MASK) #define APIC_LVR_DIRECTED_EOI (1 << 24) #define GET_APIC_VERSION(x) ((x)&0xFF) #define GET_APIC_MAXLVT(x) (((x)>>16)&0xFF)
