commit 56aa79949c0896d1b1aa3c87d1d8f359254b8d62
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Mon Mar 30 00:37:50 2026 +0200

    linux: Make vmalloc allocate from DMA32
    
    Otherwise ahci cannot use it with PAE kernels.

diff --git a/linux/dev/glue/kmem.c b/linux/dev/glue/kmem.c
index 23ef03e8..afcbfba5 100644
--- a/linux/dev/glue/kmem.c
+++ b/linux/dev/glue/kmem.c
@@ -536,7 +536,7 @@ vmalloc (unsigned long size)
   kern_return_t ret;
   vm_offset_t addr;
   
-  ret = kmem_alloc_wired (kernel_map, &addr, round_page (size));
+  ret = kmem_alloc_wired_flags (kernel_map, &addr, round_page (size), VM_PAGE_DMA32);
   if (ret != KERN_SUCCESS)
     return NULL;
 
diff --git a/vm/vm_kern.c b/vm/vm_kern.c
index 28316f71..07e3b966 100644
--- a/vm/vm_kern.c
+++ b/vm/vm_kern.c
@@ -153,7 +153,8 @@ projected_buffer_allocate(
 	 */
 	kmem_alloc_pages(object, 0,
 			 *kernel_p, *kernel_p + size,
-			 VM_PROT_READ | VM_PROT_WRITE);
+			 VM_PROT_READ | VM_PROT_WRITE,
+			 VM_PAGE_HIGHMEM);
 	memset((void*) *kernel_p, 0, size);         /*Zero fill*/
 
 	/* Set up physical mappings for user pmap */
@@ -424,7 +425,8 @@ retry:
 	 */
 	kmem_alloc_pages(object, 0,
 			 addr, addr + size,
-			 VM_PROT_DEFAULT);
+			 VM_PROT_DEFAULT,
+			 VM_PAGE_HIGHMEM);
 
 	/*
 	 *	Return the memory, not zeroed.
@@ -521,10 +523,11 @@ retry:
  */
 
 kern_return_t
-kmem_alloc_wired(
+kmem_alloc_wired_flags(
 	vm_map_t 	map,
 	vm_offset_t 	*addrp,
-	vm_size_t 	size)
+	vm_size_t 	size,
+	unsigned	flags)
 {
 	vm_offset_t offset;
 	vm_offset_t addr;
@@ -542,7 +545,8 @@ kmem_alloc_wired(
 	 */
 	kmem_alloc_pages(kernel_object, offset,
 			 addr, addr + size,
-			 VM_PROT_DEFAULT);
+			 VM_PROT_DEFAULT,
+			 flags);
 
 	/*
 	 *	Return the memory, not zeroed.
@@ -550,6 +554,14 @@ kmem_alloc_wired(
 	*addrp = addr;
 	return KERN_SUCCESS;
 }
+kern_return_t
+kmem_alloc_wired(
+	vm_map_t 	map,
+	vm_offset_t 	*addrp,
+	vm_size_t 	size)
+{
+	return kmem_alloc_wired_flags(map, addrp, size, VM_PAGE_HIGHMEM);
+}
 
 /*
  *	kmem_alloc_aligned:
@@ -630,7 +642,8 @@ retry:
 	 */
 	kmem_alloc_pages(kernel_object, offset,
 			 addr, addr + size,
-			 VM_PROT_DEFAULT);
+			 VM_PROT_DEFAULT,
+			 VM_PAGE_HIGHMEM);
 
 	/*
 	 *	Return the memory, not zeroed.
@@ -740,7 +753,8 @@ kmem_alloc_pages(
 	vm_offset_t	offset,
 	vm_offset_t	start, 
 	vm_offset_t	end,
-	vm_prot_t	protection)
+	vm_prot_t	protection,
+	unsigned	flags)
 {
 	/*
 	 *	Mark the pmap region as not pageable.
@@ -755,7 +769,7 @@ kmem_alloc_pages(
 	    /*
 	     *	Allocate a page
 	     */
-	    while ((mem = vm_page_alloc(object, offset))
+	    while ((mem = vm_page_alloc_flags(object, offset, flags))
 			 == VM_PAGE_NULL) {
 		vm_object_unlock(object);
 		VM_PAGE_WAIT((void (*)()) 0);
diff --git a/vm/vm_kern.h b/vm/vm_kern.h
index 13115ff9..b9411522 100644
--- a/vm/vm_kern.h
+++ b/vm/vm_kern.h
@@ -54,6 +54,7 @@ extern kern_return_t	kmem_alloc_pageable(vm_map_t, vm_offset_t *,
 					    vm_size_t);
 extern kern_return_t	kmem_valloc(vm_map_t, vm_offset_t *, vm_size_t);
 extern kern_return_t	kmem_alloc_wired(vm_map_t, vm_offset_t *, vm_size_t);
+extern kern_return_t	kmem_alloc_wired_flags(vm_map_t, vm_offset_t *, vm_size_t, unsigned flags);
 extern kern_return_t	kmem_alloc_aligned(vm_map_t, vm_offset_t *, vm_size_t);
 extern void*		kmem_map_aligned_table(phys_addr_t, vm_size_t, int);
 
@@ -88,7 +89,8 @@ extern void kmem_alloc_pages(
 	vm_offset_t	offset,
 	vm_offset_t	start,
 	vm_offset_t	end,
-	vm_prot_t	protection);
+	vm_prot_t	protection,
+	unsigned	flags);
 
 extern void kmem_remap_pages(
 	vm_object_t	object,
diff --git a/vm/vm_page.h b/vm/vm_page.h
index 49b5e602..4c48f6e6 100644
--- a/vm/vm_page.h
+++ b/vm/vm_page.h
@@ -212,6 +212,10 @@ extern void		vm_page_wait(void (*)(void));
 extern vm_page_t	vm_page_alloc(
 	vm_object_t	object,
 	vm_offset_t	offset);
+extern vm_page_t	vm_page_alloc_flags(
+	vm_object_t	object,
+	vm_offset_t	offset,
+	unsigned flags);
 extern void		vm_page_init(
 	vm_page_t	mem);
 extern void		vm_page_free(vm_page_t);
diff --git a/vm/vm_resident.c b/vm/vm_resident.c
index ed0ae849..e099d95e 100644
--- a/vm/vm_resident.c
+++ b/vm/vm_resident.c
@@ -955,15 +955,16 @@ void vm_page_free_contig(vm_page_t mem, vm_size_t size)
  *	Object must be locked.
  */
 
-vm_page_t vm_page_alloc(
+vm_page_t vm_page_alloc_flags(
 	vm_object_t	object,
-	vm_offset_t	offset)
+	vm_offset_t	offset,
+	unsigned	flags)
 {
 	vm_page_t	mem;
 
 	assert(vm_object_lock_taken(object));
 
-	mem = vm_page_grab(VM_PAGE_HIGHMEM);
+	mem = vm_page_grab(flags);
 	if (mem == VM_PAGE_NULL)
 		return VM_PAGE_NULL;
 
@@ -974,6 +975,13 @@ vm_page_t vm_page_alloc(
 	return mem;
 }
 
+vm_page_t vm_page_alloc(
+	vm_object_t	object,
+	vm_offset_t	offset)
+{
+	return vm_page_alloc_flags(object, offset, VM_PAGE_HIGHMEM);
+}
+
 /*
  *	vm_page_free:
  *
