summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <josef.sipek@nexenta.com>2014-04-25 17:48:44 -0400
committerDan McDonald <danmcd@omniti.com>2014-04-29 11:19:00 -0400
commit6eedf6a58bb97d935b764a55719f82a486168fbb (patch)
treeeb949cb50ac95eb345d06f6942b6cf877b26265d
parent9b1d70f8223c4278acf4ca60eaf5dd285f72eeee (diff)
downloadillumos-joyent-6eedf6a58bb97d935b764a55719f82a486168fbb.tar.gz
4806 define x2apic feature flag
4807 pcplusmp & apix should use x2apic feature flag Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Dan McDonald <danmcd@omniti.com>
-rw-r--r--usr/src/uts/i86pc/io/pcplusmp/apic_regops.c11
-rw-r--r--usr/src/uts/i86pc/os/cpuid.c7
-rw-r--r--usr/src/uts/intel/sys/x86_archext.h9
3 files changed, 16 insertions, 11 deletions
diff --git a/usr/src/uts/i86pc/io/pcplusmp/apic_regops.c b/usr/src/uts/i86pc/io/pcplusmp/apic_regops.c
index 03e669b44a..eba22ca090 100644
--- a/usr/src/uts/i86pc/io/pcplusmp/apic_regops.c
+++ b/usr/src/uts/i86pc/io/pcplusmp/apic_regops.c
@@ -22,6 +22,9 @@
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
+/*
+ * Copyright 2014 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ */
#include <sys/cpuvar.h>
#include <sys/psm.h>
@@ -94,7 +97,6 @@ apic_reg_ops_t *apic_reg_ops = &local_apic_regs_ops;
void apic_send_EOI();
void apic_send_directed_EOI(uint32_t irq);
-#define X2APIC_CPUID_BIT 21
#define X2APIC_ENABLE_BIT 10
/*
@@ -233,15 +235,10 @@ apic_send_directed_EOI(uint32_t irq)
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
diff --git a/usr/src/uts/i86pc/os/cpuid.c b/usr/src/uts/i86pc/os/cpuid.c
index fce8fd9c23..a9b4428347 100644
--- a/usr/src/uts/i86pc/os/cpuid.c
+++ b/usr/src/uts/i86pc/os/cpuid.c
@@ -22,6 +22,7 @@
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011 by Delphix. All rights reserved.
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Josef "Jeff" Sipek <jeffpc@josefsipek.net>
*/
/*
* Copyright (c) 2010, Intel Corporation.
@@ -163,7 +164,8 @@ static char *x86_feature_names[NUM_X86_FEATURES] = {
"svm",
"topoext",
"f16c",
- "rdrand"
+ "rdrand",
+ "x2apic",
};
boolean_t
@@ -1311,6 +1313,9 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset)
}
}
}
+ if (cp->cp_ecx & CPUID_INTC_ECX_X2APIC) {
+ add_x86_feature(featureset, X86FSET_X2APIC);
+ }
if (cp->cp_edx & CPUID_INTC_EDX_DE) {
add_x86_feature(featureset, X86FSET_DE);
}
diff --git a/usr/src/uts/intel/sys/x86_archext.h b/usr/src/uts/intel/sys/x86_archext.h
index 29265387a3..fa3485d69b 100644
--- a/usr/src/uts/intel/sys/x86_archext.h
+++ b/usr/src/uts/intel/sys/x86_archext.h
@@ -31,6 +31,7 @@
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright 2012 Jens Elkner <jel+illumos@cs.uni-magdeburg.de>
* Copyright 2012 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
+ * Copyright 2014 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
*/
#ifndef _SYS_X86_ARCHEXT_H
@@ -116,6 +117,7 @@ extern "C" {
#define CPUID_INTC_ECX_DCA 0x00040000 /* direct cache access */
#define CPUID_INTC_ECX_SSE4_1 0x00080000 /* SSE4.1 insns */
#define CPUID_INTC_ECX_SSE4_2 0x00100000 /* SSE4.2 insns */
+#define CPUID_INTC_ECX_X2APIC 0x00200000 /* x2APIC */
#define CPUID_INTC_ECX_MOVBE 0x00400000 /* MOVBE insn */
#define CPUID_INTC_ECX_POPCNT 0x00800000 /* POPCNT insn */
#define CPUID_INTC_ECX_AES 0x02000000 /* AES insns */
@@ -130,7 +132,7 @@ extern "C" {
"\20" \
"\37rdrand\36f16c\35avx\34osxsav\33xsave" \
"\32aes" \
- "\30popcnt\27movbe\25sse4.2\24sse4.1\23dca" \
+ "\30popcnt\27movbe\26x2apic\25sse4.2\24sse4.1\23dca" \
"\20\17etprd\16cx16\13cid\12ssse3\11tm2" \
"\10est\7smx\6vmx\5dscpl\4mon\2pclmulqdq\1sse3"
@@ -346,7 +348,7 @@ extern "C" {
#define X86FSET_PGE 4
#define X86FSET_DE 5
#define X86FSET_CMOV 6
-#define X86FSET_MMX 7
+#define X86FSET_MMX 7
#define X86FSET_MCA 8
#define X86FSET_PAE 9
#define X86FSET_CX8 10
@@ -379,6 +381,7 @@ extern "C" {
#define X86FSET_TOPOEXT 37
#define X86FSET_F16C 38
#define X86FSET_RDRAND 39
+#define X86FSET_X2APIC 40
/*
* flags to patch tsc_read routine.
@@ -639,7 +642,7 @@ extern "C" {
#if defined(_KERNEL) || defined(_KMEMUSER)
-#define NUM_X86_FEATURES 40
+#define NUM_X86_FEATURES 41
extern uchar_t x86_featureset[];
extern void free_x86_featureset(void *featureset);