2006-02-17 20:24:05

by Daniel Yeisley

[permalink] [raw]
Subject: [patch] i386 need to pass virtual address to smp_read_mpc()

I'm seeing a kernel panic on an ES7000-600 when booting in virtual wire
mode. The panic happens because smp_read_mpc() is passed a physical
address, and it should be virtual. I tested the attached patch on the
ES7000-600 and on a 2 cpu Dell box, and saw no problems on either.

Signed-off-by: Dan Yeisley <[email protected]>
---

diff -Naur -p linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c
--- linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c 2006-01-30 18:38:18.000000000 -0500
+++ linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c 2006-02-16 04:51:35.551014272 -0500
@@ -710,7 +710,7 @@ void __init get_smp_config (void)
* Read the physical hardware table. Anything here will
* override the defaults.
*/
- if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
+ if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr)))
smp_found_config = 0;
printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");



2006-02-17 20:34:40

by Andi Kleen

[permalink] [raw]
Subject: Re: [patch] i386 need to pass virtual address to smp_read_mpc()

On Friday 17 February 2006 21:24, Daniel Yeisley wrote:
> I'm seeing a kernel panic on an ES7000-600 when booting in virtual wire
> mode. The panic happens because smp_read_mpc() is passed a physical
> address, and it should be virtual. I tested the attached patch on the
> ES7000-600 and on a 2 cpu Dell box, and saw no problems on either.

Looks obviously correct. Should probably be in 2.6.16

-Andi

>
> Signed-off-by: Dan Yeisley <[email protected]>
> ---
>
> diff -Naur -p linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c
> --- linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c 2006-01-30 18:38:18.000000000 -0500
> +++ linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c 2006-02-16 04:51:35.551014272 -0500
> @@ -710,7 +710,7 @@ void __init get_smp_config (void)
> * Read the physical hardware table. Anything here will
> * override the defaults.
> */
> - if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
> + if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr)))
> smp_found_config = 0;
> printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
> printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
>
>
>

2006-02-17 20:55:46

by Andi Kleen

[permalink] [raw]
Subject: Re: [patch] i386 need to pass virtual address to smp_read_mpc()

On Friday 17 February 2006 21:24, Daniel Yeisley wrote:
> I'm seeing a kernel panic on an ES7000-600 when booting in virtual wire
> mode. The panic happens because smp_read_mpc() is passed a physical
> address, and it should be virtual. I tested the attached patch on the
> ES7000-600 and on a 2 cpu Dell box, and saw no problems on either.
>
> Signed-off-by: Dan Yeisley <[email protected]>
> ---
>
> diff -Naur -p linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c
> --- linux-2.6.16-rc1-git3-7/arch/i386/kernel/mpparse.c 2006-01-30 18:38:18.000000000 -0500
> +++ linux-2.6.16-rc1-git3-7-a/arch/i386/kernel/mpparse.c 2006-02-16 04:51:35.551014272 -0500
> @@ -710,7 +710,7 @@ void __init get_smp_config (void)
> * Read the physical hardware table. Anything here will
> * override the defaults.
> */
> - if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
> + if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr)))


Actually the patch is broken. Andrew, if you merge it please add the missing { here.

Dan, please only submit patches that are compile tested at least.

-Andi


> smp_found_config = 0;
> printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
> printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
>
>
>