bug-hurd
[Top][All Lists]
Advanced

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

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


From: Samuel Thibault
Subject: Re: [PATCH 9/9] move kernel virtual address space to upper addresses
Date: Sun, 12 Feb 2023 19:24:45 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!!

Luca Dariz, le dim. 12 févr. 2023 18:28:18 +0100, a ecrit:
> * 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
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

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