Commit d7cd5611 authored by Rusty Russell's avatar Rusty Russell Committed by Andi Kleen

[PATCH] i386: cpu_detect extraction

Both lhype and Xen want to call the core of the x86 cpu detect code before
calling start_kernel.

(extracted from larger patch)

AK: folded in start_kernel header patch
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
parent 139ec7c4
...@@ -236,29 +236,14 @@ static int __cpuinit have_cpuid_p(void) ...@@ -236,29 +236,14 @@ static int __cpuinit have_cpuid_p(void)
return flag_is_changeable_p(X86_EFLAGS_ID); return flag_is_changeable_p(X86_EFLAGS_ID);
} }
/* Do minimum CPU detection early. void __init cpu_detect(struct cpuinfo_x86 *c)
Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment.
The others are not touched to avoid unwanted side effects.
WARNING: this function is only called on the BP. Don't add code here
that is supposed to run on all CPUs. */
static void __init early_cpu_detect(void)
{ {
struct cpuinfo_x86 *c = &boot_cpu_data;
c->x86_cache_alignment = 32;
if (!have_cpuid_p())
return;
/* Get vendor name */ /* Get vendor name */
cpuid(0x00000000, &c->cpuid_level, cpuid(0x00000000, &c->cpuid_level,
(int *)&c->x86_vendor_id[0], (int *)&c->x86_vendor_id[0],
(int *)&c->x86_vendor_id[8], (int *)&c->x86_vendor_id[8],
(int *)&c->x86_vendor_id[4]); (int *)&c->x86_vendor_id[4]);
get_cpu_vendor(c, 1);
c->x86 = 4; c->x86 = 4;
if (c->cpuid_level >= 0x00000001) { if (c->cpuid_level >= 0x00000001) {
u32 junk, tfms, cap0, misc; u32 junk, tfms, cap0, misc;
...@@ -275,6 +260,26 @@ static void __init early_cpu_detect(void) ...@@ -275,6 +260,26 @@ static void __init early_cpu_detect(void)
} }
} }
/* Do minimum CPU detection early.
Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment.
The others are not touched to avoid unwanted side effects.
WARNING: this function is only called on the BP. Don't add code here
that is supposed to run on all CPUs. */
static void __init early_cpu_detect(void)
{
struct cpuinfo_x86 *c = &boot_cpu_data;
c->x86_cache_alignment = 32;
if (!have_cpuid_p())
return;
cpu_detect(c);
get_cpu_vendor(c, 1);
}
static void __cpuinit generic_identify(struct cpuinfo_x86 * c) static void __cpuinit generic_identify(struct cpuinfo_x86 * c)
{ {
u32 tfms, xlvl; u32 tfms, xlvl;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/threads.h> #include <linux/threads.h>
#include <asm/percpu.h> #include <asm/percpu.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/init.h>
/* flag for disabling the tsc */ /* flag for disabling the tsc */
extern int tsc_disable; extern int tsc_disable;
...@@ -112,6 +113,8 @@ extern struct cpuinfo_x86 cpu_data[]; ...@@ -112,6 +113,8 @@ extern struct cpuinfo_x86 cpu_data[];
extern int cpu_llc_id[NR_CPUS]; extern int cpu_llc_id[NR_CPUS];
extern char ignore_fpu_irq; extern char ignore_fpu_irq;
void __init cpu_detect(struct cpuinfo_x86 *c);
extern void identify_cpu(struct cpuinfo_x86 *); extern void identify_cpu(struct cpuinfo_x86 *);
extern void print_cpu_info(struct cpuinfo_x86 *); extern void print_cpu_info(struct cpuinfo_x86 *);
extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
......
#ifndef _LINUX_START_KERNEL_H
#define _LINUX_START_KERNEL_H
#include <linux/linkage.h>
#include <linux/init.h>
/* Define the prototype for start_kernel here, rather than cluttering
up something else. */
extern asmlinkage void __init start_kernel(void);
#endif /* _LINUX_START_KERNEL_H */
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/percpu.h> #include <linux/percpu.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/start_kernel.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/profile.h> #include <linux/profile.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment