xref: /xnu-12377.1.9/bsd/tests/pmap_test_sysctl.c (revision f6217f891ac0bb64f3d375211650a4c1ff8ca1ea)
1*f6217f89SApple OSS Distributions /*
2*f6217f89SApple OSS Distributions  * Copyright (c) 2016 Apple Inc. All rights reserved.
3*f6217f89SApple OSS Distributions  *
4*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*f6217f89SApple OSS Distributions  *
6*f6217f89SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*f6217f89SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*f6217f89SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*f6217f89SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*f6217f89SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*f6217f89SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*f6217f89SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*f6217f89SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*f6217f89SApple OSS Distributions  *
15*f6217f89SApple OSS Distributions  * Please obtain a copy of the License at
16*f6217f89SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*f6217f89SApple OSS Distributions  *
18*f6217f89SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*f6217f89SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*f6217f89SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*f6217f89SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*f6217f89SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*f6217f89SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*f6217f89SApple OSS Distributions  * limitations under the License.
25*f6217f89SApple OSS Distributions  *
26*f6217f89SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*f6217f89SApple OSS Distributions  */
28*f6217f89SApple OSS Distributions 
29*f6217f89SApple OSS Distributions #include <sys/sysctl.h>
30*f6217f89SApple OSS Distributions 
31*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_enter_disconnect(unsigned int);
32*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_compress_remove(unsigned int);
33*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_exec_remove(unsigned int);
34*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_nesting(unsigned int);
35*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_iommu_disconnect(void);
36*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_extended(void);
37*f6217f89SApple OSS Distributions extern void test_pmap_call_overhead(unsigned int);
38*f6217f89SApple OSS Distributions extern uint64_t test_pmap_page_protect_overhead(unsigned int, unsigned int);
39*f6217f89SApple OSS Distributions #if CONFIG_SPTM
40*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_huge_pv_list(unsigned int, unsigned int);
41*f6217f89SApple OSS Distributions extern kern_return_t test_pmap_reentrance(unsigned int);
42*f6217f89SApple OSS Distributions extern kern_return_t test_surt(unsigned int);
43*f6217f89SApple OSS Distributions #endif
44*f6217f89SApple OSS Distributions 
45*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_enter_disconnect(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)46*f6217f89SApple OSS Distributions sysctl_test_pmap_enter_disconnect(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
47*f6217f89SApple OSS Distributions {
48*f6217f89SApple OSS Distributions 	unsigned int num_loops;
49*f6217f89SApple OSS Distributions 	int error, changed;
50*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
51*f6217f89SApple OSS Distributions 	if (error || !changed) {
52*f6217f89SApple OSS Distributions 		return error;
53*f6217f89SApple OSS Distributions 	}
54*f6217f89SApple OSS Distributions 	return test_pmap_enter_disconnect(num_loops);
55*f6217f89SApple OSS Distributions }
56*f6217f89SApple OSS Distributions 
57*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_enter_disconnect_test,
58*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
59*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_enter_disconnect, "I", "");
60*f6217f89SApple OSS Distributions 
61*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_compress_remove(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)62*f6217f89SApple OSS Distributions sysctl_test_pmap_compress_remove(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
63*f6217f89SApple OSS Distributions {
64*f6217f89SApple OSS Distributions 	unsigned int num_loops;
65*f6217f89SApple OSS Distributions 	int error, changed;
66*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
67*f6217f89SApple OSS Distributions 	if (error || !changed) {
68*f6217f89SApple OSS Distributions 		return error;
69*f6217f89SApple OSS Distributions 	}
70*f6217f89SApple OSS Distributions 	return test_pmap_compress_remove(num_loops);
71*f6217f89SApple OSS Distributions }
72*f6217f89SApple OSS Distributions 
73*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_compress_remove_test,
74*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
75*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_compress_remove, "I", "");
76*f6217f89SApple OSS Distributions 
77*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_exec_remove(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)78*f6217f89SApple OSS Distributions sysctl_test_pmap_exec_remove(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
79*f6217f89SApple OSS Distributions {
80*f6217f89SApple OSS Distributions 	unsigned int num_loops;
81*f6217f89SApple OSS Distributions 	int error, changed;
82*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
83*f6217f89SApple OSS Distributions 	if (error || !changed) {
84*f6217f89SApple OSS Distributions 		return error;
85*f6217f89SApple OSS Distributions 	}
86*f6217f89SApple OSS Distributions 	return test_pmap_exec_remove(num_loops);
87*f6217f89SApple OSS Distributions }
88*f6217f89SApple OSS Distributions 
89*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_exec_remove_test,
90*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
91*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_exec_remove, "I", "");
92*f6217f89SApple OSS Distributions 
93*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_nesting(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)94*f6217f89SApple OSS Distributions sysctl_test_pmap_nesting(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
95*f6217f89SApple OSS Distributions {
96*f6217f89SApple OSS Distributions 	unsigned int num_loops;
97*f6217f89SApple OSS Distributions 	int error, changed;
98*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
99*f6217f89SApple OSS Distributions 	if (error || !changed) {
100*f6217f89SApple OSS Distributions 		return error;
101*f6217f89SApple OSS Distributions 	}
102*f6217f89SApple OSS Distributions 	return test_pmap_nesting(num_loops);
103*f6217f89SApple OSS Distributions }
104*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_nesting_test,
105*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
106*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_nesting, "I", "");
107*f6217f89SApple OSS Distributions 
108*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_iommu_disconnect(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)109*f6217f89SApple OSS Distributions sysctl_test_pmap_iommu_disconnect(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
110*f6217f89SApple OSS Distributions {
111*f6217f89SApple OSS Distributions 	unsigned int run = 0;
112*f6217f89SApple OSS Distributions 	int error, changed;
113*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(run), &run, &changed);
114*f6217f89SApple OSS Distributions 	if (error || !changed) {
115*f6217f89SApple OSS Distributions 		return error;
116*f6217f89SApple OSS Distributions 	}
117*f6217f89SApple OSS Distributions 	return test_pmap_iommu_disconnect();
118*f6217f89SApple OSS Distributions }
119*f6217f89SApple OSS Distributions 
120*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_iommu_disconnect_test,
121*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
122*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_iommu_disconnect, "I", "");
123*f6217f89SApple OSS Distributions 
124*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_extended(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)125*f6217f89SApple OSS Distributions sysctl_test_pmap_extended(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
126*f6217f89SApple OSS Distributions {
127*f6217f89SApple OSS Distributions 	unsigned int run = 0;
128*f6217f89SApple OSS Distributions 	int error, changed;
129*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(run), &run, &changed);
130*f6217f89SApple OSS Distributions 	if (error || !changed) {
131*f6217f89SApple OSS Distributions 		return error;
132*f6217f89SApple OSS Distributions 	}
133*f6217f89SApple OSS Distributions 	return test_pmap_extended();
134*f6217f89SApple OSS Distributions }
135*f6217f89SApple OSS Distributions 
136*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_extended_test,
137*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
138*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_extended, "I", "");
139*f6217f89SApple OSS Distributions 
140*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_call_overhead(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)141*f6217f89SApple OSS Distributions sysctl_test_pmap_call_overhead(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
142*f6217f89SApple OSS Distributions {
143*f6217f89SApple OSS Distributions 	unsigned int num_loops;
144*f6217f89SApple OSS Distributions 	int error, changed;
145*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
146*f6217f89SApple OSS Distributions 	if (error || !changed) {
147*f6217f89SApple OSS Distributions 		return error;
148*f6217f89SApple OSS Distributions 	}
149*f6217f89SApple OSS Distributions 	test_pmap_call_overhead(num_loops);
150*f6217f89SApple OSS Distributions 	return 0;
151*f6217f89SApple OSS Distributions }
152*f6217f89SApple OSS Distributions 
153*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_call_overhead_test,
154*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
155*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_call_overhead, "I", "");
156*f6217f89SApple OSS Distributions 
157*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_page_protect_overhead(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)158*f6217f89SApple OSS Distributions sysctl_test_pmap_page_protect_overhead(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
159*f6217f89SApple OSS Distributions {
160*f6217f89SApple OSS Distributions 	struct {
161*f6217f89SApple OSS Distributions 		unsigned int num_loops;
162*f6217f89SApple OSS Distributions 		unsigned int num_aliases;
163*f6217f89SApple OSS Distributions 	} ppo_in;
164*f6217f89SApple OSS Distributions 
165*f6217f89SApple OSS Distributions 	int error;
166*f6217f89SApple OSS Distributions 	uint64_t duration;
167*f6217f89SApple OSS Distributions 
168*f6217f89SApple OSS Distributions 	error = SYSCTL_IN(req, &ppo_in, sizeof(ppo_in));
169*f6217f89SApple OSS Distributions 	if (error) {
170*f6217f89SApple OSS Distributions 		return error;
171*f6217f89SApple OSS Distributions 	}
172*f6217f89SApple OSS Distributions 
173*f6217f89SApple OSS Distributions 	duration = test_pmap_page_protect_overhead(ppo_in.num_loops, ppo_in.num_aliases);
174*f6217f89SApple OSS Distributions 	error = SYSCTL_OUT(req, &duration, sizeof(duration));
175*f6217f89SApple OSS Distributions 	return error;
176*f6217f89SApple OSS Distributions }
177*f6217f89SApple OSS Distributions 
178*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_page_protect_overhead_test,
179*f6217f89SApple OSS Distributions     CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_LOCKED, 0, 0, sysctl_test_pmap_page_protect_overhead, "-", "");
180*f6217f89SApple OSS Distributions 
181*f6217f89SApple OSS Distributions #if CONFIG_SPTM
182*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_huge_pv_list(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)183*f6217f89SApple OSS Distributions sysctl_test_pmap_huge_pv_list(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
184*f6217f89SApple OSS Distributions {
185*f6217f89SApple OSS Distributions 	struct {
186*f6217f89SApple OSS Distributions 		unsigned int num_loops;
187*f6217f89SApple OSS Distributions 		unsigned int num_mappings;
188*f6217f89SApple OSS Distributions 	} hugepv_in;
189*f6217f89SApple OSS Distributions 
190*f6217f89SApple OSS Distributions 	int error = SYSCTL_IN(req, &hugepv_in, sizeof(hugepv_in));
191*f6217f89SApple OSS Distributions 	if (error) {
192*f6217f89SApple OSS Distributions 		return error;
193*f6217f89SApple OSS Distributions 	}
194*f6217f89SApple OSS Distributions 	return test_pmap_huge_pv_list(hugepv_in.num_loops, hugepv_in.num_mappings);
195*f6217f89SApple OSS Distributions }
196*f6217f89SApple OSS Distributions 
197*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_huge_pv_list_test,
198*f6217f89SApple OSS Distributions     CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_LOCKED, 0, 0, sysctl_test_pmap_huge_pv_list, "-", "");
199*f6217f89SApple OSS Distributions 
200*f6217f89SApple OSS Distributions static int
sysctl_test_pmap_reentrance(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)201*f6217f89SApple OSS Distributions sysctl_test_pmap_reentrance(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
202*f6217f89SApple OSS Distributions {
203*f6217f89SApple OSS Distributions 	unsigned int num_loops;
204*f6217f89SApple OSS Distributions 	int error, changed;
205*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_loops), &num_loops, &changed);
206*f6217f89SApple OSS Distributions 	if (error || !changed) {
207*f6217f89SApple OSS Distributions 		return error;
208*f6217f89SApple OSS Distributions 	}
209*f6217f89SApple OSS Distributions 	return test_pmap_reentrance(num_loops);
210*f6217f89SApple OSS Distributions }
211*f6217f89SApple OSS Distributions 
212*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, pmap_reentrance_test,
213*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
214*f6217f89SApple OSS Distributions     0, 0, sysctl_test_pmap_reentrance, "I", "");
215*f6217f89SApple OSS Distributions 
216*f6217f89SApple OSS Distributions #if __ARM64_PMAP_SUBPAGE_L1__
217*f6217f89SApple OSS Distributions extern unsigned int surt_list_len(void);
218*f6217f89SApple OSS Distributions static int
sysctl_surt_list_len(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)219*f6217f89SApple OSS Distributions sysctl_surt_list_len(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
220*f6217f89SApple OSS Distributions {
221*f6217f89SApple OSS Distributions 	unsigned int len = surt_list_len();
222*f6217f89SApple OSS Distributions 	return SYSCTL_OUT(req, &len, sizeof(len));
223*f6217f89SApple OSS Distributions }
224*f6217f89SApple OSS Distributions 
225*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, surt_list_len,
226*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
227*f6217f89SApple OSS Distributions     0, 0, sysctl_surt_list_len, "I", "");
228*f6217f89SApple OSS Distributions 
229*f6217f89SApple OSS Distributions static int
sysctl_test_surt(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)230*f6217f89SApple OSS Distributions sysctl_test_surt(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
231*f6217f89SApple OSS Distributions {
232*f6217f89SApple OSS Distributions 	unsigned int num_surts;
233*f6217f89SApple OSS Distributions 	int error, changed;
234*f6217f89SApple OSS Distributions 	error = sysctl_io_number(req, 0, sizeof(num_surts), &num_surts, &changed);
235*f6217f89SApple OSS Distributions 	if (error || !changed) {
236*f6217f89SApple OSS Distributions 		return error;
237*f6217f89SApple OSS Distributions 	}
238*f6217f89SApple OSS Distributions 	return test_surt(num_surts);
239*f6217f89SApple OSS Distributions }
240*f6217f89SApple OSS Distributions 
241*f6217f89SApple OSS Distributions SYSCTL_PROC(_kern, OID_AUTO, surt_test,
242*f6217f89SApple OSS Distributions     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
243*f6217f89SApple OSS Distributions     0, 0, sysctl_test_surt, "I", "");
244*f6217f89SApple OSS Distributions #endif /* __ARM64_PMAP_SUBPAGE_L1__ */
245*f6217f89SApple OSS Distributions #endif /* CONFIG_SPTM */
246