1 /* 2 * Copyright (c) 2000-2024 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29 #include "std_safe.h" 30 #include "unit_test_utils.h" 31 32 #include <kern/zalloc.h> 33 #include <kern/kalloc.h> 34 #include <vm/vm_kern_xnu.h> 35 #include <kern/zalloc_internal.h> 36 37 38 #undef kalloc_ext 39 40 T_MOCK(struct kalloc_result, 41 kalloc_ext, ( 42 void *kheap_or_kt_view, 43 vm_size_t size, 44 zalloc_flags_t flags, 45 void *owner)) 46 { 47 void* addr = calloc(1, size); 48 return (struct kalloc_result){ .addr = addr, .size = size }; 49 } 50 51 52 T_MOCK(void, 53 kfree_ext, (void *kheap_or_kt_view, void *data, vm_size_t size)) 54 { 55 free(data); 56 } 57 58 T_MOCK(void *, 59 kalloc_type_impl_internal, (kalloc_type_view_t kt_view, zalloc_flags_t flags)) 60 { 61 return calloc(1, kt_view->kt_size); 62 } 63 T_MOCK(void *, 64 kalloc_type_impl_external, (kalloc_type_view_t kt_view, zalloc_flags_t flags)) 65 { 66 return calloc(1, kt_view->kt_size); 67 } 68 69 T_MOCK(kmem_return_t, 70 kmem_alloc_guard, ( 71 vm_map_t map, 72 vm_size_t size, 73 vm_offset_t mask, 74 kma_flags_t flags, 75 kmem_guard_t guard)) 76 { 77 kmem_return_t kmr = { }; 78 kmr.kmr_address = (vm_address_t)calloc(1, size); 79 // TODO verify allocation rdar://136915968 80 // TODO malloc with guard pages? 81 kmr.kmr_return = KERN_SUCCESS; 82 return kmr; 83 } 84 85 T_MOCK(vm_size_t, 86 kmem_free_guard, ( 87 vm_map_t map, 88 vm_offset_t req_addr, 89 vm_size_t req_size, 90 kmf_flags_t flags, 91 kmem_guard_t guard)) 92 { 93 // TODO rdar://136915968 94 return req_size; 95 } 96 97 T_MOCK(void *, 98 zalloc_permanent_tag, (vm_size_t size, vm_offset_t mask, vm_tag_t tag)) 99 { 100 // mask is align-1, see ZALIGN() 101 return checked_alloc_align(size, mask + 1); 102 } 103 104 T_MOCK(void *, 105 zalloc_percpu_permanent, (vm_size_t size, vm_offset_t mask)) 106 { 107 return MOCK_zalloc_permanent_tag(size, mask, 0); 108 } 109 110 T_MOCK(void, 111 zalloc_ro_mut, (zone_id_t zid, void *elem, vm_offset_t offset, const void *new_data, vm_size_t new_data_size)) 112 { 113 memcpy((void *)((uintptr_t)elem + offset), new_data, new_data_size); 114 } 115 116 T_MOCK(void, 117 zone_require, (zone_t zone, void *addr)) 118 { 119 // TODO rdar://136915968 120 } 121 122 T_MOCK(void, 123 zone_id_require, (zone_id_t zid, vm_size_t esize, void *addr)) 124 { 125 // TODO rdar://136915968 126 } 127 128 T_MOCK(void, 129 zone_enable_caching, (zone_t zone)) 130 { 131 } 132 133 void *mock_mem_alloc_vm_object(void); 134 135 T_MOCK(struct kalloc_result, 136 zalloc_ext, (zone_t zone, zone_stats_t zstats, zalloc_flags_t flags)) 137 { 138 void* addr = NULL; 139 if (strcmp(zone->z_name, "vm objects") == 0) { 140 addr = mock_mem_alloc_vm_object(); 141 } else { 142 addr = calloc(1, zone->z_elem_size); 143 } 144 return (struct kalloc_result){ (void *)addr, zone->z_elem_size }; 145 } 146 147 T_MOCK(void, 148 zfree_ext, (zone_t zone, zone_stats_t zstats, void *addr, uint64_t combined_size)) 149 { 150 // TODO rdar://136915968 151 } 152 153 T_MOCK(void, 154 zone_enable_smr, (zone_t zone, struct smr *smr, zone_smr_free_cb_t free_cb)) 155 { 156 } 157