From 30b4abeedc98db5a607f434af67e2fe2626ef111 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Fri, 6 Apr 2007 19:57:42 +0000 Subject: [PATCH] Part III of YhLu's patch from January 18th Signed-off-by: Yinghai Lu Signed-off-by: Ed Swierk Signed-off-by: Stefan Reinauer Acked-by: Ward Vandewege Acked-by: Stefan Reinauer git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2590 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/arch/i386/lib/c_start.S | 4 +-- src/arch/i386/lib/console.c | 8 +++-- src/arch/i386/lib/cpu.c | 59 +++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/arch/i386/lib/c_start.S b/src/arch/i386/lib/c_start.S index 04b5a68676..272209aca9 100644 --- a/src/arch/i386/lib/c_start.S +++ b/src/arch/i386/lib/c_start.S @@ -263,9 +263,9 @@ gdt: .word 0x0000, 0x0000 /* dummy */ .byte 0x00, 0x00, 0x00, 0x00 - /* selgdt 0x10, flat code segment */ + /* selgdt 0x10, flat code segment */ .word 0xffff, 0x0000 - .byte 0x00, 0x9b, 0xcf, 0x00 + .byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */ /* selgdt 0x18, flat data segment */ .word 0xffff, 0x0000 diff --git a/src/arch/i386/lib/console.c b/src/arch/i386/lib/console.c index 071fb2848c..993edb2a35 100644 --- a/src/arch/i386/lib/console.c +++ b/src/arch/i386/lib/console.c @@ -9,11 +9,15 @@ static void __console_tx_byte(unsigned char byte) #include "console_print.c" #else -/* CONFIG_USE_INIT == 1 */ +/* CONFIG_USE_PRINTK_IN_CAR == 1 */ #include "console_printk.c" -#endif /* CONFIG_USE_INIT */ +// do_printk +#include "../../../console/vtxprintf.c" +#include "printk_init.c" + +#endif /* CONFIG_USE_PRINTK_IN_CAR */ #ifndef LINUXBIOS_EXTRA_VERSION #define LINUXBIOS_EXTRA_VERSION "" diff --git a/src/arch/i386/lib/cpu.c b/src/arch/i386/lib/cpu.c index aee230d075..c1b2e5fbf1 100644 --- a/src/arch/i386/lib/cpu.c +++ b/src/arch/i386/lib/cpu.c @@ -207,7 +207,6 @@ static void set_cpu_ops(struct device *cpu) } } } - die("Unknown cpu"); return; found: cpu->ops = driver->ops; @@ -223,7 +222,7 @@ void cpu_initialize(void) struct device *cpu; struct cpu_info *info; struct cpuinfo_x86 c; - + info = cpu_info(); printk_notice("Initializing CPU #%d\n", info->index); @@ -233,41 +232,37 @@ void cpu_initialize(void) die("CPU: missing cpu device structure"); } - // Check that we haven't been passed bad information as the result of a race - // (i.e. BSP timed out while waiting for us to load secondary_stack) + /* Find what type of cpu we are dealing with */ + identify_cpu(cpu); + printk_debug("CPU: vendor %s device %x\n", + cpu_vendor_name(cpu->vendor), cpu->device); -#if CONFIG_SMP || CONFIG_IOPIC - if (cpu->path.u.apic.apic_id != lapicid()) { - printk_err("CPU #%d Initialization FAILED: APIC ID mismatch (%u != %u)\n", - info->index, cpu->path.u.apic.apic_id, lapicid()); - // return without setting initialized flag - } else { -#endif - /* Find what type of cpu we are dealing with */ - identify_cpu(cpu); - printk_debug("CPU: vendor %s device %x\n", - cpu_vendor_name(cpu->vendor), cpu->device); + get_fms(&c, cpu->device); - get_fms(&c, cpu->device); + printk_debug("CPU: family %02x, model %02x, stepping %02x\n", c.x86, c.x86_model, c.x86_mask); + + /* Lookup the cpu's operations */ + set_cpu_ops(cpu); - printk_debug("CPU: family %02x, model %02x, stepping %02x\n", c.x86, c.x86_model, c.x86_mask); - - - /* Lookup the cpu's operations */ + if(!cpu->ops) { + /* mask out the stepping and try again */ + cpu->device -= c.x86_mask; set_cpu_ops(cpu); - - /* Initialize the cpu */ - if (cpu->ops && cpu->ops->init) { - cpu->enabled = 1; - cpu->initialized = 1; - cpu->ops->init(cpu); - } - - printk_info("CPU #%d Initialized\n", info->index); -#if CONFIG_SMP || CONFIG_IOPIC - + cpu->device += c.x86_mask; + if(!cpu->ops) die("Unknown cpu"); + printk_debug("WARNING: Using generic cpu ops\n"); } -#endif + + + /* Initialize the cpu */ + if (cpu->ops && cpu->ops->init) { + cpu->enabled = 1; + cpu->initialized = 1; + cpu->ops->init(cpu); + } + + printk_info("CPU #%d Initialized\n", info->index); + return; }