diff options
Diffstat (limited to 'i386/i386/vm_param.h')
-rw-r--r-- | i386/i386/vm_param.h | 62 |
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_ */ |