X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Farch%2Fx86%2Flib%2Fcpu.c;h=a7f7b322c003f8b0fff26d1a417b67d7da6348fb;hb=c5fc7db3559e080858461b724251f87be6faa2cd;hp=3732ae296e96d7f0573b572d497b0640d27c496c;hpb=8677a23d5b053d550f70246de9c7dc8fd4e2fbf9;p=coreboot.git diff --git a/src/arch/x86/lib/cpu.c b/src/arch/x86/lib/cpu.c index 3732ae296..a7f7b322c 100644 --- a/src/arch/x86/lib/cpu.c +++ b/src/arch/x86/lib/cpu.c @@ -131,6 +131,26 @@ static const char *cpu_vendor_name(int vendor) 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 (!(have_cpuid_p())) + 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]; @@ -207,7 +227,7 @@ static void set_cpu_ops(struct device *cpu) } } return; - found: +found: cpu->ops = driver->ops; }