aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/arch
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-12-05 13:06:57 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-12-05 13:06:57 +0000
commit7e60fdf5b1f934061f26ec514b6dfecb83d7d46b (patch)
treefc0e479173d34bc241de1a6d9abe112a438eb87e /extras/mini-os/arch
parentad25050cd61f16c14b8015e616929c79106bb1b6 (diff)
downloadxen-7e60fdf5b1f934061f26ec514b6dfecb83d7d46b.tar.gz
xen-7e60fdf5b1f934061f26ec514b6dfecb83d7d46b.tar.bz2
xen-7e60fdf5b1f934061f26ec514b6dfecb83d7d46b.zip
minios: Clip memory not usable by Mini-OS (above 1GB)
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'extras/mini-os/arch')
-rw-r--r--extras/mini-os/arch/x86/mm.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c
index b1c0084fe7..07b6da8d1e 100644
--- a/extras/mini-os/arch/x86/mm.c
+++ b/extras/mini-os/arch/x86/mm.c
@@ -420,7 +420,9 @@ static unsigned long demand_map_area_start;
#define DEMAND_MAP_PAGES ((2ULL << 30) / PAGE_SIZE)
#endif
-#ifdef HAVE_LIBC
+#ifndef HAVE_LIBC
+#define HEAP_PAGES 0
+#else
unsigned long heap, brk, heap_mapped, heap_end;
#ifdef __x86_64__
#define HEAP_PAGES ((128ULL << 30) / PAGE_SIZE)
@@ -591,7 +593,7 @@ void arch_init_p2m(unsigned long max_pfn)
void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
{
- unsigned long start_pfn, max_pfn;
+ unsigned long start_pfn, max_pfn, virt_pfns;
printk(" _text: %p\n", &_text);
printk(" _etext: %p\n", &_etext);
@@ -604,7 +606,12 @@ void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p)
start_pfn = PFN_UP(to_phys(start_info.pt_base)) +
start_info.nr_pt_frames + 3;
max_pfn = start_info.nr_pages;
-
+
+ /* We need room for demand mapping and heap, clip available memory */
+ virt_pfns = DEMAND_MAP_PAGES + HEAP_PAGES;
+ if (max_pfn + virt_pfns + 1 < max_pfn)
+ max_pfn = -(virt_pfns + 1);
+
printk(" start_pfn: %lx\n", start_pfn);
printk(" max_pfn: %lx\n", max_pfn);