mirror of https://gitee.com/openkylin/linux.git
x86: Centaur Isaiah processor to use sysenter in 64-bit compatibility mode rather than syscall
Upcoming 64 bit processors from Centaur can use sysenter. Signed-off-by: Dave Jones <davej@codemonkey.org.uk> Signed-off-by: Jesse Ahrens <jahrens@centtech.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
aa040b2f06
commit
0e03eb86b5
|
@ -885,6 +885,32 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
|
|||
srat_detect_node();
|
||||
}
|
||||
|
||||
static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (c->x86 == 0x6 && c->x86_model >= 0xf)
|
||||
set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
|
||||
}
|
||||
|
||||
static void __cpuinit init_centaur(struct cpuinfo_x86 *c)
|
||||
{
|
||||
/* Cache sizes */
|
||||
unsigned n;
|
||||
|
||||
n = c->extended_cpuid_level;
|
||||
if (n >= 0x80000008) {
|
||||
unsigned eax = cpuid_eax(0x80000008);
|
||||
c->x86_virt_bits = (eax >> 8) & 0xff;
|
||||
c->x86_phys_bits = eax & 0xff;
|
||||
}
|
||||
|
||||
if (c->x86 == 0x6 && c->x86_model >= 0xf) {
|
||||
c->x86_cache_alignment = c->x86_clflush_size * 2;
|
||||
set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
|
||||
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
|
||||
}
|
||||
set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
|
||||
}
|
||||
|
||||
static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
|
||||
{
|
||||
char *v = c->x86_vendor_id;
|
||||
|
@ -893,6 +919,8 @@ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
|
|||
c->x86_vendor = X86_VENDOR_AMD;
|
||||
else if (!strcmp(v, "GenuineIntel"))
|
||||
c->x86_vendor = X86_VENDOR_INTEL;
|
||||
else if (!strcmp(v, "CentaurHauls"))
|
||||
c->x86_vendor = X86_VENDOR_CENTAUR;
|
||||
else
|
||||
c->x86_vendor = X86_VENDOR_UNKNOWN;
|
||||
}
|
||||
|
@ -989,6 +1017,9 @@ static void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
|
|||
if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15))
|
||||
set_cpu_cap(c, X86_FEATURE_PAT);
|
||||
break;
|
||||
case X86_VENDOR_CENTAUR:
|
||||
early_init_centaur(c);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1025,6 +1056,10 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
|
|||
init_intel(c);
|
||||
break;
|
||||
|
||||
case X86_VENDOR_CENTAUR:
|
||||
init_centaur(c);
|
||||
break;
|
||||
|
||||
case X86_VENDOR_UNKNOWN:
|
||||
default:
|
||||
display_cacheinfo(c);
|
||||
|
|
|
@ -210,8 +210,12 @@ static int use_sysenter __read_mostly = -1;
|
|||
/* May not be __init: called during resume */
|
||||
void syscall32_cpu_init(void)
|
||||
{
|
||||
if (use_sysenter < 0)
|
||||
use_sysenter = (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL);
|
||||
if (use_sysenter < 0) {
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
use_sysenter = 1;
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR)
|
||||
use_sysenter = 1;
|
||||
}
|
||||
|
||||
/* Load these always in case some future AMD CPU supports
|
||||
SYSENTER from compat mode too. */
|
||||
|
|
Loading…
Reference in New Issue