summaryrefslogtreecommitdiff
path: root/i386/i386/vm_param.h
diff options
context:
space:
mode:
Diffstat (limited to 'i386/i386/vm_param.h')
-rw-r--r--i386/i386/vm_param.h62
1 files changed, 45 insertions, 17 deletions
diff --git a/i386/i386/vm_param.h b/i386/i386/vm_param.h
index edd9522c..056aa52e 100644
--- a/i386/i386/vm_param.h
+++ b/i386/i386/vm_param.h
@@ -31,17 +31,21 @@
#include <xen/public/xen.h>
#endif
+/* To avoid ambiguity in kernel code, make the name explicit */
+#define VM_MIN_USER_ADDRESS VM_MIN_ADDRESS
+#define VM_MAX_USER_ADDRESS VM_MAX_ADDRESS
+
/* The kernel address space is usually 1GB, usually starting at virtual address 0. */
/* This can be changed freely to separate kernel addresses from user addresses
* for better trace support in kdb; the _START symbol has to be offset by the
* same amount. */
#ifdef __x86_64__
-#define VM_MIN_KERNEL_ADDRESS 0x40000000UL
+#define VM_MIN_KERNEL_ADDRESS KERNEL_MAP_BASE
#else
#define VM_MIN_KERNEL_ADDRESS 0xC0000000UL
#endif
-#ifdef MACH_XEN
+#if defined(MACH_XEN) || defined (__x86_64__)
/* PV kernels can be loaded directly to the target virtual address */
#define INIT_VM_MIN_KERNEL_ADDRESS VM_MIN_KERNEL_ADDRESS
#else /* MACH_XEN */
@@ -56,10 +60,11 @@
#else /* PAE */
#define HYP_VIRT_START HYPERVISOR_VIRT_START_NONPAE
#endif /* PAE */
+#define VM_MAX_KERNEL_ADDRESS (HYP_VIRT_START - LINEAR_MIN_KERNEL_ADDRESS + VM_MIN_KERNEL_ADDRESS)
#else
#define HYP_VIRT_START HYPERVISOR_VIRT_START
+#define VM_MAX_KERNEL_ADDRESS (LINEAR_MAX_KERNEL_ADDRESS - LINEAR_MIN_KERNEL_ADDRESS + VM_MIN_KERNEL_ADDRESS)
#endif
-#define VM_MAX_KERNEL_ADDRESS (HYP_VIRT_START - LINEAR_MIN_KERNEL_ADDRESS + VM_MIN_KERNEL_ADDRESS)
#else /* MACH_PV_PAGETABLES */
#define VM_MAX_KERNEL_ADDRESS (LINEAR_MAX_KERNEL_ADDRESS - LINEAR_MIN_KERNEL_ADDRESS + VM_MIN_KERNEL_ADDRESS)
#endif /* MACH_PV_PAGETABLES */
@@ -68,16 +73,26 @@
* Reserve mapping room for the kernel map, which includes
* the device I/O map and the IPC map.
*/
+#ifdef __x86_64__
+/*
+ * Vm structures are quite bigger on 64 bit.
+ * This should be well enough for 8G of physical memory; on the other hand,
+ * maybe not all of them need to be in directly-mapped memory, see the parts
+ * allocated with pmap_steal_memory().
+ */
+#define VM_KERNEL_MAP_SIZE (512 * 1024 * 1024)
+#else
#define VM_KERNEL_MAP_SIZE (152 * 1024 * 1024)
+#endif
/* This is the kernel address range in linear addresses. */
#ifdef __x86_64__
#define LINEAR_MIN_KERNEL_ADDRESS VM_MIN_KERNEL_ADDRESS
-#define LINEAR_MAX_KERNEL_ADDRESS (0x00007fffffffffffUL)
+#define LINEAR_MAX_KERNEL_ADDRESS (0xffffffffffffffffUL)
#else
/* On x86, the kernel virtual address space is actually located
at high linear addresses. */
-#define LINEAR_MIN_KERNEL_ADDRESS (VM_MAX_ADDRESS)
+#define LINEAR_MIN_KERNEL_ADDRESS (VM_MAX_USER_ADDRESS)
#define LINEAR_MAX_KERNEL_ADDRESS (0xffffffffUL)
#endif
@@ -128,7 +143,8 @@
#define VM_PAGE_DIRECTMAP_LIMIT DECL_CONST(0x400000000000, UL)
#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, ULL)
#else
-#define VM_PAGE_MAX_SEGS 3
+#define VM_PAGE_MAX_SEGS 4
+#define VM_PAGE_DMA32_LIMIT DECL_CONST(0x100000000, UL)
#define VM_PAGE_DIRECTMAP_LIMIT (VM_MAX_KERNEL_ADDRESS \
- VM_MIN_KERNEL_ADDRESS \
- VM_KERNEL_MAP_SIZE)
@@ -138,14 +154,17 @@
#ifdef __LP64__
#define VM_PAGE_MAX_SEGS 4
#define VM_PAGE_DMA32_LIMIT DECL_CONST(0x100000000, UL)
-#define VM_PAGE_DIRECTMAP_LIMIT DECL_CONST(0x400000000000, UL)
+#define VM_PAGE_DIRECTMAP_LIMIT (VM_MAX_KERNEL_ADDRESS \
+ - VM_MIN_KERNEL_ADDRESS \
+ - VM_KERNEL_MAP_SIZE + 1)
#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, UL)
#else /* __LP64__ */
#define VM_PAGE_DIRECTMAP_LIMIT (VM_MAX_KERNEL_ADDRESS \
- VM_MIN_KERNEL_ADDRESS \
- VM_KERNEL_MAP_SIZE + 1)
#ifdef PAE
-#define VM_PAGE_MAX_SEGS 3
+#define VM_PAGE_MAX_SEGS 4
+#define VM_PAGE_DMA32_LIMIT DECL_CONST(0x100000000, UL)
#define VM_PAGE_HIGHMEM_LIMIT DECL_CONST(0x10000000000000, ULL)
#else /* PAE */
#define VM_PAGE_MAX_SEGS 3
@@ -159,14 +178,23 @@
*/
#define VM_PAGE_SEG_DMA 0
-#ifdef __LP64__
-#define VM_PAGE_SEG_DMA32 1
-#define VM_PAGE_SEG_DIRECTMAP 2
-#define VM_PAGE_SEG_HIGHMEM 3
-#else /* __LP64__ */
-#define VM_PAGE_SEG_DMA32 1 /* Alias for the DIRECTMAP segment */
-#define VM_PAGE_SEG_DIRECTMAP 1
-#define VM_PAGE_SEG_HIGHMEM 2
-#endif /* __LP64__ */
+#if defined(VM_PAGE_DMA32_LIMIT) && (VM_PAGE_DMA32_LIMIT != VM_PAGE_DIRECTMAP_LIMIT)
+
+#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT
+#define VM_PAGE_SEG_DMA32 (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA32+1)
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DIRECTMAP+1)
+#else /* VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT */
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DMA32 (VM_PAGE_SEG_DIRECTMAP+1)
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DMA32+1)
+#endif
+
+#else
+
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DMA32 VM_PAGE_SEG_DIRECTMAP /* Alias for the DIRECTMAP segment */
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DIRECTMAP+1)
+#endif
#endif /* _I386_KERNEL_I386_VM_PARAM_ */