From eff4f7477b38b5b794ce1ede7766af1dcb6f8fde Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 9 Aug 2023 23:55:34 +0200 Subject: Fix missing DMA32 limit Rumpdisk needs to allocate dma32 memory areas, so we do always need this limit. The non-Xen x86_64 case had a typo, and the 32bit PAE case didn't have the DMA32 limit. Also, we have to cope with VM_PAGE_DMA32_LIMIT being either above or below VM_PAGE_DIRECTMAP_LIMIT depending on the cases. --- i386/i386/vm_param.h | 8 +++++--- i386/i386at/biosmem.c | 19 +++++++++++++++++++ vm/vm_user.c | 8 ++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/i386/i386/vm_param.h b/i386/i386/vm_param.h index 05aeab33..19b5d9c1 100644 --- a/i386/i386/vm_param.h +++ b/i386/i386/vm_param.h @@ -143,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) @@ -152,7 +153,7 @@ #else /* MACH_XEN */ #ifdef __LP64__ #define VM_PAGE_MAX_SEGS 4 -#define VM_PAGE_DMA32_LIMIT DECL_CONST(0x10000000, UL) +#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 + 1) @@ -162,7 +163,8 @@ - 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 diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c index 880989fe..6d0a03ae 100644 --- a/i386/i386at/biosmem.c +++ b/i386/i386at/biosmem.c @@ -692,7 +692,9 @@ biosmem_bootstrap_common(void) biosmem_set_segment(VM_PAGE_SEG_DMA, phys_start, phys_end); phys_start = VM_PAGE_DMA_LIMIT; + #ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT phys_end = VM_PAGE_DMA32_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); @@ -702,7 +704,9 @@ biosmem_bootstrap_common(void) biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end); phys_start = VM_PAGE_DMA32_LIMIT; +#endif #endif /* VM_PAGE_DMA32_LIMIT */ + phys_end = VM_PAGE_DIRECTMAP_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); @@ -712,6 +716,21 @@ biosmem_bootstrap_common(void) biosmem_set_segment(VM_PAGE_SEG_DIRECTMAP, phys_start, phys_end); phys_start = VM_PAGE_DIRECTMAP_LIMIT; + +#ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT + phys_end = VM_PAGE_DMA32_LIMIT; + error = biosmem_map_find_avail(&phys_start, &phys_end); + + if (error) + return; + + biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end); + + phys_start = VM_PAGE_DMA32_LIMIT; +#endif +#endif /* VM_PAGE_DMA32_LIMIT */ + phys_end = VM_PAGE_HIGHMEM_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); diff --git a/vm/vm_user.c b/vm/vm_user.c index df597267..18f79eda 100644 --- a/vm/vm_user.c +++ b/vm/vm_user.c @@ -607,11 +607,19 @@ kern_return_t vm_allocate_contiguous( selector = VM_PAGE_SEL_DMA; if (pmax > VM_PAGE_DMA_LIMIT) #ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT selector = VM_PAGE_SEL_DMA32; if (pmax > VM_PAGE_DMA32_LIMIT) +#endif #endif selector = VM_PAGE_SEL_DIRECTMAP; if (pmax > VM_PAGE_DIRECTMAP_LIMIT) +#ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT + selector = VM_PAGE_SEL_DMA32; + if (pmax > VM_PAGE_DMA32_LIMIT) +#endif +#endif selector = VM_PAGE_SEL_HIGHMEM; size = vm_page_round(size); -- cgit v1.2.3