[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.
- Re: [PATCH 1/9] prepare pmap helpers for full 64 bit memory map, (continued)
- [PATCH 2/9] fix x86_64 asm for higher kernel addresses, Luca Dariz, 2023/02/12
- [PATCH 3/9] factor out xen-specific bootstrap, Luca Dariz, 2023/02/12
- [PATCH 4/9] factor out PAE-specific bootstrap, Luca Dariz, 2023/02/12
- [PATCH 7/9] extend data types to hold a 64-bit address, Luca Dariz, 2023/02/12
- [PATCH 9/9] move kernel virtual address space to upper addresses, Luca Dariz, 2023/02/12
- Re: [PATCH 9/9] move kernel virtual address space to upper addresses,
Samuel Thibault <=
- [PATCH 8/9] separate initialization of kernel and user PTP tables, Luca Dariz, 2023/02/12
- Re: [PATCH 0/9 gnumach] move kernel vm map to high addresses on x86_64, Luca, 2023/02/12