|
@@ -9,6 +9,7 @@
|
|
#include <linux/uaccess.h>
|
|
#include <linux/uaccess.h>
|
|
#include <asm/pci_x86.h>
|
|
#include <asm/pci_x86.h>
|
|
#include <asm/pci-functions.h>
|
|
#include <asm/pci-functions.h>
|
|
|
|
+#include <asm/cacheflush.h>
|
|
|
|
|
|
/* BIOS32 signature: "_32_" */
|
|
/* BIOS32 signature: "_32_" */
|
|
#define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24))
|
|
#define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24))
|
|
@@ -25,6 +26,27 @@
|
|
#define PCIBIOS_HW_TYPE1_SPEC 0x10
|
|
#define PCIBIOS_HW_TYPE1_SPEC 0x10
|
|
#define PCIBIOS_HW_TYPE2_SPEC 0x20
|
|
#define PCIBIOS_HW_TYPE2_SPEC 0x20
|
|
|
|
|
|
|
|
+int pcibios_enabled;
|
|
|
|
+
|
|
|
|
+/* According to the BIOS specification at:
|
|
|
|
+ * http://members.datafast.net.au/dft0802/specs/bios21.pdf, we could
|
|
|
|
+ * restrict the x zone to some pages and make it ro. But this may be
|
|
|
|
+ * broken on some bios, complex to handle with static_protections.
|
|
|
|
+ * We could make the 0xe0000-0x100000 range rox, but this can break
|
|
|
|
+ * some ISA mapping.
|
|
|
|
+ *
|
|
|
|
+ * So we let's an rw and x hole when pcibios is used. This shouldn't
|
|
|
|
+ * happen for modern system with mmconfig, and if you don't want it
|
|
|
|
+ * you could disable pcibios...
|
|
|
|
+ */
|
|
|
|
+static inline void set_bios_x(void)
|
|
|
|
+{
|
|
|
|
+ pcibios_enabled = 1;
|
|
|
|
+ set_memory_x(PAGE_OFFSET + BIOS_BEGIN, (BIOS_END - BIOS_BEGIN) >> PAGE_SHIFT);
|
|
|
|
+ if (__supported_pte_mask & _PAGE_NX)
|
|
|
|
+ printk(KERN_INFO "PCI : PCI BIOS aera is rw and x. Use pci=nobios if you want it NX.\n");
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* This is the standard structure used to identify the entry point
|
|
* This is the standard structure used to identify the entry point
|
|
* to the BIOS32 Service Directory, as documented in
|
|
* to the BIOS32 Service Directory, as documented in
|
|
@@ -332,6 +354,7 @@ static struct pci_raw_ops * __devinit pci_find_bios(void)
|
|
DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n",
|
|
DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n",
|
|
bios32_entry);
|
|
bios32_entry);
|
|
bios32_indirect.address = bios32_entry + PAGE_OFFSET;
|
|
bios32_indirect.address = bios32_entry + PAGE_OFFSET;
|
|
|
|
+ set_bios_x();
|
|
if (check_pcibios())
|
|
if (check_pcibios())
|
|
return &pci_bios_access;
|
|
return &pci_bios_access;
|
|
}
|
|
}
|