[PATCH v2 2/3] x86/vLAPIC: drop VLAPIC_VERSION

Jan Beulich posted 3 patches 2 weeks ago
[PATCH v2 2/3] x86/vLAPIC: drop VLAPIC_VERSION
Posted by Jan Beulich 2 weeks ago
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)