return ((f1^f2) & flag) != 0;
}
-
/* Probe for the CPUID instruction */
-static int have_cpuid_p(void)
+int cpu_have_cpuid(void)
{
return flag_is_changeable_p(X86_EFLAGS_ID);
}
return name;
}
+static int cpu_cpuid_extended_level(void)
+{
+ return cpuid_eax(0x80000000);
+}
+
+#define CPUID_FEATURE_PAE (1 << 6)
+#define CPUID_FEATURE_PSE36 (1 << 17)
+
+int cpu_phys_address_size(void)
+{
+ if (!(cpu_have_cpuid()))
+ return 32;
+
+ if (cpu_cpuid_extended_level() >= 0x80000008)
+ return cpuid_eax(0x80000008) & 0xff;
+
+ if (cpuid_edx(1) & (CPUID_FEATURE_PAE | CPUID_FEATURE_PSE36))
+ return 36;
+ return 32;
+}
static void identify_cpu(struct device *cpu)
{
char vendor_name[16];
vendor_name[0] = '\0'; /* Unset */
/* Find the id and vendor_name */
- if (!have_cpuid_p()) {
+ if (!cpu_have_cpuid()) {
/* Its a 486 if we can modify the AC flag */
if (flag_is_changeable_p(X86_EFLAGS_AC)) {
cpu->device = 0x00000400; /* 486 */
memcpy(vendor_name, "NexGenDriven", 13);
}
}
- if (have_cpuid_p()) {
+ if (cpu_have_cpuid()) {
int cpuid_level;
struct cpuid_result result;
result = cpuid(0x00000000);
}
}
return;
- found:
+found:
cpu->ops = driver->ops;
}