summaryrefslogtreecommitdiff
path: root/i386/i386at
diff options
context:
space:
mode:
Diffstat (limited to 'i386/i386at')
-rw-r--r--i386/i386at/model_dep.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 4e7093c..f6e797c 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -261,6 +261,8 @@ void db_reset_cpu(void)
void
mem_size_init(void)
{
+ vm_offset_t max_phys_size;
+
/* Physical memory on all PCs starts at physical address 0.
XX make it a constant. */
phys_first_addr = 0;
@@ -285,12 +287,13 @@ mem_size_init(void)
printf("AT386 boot: physical memory from 0x%x to 0x%x\n",
phys_first_addr, phys_last_addr);
- /* Reserve 1/6 of the memory address space for virtual mappings.
+ /* Reserve room for virtual mappings.
* Yes, this loses memory. Blame i386. */
- if (phys_last_addr > ((VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 6) * 5) {
- phys_last_addr = ((VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 6) * 5;
+ max_phys_size = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS - VM_KERNEL_MAP_SIZE;
+ if (phys_last_addr - phys_first_addr > max_phys_size) {
+ phys_last_addr = phys_first_addr + max_phys_size;
printf("Truncating memory size to %dMiB\n", (phys_last_addr - phys_first_addr) / (1024 * 1024));
- /* TODO Xen: free lost memory */
+ /* TODO Xen: be nice, free lost memory */
}
phys_first_addr = round_page(phys_first_addr);