Print this page
patch use-x2apic-feature
patch apic-simplify
patch apic-task-reg-write-dup

@@ -92,11 +92,10 @@
  * APIC register ops related data sturctures and functions.
  */
 void apic_send_EOI();
 void apic_send_directed_EOI(uint32_t irq);
 
-#define X2APIC_CPUID_BIT        21
 #define X2APIC_ENABLE_BIT       10
 
 /*
  * Local APIC Implementation
  */

@@ -107,11 +106,11 @@
 }
 
 static void
 local_apic_write(uint32_t reg, uint64_t value)
 {
-        apicadr[reg] = (uint32_t)value;
+        LOCAL_APIC_WRITE_REG(reg, (uint32_t)value);
 }
 
 static int
 get_local_apic_pri(void)
 {

@@ -131,11 +130,11 @@
         setcr8((ulong_t)(value >> APIC_IPL_SHIFT));
 #else
         if (apic_have_32bit_cr8)
                 setcr8((ulong_t)(value >> APIC_IPL_SHIFT));
         else
-                apicadr[APIC_TASK_REG] = (uint32_t)value;
+                LOCAL_APIC_WRITE_REG(APIC_TASK_REG, (uint32_t)value);
 #endif
 }
 
 static void
 local_apic_write_int_cmd(uint32_t cpu_id, uint32_t cmd1)

@@ -231,19 +230,14 @@
 }
 
 int
 apic_detect_x2apic(void)
 {
-        struct cpuid_regs cp;
-
         if (x2apic_enable == 0)
                 return (0);
 
-        cp.cp_eax = 1;
-        (void) __cpuid_insn(&cp);
-
-        return ((cp.cp_ecx & (0x1 << X2APIC_CPUID_BIT)) ? 1 : 0);
+        return is_x86_feature(x86_featureset, X86FSET_X2APIC);
 }
 
 void
 apic_enable_x2apic(void)
 {