From: Rusty Russell BIOS ROM areas may not be mapped into the guest address space, so be careful when touching those addresses to make sure they appear to be mapped. Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Rusty Russell Cc: Jeremy Fitzhardinge Cc: Andi Kleen Signed-off-by: Andrew Morton --- arch/i386/kernel/e820.c | 9 ++++++++- arch/i386/pci/pcbios.c | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff -puN arch/i386/kernel/setup.c~prep-for-paravirt-be-careful-about-touching-bios arch/i386/kernel/setup.c diff -puN arch/i386/pci/pcbios.c~prep-for-paravirt-be-careful-about-touching-bios arch/i386/pci/pcbios.c --- a/arch/i386/pci/pcbios.c~prep-for-paravirt-be-careful-about-touching-bios +++ a/arch/i386/pci/pcbios.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "pci.h" #include "pci-functions.h" @@ -301,7 +302,7 @@ static struct pci_raw_ops pci_bios_acces static struct pci_raw_ops * __devinit pci_find_bios(void) { - union bios32 *check; + union bios32 *check, sig; unsigned char sum; int i, length; @@ -314,6 +315,10 @@ static struct pci_raw_ops * __devinit pc for (check = (union bios32 *) __va(0xe0000); check <= (union bios32 *) __va(0xffff0); ++check) { + long sig; + if (__get_user(sig, &check->fields.signature)) + continue; + if (check->fields.signature != BIOS32_SIGNATURE) continue; length = check->fields.length * 16; diff -puN arch/i386/kernel/e820.c~prep-for-paravirt-be-careful-about-touching-bios arch/i386/kernel/e820.c --- a/arch/i386/kernel/e820.c~prep-for-paravirt-be-careful-about-touching-bios +++ a/arch/i386/kernel/e820.c @@ -155,7 +155,14 @@ static struct resource standard_io_resou .flags = IORESOURCE_BUSY | IORESOURCE_IO } }; -#define romsignature(x) (*(unsigned short *)(x) == 0xaa55) +static int romsignature(const unsigned char *x) +{ + unsigned short sig; + int ret = 0; + if (__get_user(sig, (const unsigned short *)x) == 0) + ret = (sig == 0xaa55); + return ret; +} static int __init romchecksum(unsigned char *rom, unsigned long length) { _