xref: /xnu-12377.81.4/tests/unit/mocks/mock_alloc.c (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
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