summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-03-23 21:27:37 +0100
committerNeal H. Walfield <neal@gnu.org>2009-03-23 21:27:37 +0100
commitd62e6256649e0e5d2106c753299ce57fd0ca62c4 (patch)
treee9a9ad68807135090cabc3bacb45db67720e9d77
parent76806959d332345e788e85090fd236481ecefcee (diff)
When adding physical memory, only add multiples of frames.
-rw-r--r--viengoos/sysdeps/x86_64/boot64.c12
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 ++;
}