]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/kext_alloc.c
xnu-4570.71.2.tar.gz
[apple/xnu.git] / osfmk / kern / kext_alloc.c
index c44446335b4927881861b30280b91409077bb7c1..479d114e32824c1a73fd18ac35d1992bca3fea85 100644 (file)
@@ -38,6 +38,7 @@
 
 #include <mach-o/loader.h>
 #include <libkern/kernel_mach_header.h>
+#include <san/kasan.h>
 
 #define KASLR_IOREG_DEBUG 0
 
@@ -75,9 +76,11 @@ kext_alloc_init(void)
      */
 
     text = getsegbyname(SEG_TEXT);
-    text_start = vm_map_trunc_page(text->vmaddr);
+    text_start = vm_map_trunc_page(text->vmaddr,
+                                  VM_MAP_PAGE_MASK(kernel_map));
     text_start &= ~((512ULL * 1024 * 1024 * 1024) - 1);
-    text_end = vm_map_round_page(text->vmaddr + text->vmsize);
+    text_end = vm_map_round_page(text->vmaddr + text->vmsize,
+                                VM_MAP_PAGE_MASK(kernel_map));
     text_size = text_end - text_start;
 
     kext_alloc_base = KEXT_ALLOC_BASE(text_end);
@@ -91,7 +94,8 @@ kext_alloc_init(void)
          * kexts
          */
         kext_post_boot_base = 
-            vm_map_round_page(kext_alloc_base + prelinkTextSegment->vmsize);
+               vm_map_round_page(kext_alloc_base + prelinkTextSegment->vmsize,
+                                 VM_MAP_PAGE_MASK(kernel_map));
     }
     else {
         kext_post_boot_base = kext_alloc_base;
@@ -101,6 +105,7 @@ kext_alloc_init(void)
     rval = kmem_suballoc(kernel_map, (vm_offset_t *) &kext_alloc_base, 
                         kext_alloc_size, /* pageable */ TRUE,
                         VM_FLAGS_FIXED|VM_FLAGS_OVERWRITE,
+                        VM_MAP_KERNEL_FLAGS_NONE, VM_KERN_MEMORY_KEXT,
                         &g_kext_map);
     if (rval != KERN_SUCCESS) {
            panic("kext_alloc_init: kmem_suballoc failed 0x%x\n", rval);
@@ -146,11 +151,12 @@ kext_alloc(vm_offset_t *_addr, vm_size_t size, boolean_t fixed)
      * fixed (post boot) kext allocations to start looking for free space 
      * just past where prelinked kexts have loaded.  
      */
-    rval = mach_vm_map(g_kext_map, 
+    rval = mach_vm_map_kernel(g_kext_map,
                        &addr, 
                        size, 
                        0,
                        flags,
+                       VM_KERN_MEMORY_KEXT,
                        MACH_PORT_NULL,
                        0,
                        TRUE,
@@ -162,7 +168,7 @@ kext_alloc(vm_offset_t *_addr, vm_size_t size, boolean_t fixed)
         goto finish;
     }
 #else
-    rval = mach_vm_allocate(g_kext_map, &addr, size, flags);
+    rval = mach_vm_allocate_kernel(g_kext_map, &addr, size, flags, VM_KERN_MEMORY_KEXT);
     if (rval != KERN_SUCCESS) {
         printf("vm_allocate failed - %d\n", rval);
         goto finish;
@@ -178,6 +184,9 @@ kext_alloc(vm_offset_t *_addr, vm_size_t size, boolean_t fixed)
 
     *_addr = (vm_offset_t)addr;
     rval = KERN_SUCCESS;
+#if KASAN
+    kasan_notify_address(addr, size);
+#endif
 
 finish:
     return rval;