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 <jbeulich@suse.com>
---
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)