summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2014-07-06 18:49:55 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2014-07-06 18:49:55 +0200
commit859c342d11a2d018e7b220e955bbe1ba1940f02f (patch)
tree1890b0757459549938be3ee5f2d23fcdcc94b019
parent97447914d6dcc32ada4ee028e1e2bab262501316 (diff)
Do not unmap page 0 when not needed
Since we need it to access some BIOS information, e.g. at ACPI shutdown. When the kernel VM is not starting at 0, there is already nothing mapped there in user tasks, anyway. * i386/i386at/model_dep.c (machine_init) [VM_MIN_KERNEL_ADDRESS != 0]: Do not call pmap_unmap_page_zero. * i386/intel/pmap.c (pmap_unmap_page_zero): Warn that unmapping page zero may break some BIOS functions.
-rw-r--r--i386/i386at/acpi.c3
-rw-r--r--i386/i386at/model_dep.c4
-rw-r--r--i386/intel/pmap.c1
3 files changed, 8 insertions, 0 deletions
diff --git a/i386/i386at/acpi.c b/i386/i386at/acpi.c
index ec8aeb1e..986b3a25 100644
--- a/i386/i386at/acpi.c
+++ b/i386/i386at/acpi.c
@@ -55,8 +55,11 @@ grub_machine_acpi_get_rsdpv2 (void)
grub_uint8_t *ebda, *ptr;
grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
+ printf("ptr is %p\n", (* ((grub_uint16_t *) phystokv (0x40e))) << 4);
+ printf("len is %u\n", *( (grub_uint16_t *) phystokv ((* ((grub_uint16_t *) phystokv (0x40e))) << 4)));
ebda = (grub_uint8_t *) phystokv ((* ((grub_uint16_t *) phystokv (0x40e))) << 4);
ebda_len = * (grub_uint16_t *) ebda;
+ printf("EBDA len %d\n", ebda_len);
if (! ebda_len)
return 0;
for (ptr = ebda; ptr < ebda + 0x400; ptr += 16)
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 6093a66c..209cfb14 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -180,10 +180,14 @@ void machine_init(void)
*(unsigned short *)phystokv(0x472) = 0x1234;
#endif /* MACH_HYP */
+#if VM_MIN_KERNEL_ADDRESS == 0
/*
* Unmap page 0 to trap NULL references.
+ *
+ * Note that this breaks accessing some BIOS areas stored there.
*/
pmap_unmap_page_zero();
+#endif
}
/* Conserve power on processor CPU. */
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 8a23a44d..62b33cf7 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -2835,6 +2835,7 @@ pmap_unmap_page_zero (void)
{
int *pte;
+ printf("Unmapping the zero page. Some BIOS functions may not be working any more.\n");
pte = (int *) pmap_pte (kernel_pmap, 0);
if (!pte)
return;