* Reserve an area of virtual address space for mappings and Heap
*/
static unsigned long demand_map_area_start;
-#ifdef __x86_64__
-#define DEMAND_MAP_PAGES ((128ULL << 30) / PAGE_SIZE)
-#else
-#define DEMAND_MAP_PAGES ((2ULL << 30) / PAGE_SIZE)
-#endif
-
-#ifndef HAVE_LIBC
-#define HEAP_PAGES 0
-#else
+static unsigned long demand_map_area_end;
+#ifdef HAVE_LIBC
unsigned long heap, brk, heap_mapped, heap_end;
-#ifdef __x86_64__
-#define HEAP_PAGES ((128ULL << 30) / PAGE_SIZE)
-#else
-#define HEAP_PAGES ((1ULL << 30) / PAGE_SIZE)
-#endif
#endif
-void arch_init_demand_mapping_area(unsigned long cur_pfn)
+void arch_init_demand_mapping_area(void)
{
- cur_pfn++;
-
- demand_map_area_start = (unsigned long) pfn_to_virt(cur_pfn);
- cur_pfn += DEMAND_MAP_PAGES;
- printk("Demand map pfns at %lx-%p.\n",
- demand_map_area_start, pfn_to_virt(cur_pfn));
+ demand_map_area_start = VIRT_DEMAND_AREA;
+ demand_map_area_end = demand_map_area_start + DEMAND_MAP_PAGES * PAGE_SIZE;
+ printk("Demand map pfns at %lx-%lx.\n", demand_map_area_start,
+ demand_map_area_end);
#ifdef HAVE_LIBC
- cur_pfn++;
- heap_mapped = brk = heap = (unsigned long) pfn_to_virt(cur_pfn);
- cur_pfn += HEAP_PAGES;
- heap_end = (unsigned long) pfn_to_virt(cur_pfn);
+ heap_mapped = brk = heap = VIRT_HEAP_AREA;
+ heap_end = heap_mapped + HEAP_PAGES * PAGE_SIZE;
printk("Heap resides at %lx-%lx.\n", brk, heap_end);
#endif
}
start_pfn = PFN_UP(to_phys(start_info.pt_base)) + start_info.nr_pt_frames;
max_pfn = start_info.nr_pages;
- /* We need room for demand mapping and heap, clip available memory */
-#if defined(__i386__)
- {
- unsigned long virt_pfns = 1 + DEMAND_MAP_PAGES + 1 + HEAP_PAGES;
- if (max_pfn + virt_pfns >= 0x100000)
- max_pfn = 0x100000 - virt_pfns - 1;
- }
-#endif
+ if ( max_pfn >= MAX_MEM_SIZE / PAGE_SIZE )
+ max_pfn = MAX_MEM_SIZE / PAGE_SIZE - 1;
printk(" start_pfn: %lx\n", start_pfn);
printk(" max_pfn: %lx\n", max_pfn);
*
* Virtual address space usage:
*
- * 1:1 mapping of physical memory starting at VA(0)
- * 1 unallocated page
- * demand map area (32 bits: 2 GB, 64 bits: 128 GB) for virtual allocations
- * 1 unallocated page
- * with libc: heap area (32 bits: 1 GB, 64 bits: 128 GB)
+ * area x86-64 x86-32
+ * ------------------------------------------------------------
+ * mapped physical memory 00000000 00000000
+ * kernel virtual mappings 8000000000 3f000000
+ * demand mappings 100000000000 40000000
+ * heap (with libc only) 200000000000 b0000000
+ *
*/
#define L1_FRAME 1
typedef uint64_t pgentry_t;
#endif
+#define MAX_MEM_SIZE 0x3f000000UL
+#define VIRT_KERNEL_AREA 0x3f000000UL
+#define VIRT_DEMAND_AREA 0x40000000UL
+#define VIRT_HEAP_AREA 0xb0000000UL
+
+#define DEMAND_MAP_PAGES 0x6ffffUL
+#define HEAP_PAGES_MAX ((HYPERVISOR_VIRT_START - VIRT_HEAP_AREA) / \
+ PAGE_SIZE - 1)
+
#elif defined(__x86_64__)
#define L2_PAGETABLE_SHIFT 21
typedef unsigned long pgentry_t;
#endif
+#define MAX_MEM_SIZE (512ULL << 30)
+#define VIRT_KERNEL_AREA 0x0000008000000000UL
+#define VIRT_DEMAND_AREA 0x0000100000000000UL
+#define VIRT_HEAP_AREA 0x0000200000000000UL
+
+#define DEMAND_MAP_PAGES 0x8000000UL
+#define HEAP_PAGES_MAX 0x8000000UL
+
+#endif
+
+#ifndef HAVE_LIBC
+#define HEAP_PAGES 0
+#else
+#define HEAP_PAGES HEAP_PAGES_MAX
#endif
#define L1_MASK ((1UL << L2_PAGETABLE_SHIFT) - 1)