diff options
author | Neal H. Walfield <neal@gnu.org> | 2009-03-23 21:27:37 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2009-03-23 21:27:37 +0100 |
commit | d62e6256649e0e5d2106c753299ce57fd0ca62c4 (patch) | |
tree | e9a9ad68807135090cabc3bacb45db67720e9d77 | |
parent | 76806959d332345e788e85090fd236481ecefcee (diff) |
When adding physical memory, only add multiples of frames.
-rw-r--r-- | viengoos/sysdeps/x86_64/boot64.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/viengoos/sysdeps/x86_64/boot64.c b/viengoos/sysdeps/x86_64/boot64.c index e398a6d..776fe80 100644 --- a/viengoos/sysdeps/x86_64/boot64.c +++ b/viengoos/sysdeps/x86_64/boot64.c @@ -291,15 +291,19 @@ memory_configure (void) + mmap->size + sizeof (mmap->size))) if (mmap->type == 1) { - region->start = phys_to_kv (mmap->base_addr); - if (mmap->base_addr < 2 * GB - && mmap->base_addr + mmap->length > 2 * GB) + /* Round up to a multiple of 4k. */ + uint64_t s = (mmap->base_addr + PAGESIZE - 1) & ~(PAGESIZE - 1); + /* Round down to a multiple of 4k. */ + uint64_t e = (mmap->base_addr + mmap->length) & ~(PAGESIZE - 1); + + region->start = phys_to_kv (s); + if (s < 2 * GB && e > 2 * GB) { region->end = phys_to_kv (2 * GB - 1); region ++; region->start = phys_to_kv (2 * GB); } - region->end = phys_to_kv (mmap->base_addr + mmap->length - 1); + region->end = phys_to_kv (e - 1); region ++; } |