[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 6/6] x86/apic: Convert the TSC deadline errata table to X86_MATCH_*()



With the ability to match on steppings, introduce a new X86_MATCH_VFMS()
helper to match a specific stepping, and use it to rework deadline_match[].

Notably this removes the overloading of driver_data possibly being a function
pointer, and removes the latent bug where the target functions are missing
ENDBR instructions owing to the lack of the cf_check attribute.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>

The bloat-o-meter summary shows that the use of functions really wasn't the
wisest idea:

  add/remove: 0/3 grow/shrink: 1/2 up/down: 80/-146 (-66)
  Function                                     old     new   delta
  deadline_match                               224     304     +80
  APIC_init_uniprocessor                       334     331      -3
  skx_deadline_rev                              30       -     -30
  CSWTCH                                       335     299     -36
  hsx_deadline_rev                              38       -     -38
  bdx_deadline_rev                              39       -     -39
---
 xen/arch/x86/apic.c                  | 79 +++++++---------------------
 xen/arch/x86/include/asm/match-cpu.h |  5 ++
 2 files changed, 25 insertions(+), 59 deletions(-)

diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index c4272ab4de4f..744124185189 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -1051,64 +1051,32 @@ static void setup_APIC_timer(void)
     local_irq_restore(flags);
 }
 
-#define DEADLINE_MODEL_MATCH(m, fr) \
-    { .vendor = X86_VENDOR_INTEL, .family = 6, .model = (m), \
-      .feature = X86_FEATURE_TSC_DEADLINE, \
-      .driver_data = (void *)(unsigned long)(fr) }
+static const struct x86_cpu_id __initconst deadline_match[] = {
+    X86_MATCH_VFMS(INTEL_HASWELL_X,   0x2, 0x3a), /* EP */
+    X86_MATCH_VFMS(INTEL_HASWELL_X,   0x4, 0x0f), /* EX */
 
-static unsigned int __init hsx_deadline_rev(void)
-{
-    switch ( boot_cpu_data.x86_mask )
-    {
-    case 0x02: return 0x3a; /* EP */
-    case 0x04: return 0x0f; /* EX */
-    }
+    X86_MATCH_VFM (INTEL_BROADWELL_X,      0x0b000020),
 
-    return ~0U;
-}
+    X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x2, 0x00000011),
+    X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x3, 0x0700000e),
+    X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x4, 0x0f00000c),
+    X86_MATCH_VFMS(INTEL_BROADWELL_D, 0x5, 0x0e000003),
 
-static unsigned int __init bdx_deadline_rev(void)
-{
-    switch ( boot_cpu_data.x86_mask )
-    {
-    case 0x02: return 0x00000011;
-    case 0x03: return 0x0700000e;
-    case 0x04: return 0x0f00000c;
-    case 0x05: return 0x0e000003;
-    }
+    X86_MATCH_VFMS(INTEL_SKYLAKE_X,   0x3, 0x01000136),
+    X86_MATCH_VFMS(INTEL_SKYLAKE_X,   0x4, 0x02000014),
 
-    return ~0U;
-}
+    X86_MATCH_VFM (INTEL_HASWELL,          0x22),
+    X86_MATCH_VFM (INTEL_HASWELL_L,        0x20),
+    X86_MATCH_VFM (INTEL_HASWELL_G,        0x17),
 
-static unsigned int __init skx_deadline_rev(void)
-{
-    switch ( boot_cpu_data.x86_mask )
-    {
-    case 0x00 ... 0x02: return ~0U;
-    case 0x03: return 0x01000136;
-    case 0x04: return 0x02000014;
-    }
-
-    return 0;
-}
-
-static const struct x86_cpu_id __initconstrel deadline_match[] = {
-    DEADLINE_MODEL_MATCH(0x3c, 0x22),             /* Haswell */
-    DEADLINE_MODEL_MATCH(0x3f, hsx_deadline_rev), /* Haswell EP/EX */
-    DEADLINE_MODEL_MATCH(0x45, 0x20),             /* Haswell D */
-    DEADLINE_MODEL_MATCH(0x46, 0x17),             /* Haswell H */
+    X86_MATCH_VFM (INTEL_BROADWELL,        0x25),
+    X86_MATCH_VFM (INTEL_BROADWELL_G,      0x17),
 
-    DEADLINE_MODEL_MATCH(0x3d, 0x25),             /* Broadwell */
-    DEADLINE_MODEL_MATCH(0x47, 0x17),             /* Broadwell H */
-    DEADLINE_MODEL_MATCH(0x4f, 0x0b000020),       /* Broadwell EP/EX */
-    DEADLINE_MODEL_MATCH(0x56, bdx_deadline_rev), /* Broadwell D */
+    X86_MATCH_VFM (INTEL_SKYLAKE_L,        0xb2),
+    X86_MATCH_VFM (INTEL_SKYLAKE,          0xb2),
 
-    DEADLINE_MODEL_MATCH(0x4e, 0xb2),             /* Skylake M */
-    DEADLINE_MODEL_MATCH(0x55, skx_deadline_rev), /* Skylake X */
-    DEADLINE_MODEL_MATCH(0x5e, 0xb2),             /* Skylake D */
-
-    DEADLINE_MODEL_MATCH(0x8e, 0x52),             /* Kabylake M */
-    DEADLINE_MODEL_MATCH(0x9e, 0x52),             /* Kabylake D */
+    X86_MATCH_VFM (INTEL_KABYLAKE_L,       0x52),
+    X86_MATCH_VFM (INTEL_KABYLAKE,         0x52),
 
     {}
 };
@@ -1125,14 +1093,7 @@ static void __init check_deadline_errata(void)
     if ( !m )
         return;
 
-    /*
-     * Function pointers will have the MSB set due to address layout,
-     * immediate revisions will not.
-     */
-    if ( (long)m->driver_data < 0 )
-        rev = ((unsigned int (*)(void))(m->driver_data))();
-    else
-        rev = (unsigned long)m->driver_data;
+    rev = (unsigned long)m->driver_data;
 
     if ( this_cpu(cpu_sig).rev >= rev )
         return;
diff --git a/xen/arch/x86/include/asm/match-cpu.h 
b/xen/arch/x86/include/asm/match-cpu.h
index 3862e766ccfc..b491232c351f 100644
--- a/xen/arch/x86/include/asm/match-cpu.h
+++ b/xen/arch/x86/include/asm/match-cpu.h
@@ -35,6 +35,11 @@ struct x86_cpu_id {
                   VFM_MODEL(vfm), X86_STEPPINGS_ANY,            \
                   X86_FEATURE_ANY, data)
 
+#define X86_MATCH_VFMS(vfm, stepping, data)                     \
+    X86_MATCH_CPU(VFM_VENDOR(vfm), VFM_FAMILY(vfm),             \
+                  VFM_MODEL(vfm), 1U << (stepping),             \
+                  X86_FEATURE_ANY, data)
+
 /*
  * x86_match_cpu() - match the CPU against an array of x86_cpu_ids[]
  *
-- 
2.39.5




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.