bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 9/9] move kernel virtual address space to upper addresses


From: Luca Dariz
Subject: [PATCH 9/9] move kernel virtual address space to upper addresses
Date: Sun, 12 Feb 2023 18:28:18 +0100

* i386/i386/vm_param.h: adjust constants to the new kernel map
  - the boothdr.S code already sets up a temporary map to higher
    addresses, so we can use INIT_VM_MIN_KERNEL_ADDRESS as in xen
  - increase the kernel map size to accomodate for bigger structures
    and more memory
  - adjust kernel max address and directmap limit
* i386/i386at/biosmem.c: enable directmap check also on x86_64
* i386/include/mach/i386/vm_param.h: increase user virtual memory
  limit as it's not conflicting with the kernel's anymore
* i386/intel/pmap.h: adjust lin2pdenum_cont() and INTEL_PTE_PFN to the
  new kernel map
* x86_64/Makefrag.am: change KERNEL_MAP_BASE to be above 4G, and
  according to mcmodel=kernel. This will allow to use the full memory
  address space.
---
 i386/i386/vm_param.h              | 20 ++++++++++++++++----
 i386/i386at/biosmem.c             |  2 --
 i386/include/mach/i386/vm_param.h |  2 +-
 i386/intel/pmap.h                 | 12 ++++++++++--
 x86_64/Makefrag.am                | 12 ++++++------
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/i386/i386/vm_param.h b/i386/i386/vm_param.h
index c2e623a6..8264ea11 100644
--- a/i386/i386/vm_param.h
+++ b/i386/i386/vm_param.h
@@ -45,7 +45,7 @@
 #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 */
@@ -72,12 +72,22 @@
  * 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      (0x00000000ffffffffUL)
+#define LINEAR_MAX_KERNEL_ADDRESS      (0xffffffffffffffffUL)
 #else
 /* On x86, the kernel virtual address space is actually located
    at high linear addresses. */
@@ -141,8 +151,10 @@
 #else /* MACH_XEN */
 #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_DMA32_LIMIT     DECL_CONST(0x10000000, 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 \
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c
index 78e7bb21..880989fe 100644
--- a/i386/i386at/biosmem.c
+++ b/i386/i386at/biosmem.c
@@ -637,10 +637,8 @@ biosmem_setup_allocator(const struct multiboot_raw_info 
*mbi)
      */
     end = vm_page_trunc((mbi->mem_upper + 1024) << 10);
 
-#ifndef __LP64__
     if (end > VM_PAGE_DIRECTMAP_LIMIT)
         end = VM_PAGE_DIRECTMAP_LIMIT;
-#endif /* __LP64__ */
 
     max_heap_start = 0;
     max_heap_end = 0;
diff --git a/i386/include/mach/i386/vm_param.h 
b/i386/include/mach/i386/vm_param.h
index a684ed97..e98f032c 100644
--- a/i386/include/mach/i386/vm_param.h
+++ b/i386/include/mach/i386/vm_param.h
@@ -74,7 +74,7 @@
    */
 #define VM_MIN_ADDRESS         (0)
 #ifdef __x86_64__
-#define VM_MAX_ADDRESS         (0x40000000UL)
+#define VM_MAX_ADDRESS         (0xC0000000UL)
 #else
 #define VM_MAX_ADDRESS         (0xc0000000UL)
 #endif
diff --git a/i386/intel/pmap.h b/i386/intel/pmap.h
index 34c7cc89..78d27bc8 100644
--- a/i386/intel/pmap.h
+++ b/i386/intel/pmap.h
@@ -77,10 +77,10 @@ typedef phys_addr_t pt_entry_t;
 #define PDPNUM_KERNEL  (((VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) >> 
PDPSHIFT) + 1)
 #define PDPNUM_USER    (((VM_MAX_USER_ADDRESS - VM_MIN_USER_ADDRESS) >> 
PDPSHIFT) + 1)
 #define PDPMASK                0x1ff   /* mask for page directory pointer 
index */
-#else
+#else /* __x86_64__ */
 #define PDPNUM         4       /* number of page directory pointers */
 #define PDPMASK                3       /* mask for page directory pointer 
index */
-#endif
+#endif /* __x86_64__ */
 #define PDPSHIFT       30      /* page directory pointer */
 #define PDESHIFT       21      /* page descriptor shift */
 #define PDEMASK                0x1ff   /* mask for page descriptor index */
@@ -109,7 +109,11 @@ typedef phys_addr_t pt_entry_t;
 #if PAE
 /* Special version assuming contiguous page directories.  Making it
    include the page directory pointer table index too.  */
+#ifdef __x86_64__
+#define lin2pdenum_cont(a)     (((a) >> PDESHIFT) & 0x3ff)
+#else
 #define lin2pdenum_cont(a)     (((a) >> PDESHIFT) & 0x7ff)
+#endif
 #else
 #define lin2pdenum_cont(a)     lin2pdenum(a)
 #endif
@@ -155,7 +159,11 @@ typedef phys_addr_t pt_entry_t;
 #endif /* MACH_PV_PAGETABLES */
 #define INTEL_PTE_WIRED                0x00000200
 #ifdef PAE
+#ifdef __x86_64__
+#define INTEL_PTE_PFN          0xfffffffffffff000ULL
+#else /* __x86_64__ */
 #define INTEL_PTE_PFN          0x00007ffffffff000ULL
+#endif/* __x86_64__ */
 #else
 #define INTEL_PTE_PFN          0xfffff000
 #endif
diff --git a/x86_64/Makefrag.am b/x86_64/Makefrag.am
index 03b1eca7..d3735890 100644
--- a/x86_64/Makefrag.am
+++ b/x86_64/Makefrag.am
@@ -186,12 +186,12 @@ include_mach_x86_64_HEADERS = \
 #
 
 if PLATFORM_at
-# This should probably be 0xffffffff80000000 for mcmodel=kernel, but let's try
-# to stay in the first 8G first, otherwise we have to fix the pmap module to
-# actually use the l4 page level
-#KERNEL_MAP_BASE=0x100000000
-# but for nor try with < 4G, otherwise we have linker errors
-KERNEL_MAP_BASE=0x40000000
+# For now simply keep all the kernel virtual space in the last 2G.
+# We could use a more elaborate schema if needed (e.g. reserving a
+# larger area for directmap or the kernel heap)), I think only the
+# test/bss/data sections need to be placed here kere because of
+# -mcmodel=kernel
+KERNEL_MAP_BASE=0xffffffff80000000
 gnumach_LINKFLAGS += \
        --defsym _START_MAP=$(_START_MAP) \
        --defsym _START=$(_START_MAP) \
-- 
2.30.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]