summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-03-24 02:59:16 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-03-24 02:59:16 +0100
commit0ef8bca36fdf3c57c90c948a4894c4baf5e0c3fd (patch)
tree08f74a99ef3034474814252eecc1191d3bc9a952
parent2ec0334d36910ff59727f1c6b3efc6648209020a (diff)
Make sure BIOS area is mapped in kernel threads
* i386/i386at/model_dep.c (i386at_init): Map BIOS memory at 0. * i386/intel/pmap.c (pmap_create): Do not map BIOS memory in user tasks.
-rw-r--r--i386/i386at/model_dep.c14
-rw-r--r--i386/intel/pmap.c6
2 files changed, 20 insertions, 0 deletions
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index bbdf9dc5..37610935 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -394,6 +394,13 @@ i386at_init(void)
kernel_page_dir[lin2pdenum(INIT_VM_MIN_KERNEL_ADDRESS) + i] =
kernel_page_dir[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS) + i];
#endif
+ /* We need BIOS memory mapped at 0xc0000 & co for Linux drivers */
+#ifdef LINUX_DEV
+#if VM_MIN_KERNEL_ADDRESS != 0
+ kernel_page_dir[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS)] =
+ kernel_page_dir[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS)];
+#endif
+#endif
#ifdef MACH_XEN
for (i = 0; i < PDPNUM; i++)
@@ -458,6 +465,13 @@ i386at_init(void)
#endif /* MACH_XEN */
}
#endif
+ /* Keep BIOS memory mapped */
+#ifdef LINUX_DEV
+#if VM_MIN_KERNEL_ADDRESS != 0
+ kernel_page_dir[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS)] =
+ kernel_page_dir[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS)];
+#endif
+#endif
/* Not used after boot, better give it back. */
#ifdef MACH_XEN
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index d8865b2f..f0623dee 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -1128,6 +1128,12 @@ pmap_t pmap_create(size)
panic("pmap_create");
memcpy(p->dirbase, kernel_page_dir, PDPNUM * INTEL_PGBYTES);
+#ifdef LINUX_DEV
+#if VM_MIN_KERNEL_ADDRESS != 0
+ /* Do not map BIOS in user tasks */
+ p->dirbase[lin2pdenum(LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS)] = 0;
+#endif
+#endif
#ifdef MACH_XEN
{
int i;