diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2006-12-06 20:14:08 -0500 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-12-06 20:14:08 -0500 |
commit | bd472c794bbf6771c3fc1c58f188bc16c393d2fe (patch) | |
tree | a7f45422f7df7fa2cd394dcaabe71cb592c2b7da /arch/i386/pci/pcbios.c | |
parent | da181a8b3916aa7f2e3c5775d2bd2fe3454cf82d (diff) |
[PATCH] paravirt: Be careful about touching BIOS address space
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.
[akpm@osdl.org: fix unused var warning]
AK: Changed __get_user to probe_kernel_address
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Diffstat (limited to 'arch/i386/pci/pcbios.c')
-rw-r--r-- | arch/i386/pci/pcbios.c | 11 |
1 files changed, 9 insertions, 2 deletions
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; |