diff options
| -rw-r--r-- | arch/i386/kernel/e820.c | 10 | ||||
| -rw-r--r-- | arch/i386/pci/pcbios.c | 11 |
2 files changed, 18 insertions, 3 deletions
diff --git a/arch/i386/kernel/e820.c b/arch/i386/kernel/e820.c index b755255f2721..b704790f7969 100644 --- a/arch/i386/kernel/e820.c +++ b/arch/i386/kernel/e820.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
| 10 | #include <linux/efi.h> | 10 | #include <linux/efi.h> |
| 11 | #include <linux/pfn.h> | 11 | #include <linux/pfn.h> |
| 12 | #include <linux/uaccess.h> | ||
| 12 | 13 | ||
| 13 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
| 14 | #include <asm/page.h> | 15 | #include <asm/page.h> |
| @@ -155,7 +156,14 @@ static struct resource standard_io_resources[] = { { | |||
| 155 | .flags = IORESOURCE_BUSY | IORESOURCE_IO | 156 | .flags = IORESOURCE_BUSY | IORESOURCE_IO |
| 156 | } }; | 157 | } }; |
| 157 | 158 | ||
| 158 | #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) | 159 | static int romsignature(const unsigned char *x) |
| 160 | { | ||
| 161 | unsigned short sig; | ||
| 162 | int ret = 0; | ||
| 163 | if (probe_kernel_address((const unsigned short *)x, sig) == 0) | ||
| 164 | ret = (sig == 0xaa55); | ||
| 165 | return ret; | ||
| 166 | } | ||
| 159 | 167 | ||
| 160 | static int __init romchecksum(unsigned char *rom, unsigned long length) | 168 | static int __init romchecksum(unsigned char *rom, unsigned long length) |
| 161 | { | 169 | { |
diff --git a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c index ed1512a175ab..5f5193401bea 100644 --- a/arch/i386/pci/pcbios.c +++ b/arch/i386/pci/pcbios.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <linux/pci.h> | 5 | #include <linux/pci.h> |
| 6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
| 7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
| 8 | #include <linux/uaccess.h> | ||
| 8 | #include "pci.h" | 9 | #include "pci.h" |
| 9 | #include "pci-functions.h" | 10 | #include "pci-functions.h" |
| 10 | 11 | ||
| @@ -314,6 +315,10 @@ static struct pci_raw_ops * __devinit pci_find_bios(void) | |||
| 314 | for (check = (union bios32 *) __va(0xe0000); | 315 | for (check = (union bios32 *) __va(0xe0000); |
| 315 | check <= (union bios32 *) __va(0xffff0); | 316 | check <= (union bios32 *) __va(0xffff0); |
| 316 | ++check) { | 317 | ++check) { |
| 318 | long sig; | ||
| 319 | if (probe_kernel_address(&check->fields.signature, sig)) | ||
| 320 | continue; | ||
| 321 | |||
| 317 | if (check->fields.signature != BIOS32_SIGNATURE) | 322 | if (check->fields.signature != BIOS32_SIGNATURE) |
| 318 | continue; | 323 | continue; |
| 319 | length = check->fields.length * 16; | 324 | length = check->fields.length * 16; |
| @@ -331,11 +336,13 @@ static struct pci_raw_ops * __devinit pci_find_bios(void) | |||
| 331 | } | 336 | } |
| 332 | DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); | 337 | DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); |
| 333 | if (check->fields.entry >= 0x100000) { | 338 | if (check->fields.entry >= 0x100000) { |
| 334 | printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check); | 339 | printk("PCI: BIOS32 entry (0x%p) in high memory, " |
| 340 | "cannot use.\n", check); | ||
| 335 | return NULL; | 341 | return NULL; |
| 336 | } else { | 342 | } else { |
| 337 | unsigned long bios32_entry = check->fields.entry; | 343 | unsigned long bios32_entry = check->fields.entry; |
| 338 | DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry); | 344 | DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", |
| 345 | bios32_entry); | ||
| 339 | bios32_indirect.address = bios32_entry + PAGE_OFFSET; | 346 | bios32_indirect.address = bios32_entry + PAGE_OFFSET; |
| 340 | if (check_pcibios()) | 347 | if (check_pcibios()) |
| 341 | return &pci_bios_access; | 348 | return &pci_bios_access; |
