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