1*0f4c859eSApple OSS Distributions /*
2*0f4c859eSApple OSS Distributions * Copyright (c) 2003-2007 Apple Inc. All rights reserved.
3*0f4c859eSApple OSS Distributions */
4*0f4c859eSApple OSS Distributions #include <sys/param.h>
5*0f4c859eSApple OSS Distributions #include <sys/kernel.h>
6*0f4c859eSApple OSS Distributions #include <sys/sysctl.h>
7*0f4c859eSApple OSS Distributions
8*0f4c859eSApple OSS Distributions #include <machine/machine_routines.h>
9*0f4c859eSApple OSS Distributions
10*0f4c859eSApple OSS Distributions #include <mach/host_info.h>
11*0f4c859eSApple OSS Distributions #include <mach/mach_host.h>
12*0f4c859eSApple OSS Distributions #include <arm/cpuid.h>
13*0f4c859eSApple OSS Distributions #include <kern/hvg_hypercall.h>
14*0f4c859eSApple OSS Distributions #include <vm/pmap.h>
15*0f4c859eSApple OSS Distributions #include <kern/zalloc.h>
16*0f4c859eSApple OSS Distributions #include <libkern/libkern.h>
17*0f4c859eSApple OSS Distributions #include <pexpert/device_tree.h>
18*0f4c859eSApple OSS Distributions
19*0f4c859eSApple OSS Distributions #if HYPERVISOR
20*0f4c859eSApple OSS Distributions #include <kern/hv_support.h>
21*0f4c859eSApple OSS Distributions #include <kern/bits.h>
22*0f4c859eSApple OSS Distributions #endif
23*0f4c859eSApple OSS Distributions
24*0f4c859eSApple OSS Distributions extern uint64_t wake_abstime;
25*0f4c859eSApple OSS Distributions
26*0f4c859eSApple OSS Distributions #if DEVELOPMENT || DEBUG
27*0f4c859eSApple OSS Distributions /* Various tuneables to modulate selection of WFE in the idle path */
28*0f4c859eSApple OSS Distributions extern int wfe_rec_max;
29*0f4c859eSApple OSS Distributions extern int wfe_allowed;
30*0f4c859eSApple OSS Distributions
31*0f4c859eSApple OSS Distributions extern int wfe_rec_none;
32*0f4c859eSApple OSS Distributions extern uint32_t idle_proximate_timer_wfe;
33*0f4c859eSApple OSS Distributions extern uint32_t idle_proximate_io_wfe_masked;
34*0f4c859eSApple OSS Distributions extern uint32_t idle_proximate_io_wfe_unmasked;
35*0f4c859eSApple OSS Distributions
36*0f4c859eSApple OSS Distributions static
37*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, wfe_rec_max,
38*0f4c859eSApple OSS Distributions CTLFLAG_RW, &wfe_rec_max, 0,
39*0f4c859eSApple OSS Distributions "");
40*0f4c859eSApple OSS Distributions
41*0f4c859eSApple OSS Distributions static
42*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, wfe_allowed,
43*0f4c859eSApple OSS Distributions CTLFLAG_RW, &wfe_allowed, 0,
44*0f4c859eSApple OSS Distributions "");
45*0f4c859eSApple OSS Distributions
46*0f4c859eSApple OSS Distributions static
47*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, idle_timer_wfe,
48*0f4c859eSApple OSS Distributions CTLFLAG_RW, &idle_proximate_timer_wfe, 0,
49*0f4c859eSApple OSS Distributions "");
50*0f4c859eSApple OSS Distributions
51*0f4c859eSApple OSS Distributions static
52*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, idle_io_wfe_masked,
53*0f4c859eSApple OSS Distributions CTLFLAG_RW, &idle_proximate_io_wfe_masked, 0,
54*0f4c859eSApple OSS Distributions "");
55*0f4c859eSApple OSS Distributions static
56*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, idle_io_wfe_unmasked,
57*0f4c859eSApple OSS Distributions CTLFLAG_RW, &idle_proximate_io_wfe_unmasked, 0,
58*0f4c859eSApple OSS Distributions "");
59*0f4c859eSApple OSS Distributions
60*0f4c859eSApple OSS Distributions static
61*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, wfe_rec_none,
62*0f4c859eSApple OSS Distributions CTLFLAG_RW, &wfe_rec_none, 0,
63*0f4c859eSApple OSS Distributions "");
64*0f4c859eSApple OSS Distributions
65*0f4c859eSApple OSS Distributions extern uint64_t wfe_rec_override_mat;
66*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, wfe_rec_override_mat,
67*0f4c859eSApple OSS Distributions CTLFLAG_RW, &wfe_rec_override_mat,
68*0f4c859eSApple OSS Distributions "");
69*0f4c859eSApple OSS Distributions
70*0f4c859eSApple OSS Distributions extern uint64_t wfe_rec_clamp;
71*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, wfe_rec_clamp,
72*0f4c859eSApple OSS Distributions CTLFLAG_RW, &wfe_rec_clamp,
73*0f4c859eSApple OSS Distributions "");
74*0f4c859eSApple OSS Distributions
75*0f4c859eSApple OSS Distributions #endif
76*0f4c859eSApple OSS Distributions
77*0f4c859eSApple OSS Distributions static
78*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, wake_abstime,
79*0f4c859eSApple OSS Distributions CTLFLAG_RD, &wake_abstime,
80*0f4c859eSApple OSS Distributions "Absolute Time at the last wakeup");
81*0f4c859eSApple OSS Distributions
82*0f4c859eSApple OSS Distributions static int
83*0f4c859eSApple OSS Distributions sysctl_time_since_reset SYSCTL_HANDLER_ARGS
84*0f4c859eSApple OSS Distributions {
85*0f4c859eSApple OSS Distributions #pragma unused(arg1, arg2, oidp)
86*0f4c859eSApple OSS Distributions uint64_t return_value = ml_get_time_since_reset();
87*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, &return_value, sizeof(return_value));
88*0f4c859eSApple OSS Distributions }
89*0f4c859eSApple OSS Distributions
90*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep, OID_AUTO, time_since_reset,
91*0f4c859eSApple OSS Distributions CTLFLAG_RD | CTLTYPE_QUAD | CTLFLAG_LOCKED,
92*0f4c859eSApple OSS Distributions 0, 0, sysctl_time_since_reset, "I",
93*0f4c859eSApple OSS Distributions "Continuous time since last SOC boot/wake started");
94*0f4c859eSApple OSS Distributions
95*0f4c859eSApple OSS Distributions static int
96*0f4c859eSApple OSS Distributions sysctl_wake_conttime SYSCTL_HANDLER_ARGS
97*0f4c859eSApple OSS Distributions {
98*0f4c859eSApple OSS Distributions #pragma unused(arg1, arg2, oidp)
99*0f4c859eSApple OSS Distributions uint64_t return_value = ml_get_conttime_wake_time();
100*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, &return_value, sizeof(return_value));
101*0f4c859eSApple OSS Distributions }
102*0f4c859eSApple OSS Distributions
103*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep, OID_AUTO, wake_conttime,
104*0f4c859eSApple OSS Distributions CTLFLAG_RD | CTLTYPE_QUAD | CTLFLAG_LOCKED,
105*0f4c859eSApple OSS Distributions 0, 0, sysctl_wake_conttime, "I",
106*0f4c859eSApple OSS Distributions "Continuous Time at the last wakeup");
107*0f4c859eSApple OSS Distributions
108*0f4c859eSApple OSS Distributions #if defined(HAS_IPI)
109*0f4c859eSApple OSS Distributions static int
cpu_signal_deferred_timer(__unused struct sysctl_oid * oidp,__unused void * arg1,__unused int arg2,struct sysctl_req * req)110*0f4c859eSApple OSS Distributions cpu_signal_deferred_timer(__unused struct sysctl_oid *oidp, __unused void *arg1, __unused int arg2, struct sysctl_req *req)
111*0f4c859eSApple OSS Distributions {
112*0f4c859eSApple OSS Distributions int new_value = 0;
113*0f4c859eSApple OSS Distributions int changed = 0;
114*0f4c859eSApple OSS Distributions
115*0f4c859eSApple OSS Distributions int old_value = (int)ml_cpu_signal_deferred_get_timer();
116*0f4c859eSApple OSS Distributions
117*0f4c859eSApple OSS Distributions int error = sysctl_io_number(req, old_value, sizeof(int), &new_value, &changed);
118*0f4c859eSApple OSS Distributions
119*0f4c859eSApple OSS Distributions if (error == 0 && changed) {
120*0f4c859eSApple OSS Distributions ml_cpu_signal_deferred_adjust_timer((uint64_t)new_value);
121*0f4c859eSApple OSS Distributions }
122*0f4c859eSApple OSS Distributions
123*0f4c859eSApple OSS Distributions return error;
124*0f4c859eSApple OSS Distributions }
125*0f4c859eSApple OSS Distributions
126*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep, OID_AUTO, deferred_ipi_timeout,
127*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_LOCKED,
128*0f4c859eSApple OSS Distributions 0, 0,
129*0f4c859eSApple OSS Distributions cpu_signal_deferred_timer, "I", "Deferred IPI timeout (nanoseconds)");
130*0f4c859eSApple OSS Distributions
131*0f4c859eSApple OSS Distributions #endif /* defined(HAS_IPI) */
132*0f4c859eSApple OSS Distributions
133*0f4c859eSApple OSS Distributions /*
134*0f4c859eSApple OSS Distributions * For source compatibility, here's some machdep.cpu mibs that
135*0f4c859eSApple OSS Distributions * use host_info() to simulate reasonable answers.
136*0f4c859eSApple OSS Distributions */
137*0f4c859eSApple OSS Distributions
138*0f4c859eSApple OSS Distributions SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RW | CTLFLAG_LOCKED, 0,
139*0f4c859eSApple OSS Distributions "CPU info");
140*0f4c859eSApple OSS Distributions
141*0f4c859eSApple OSS Distributions static int
142*0f4c859eSApple OSS Distributions arm_host_info SYSCTL_HANDLER_ARGS
143*0f4c859eSApple OSS Distributions {
144*0f4c859eSApple OSS Distributions __unused struct sysctl_oid *unused_oidp = oidp;
145*0f4c859eSApple OSS Distributions
146*0f4c859eSApple OSS Distributions host_basic_info_data_t hinfo;
147*0f4c859eSApple OSS Distributions mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
148*0f4c859eSApple OSS Distributions #define BSD_HOST 1
149*0f4c859eSApple OSS Distributions kern_return_t kret = host_info((host_t)BSD_HOST,
150*0f4c859eSApple OSS Distributions HOST_BASIC_INFO, (host_info_t)&hinfo, &count);
151*0f4c859eSApple OSS Distributions if (KERN_SUCCESS != kret) {
152*0f4c859eSApple OSS Distributions return EINVAL;
153*0f4c859eSApple OSS Distributions }
154*0f4c859eSApple OSS Distributions
155*0f4c859eSApple OSS Distributions if (sizeof(uint32_t) != arg2) {
156*0f4c859eSApple OSS Distributions panic("size mismatch");
157*0f4c859eSApple OSS Distributions }
158*0f4c859eSApple OSS Distributions
159*0f4c859eSApple OSS Distributions uintptr_t woffset = (uintptr_t)arg1 / sizeof(uint32_t);
160*0f4c859eSApple OSS Distributions uint32_t datum = *(uint32_t *)(((uint32_t *)&hinfo) + woffset);
161*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, &datum, sizeof(datum));
162*0f4c859eSApple OSS Distributions }
163*0f4c859eSApple OSS Distributions
164*0f4c859eSApple OSS Distributions /*
165*0f4c859eSApple OSS Distributions * machdep.cpu.cores_per_package
166*0f4c859eSApple OSS Distributions *
167*0f4c859eSApple OSS Distributions * x86: derived from CPUID data.
168*0f4c859eSApple OSS Distributions * ARM: how many physical cores we have in the AP; aka hw.physicalcpu_max
169*0f4c859eSApple OSS Distributions */
170*0f4c859eSApple OSS Distributions static
171*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, cores_per_package,
172*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
173*0f4c859eSApple OSS Distributions (void *)offsetof(host_basic_info_data_t, physical_cpu_max),
174*0f4c859eSApple OSS Distributions sizeof(integer_t),
175*0f4c859eSApple OSS Distributions arm_host_info, "I", "CPU cores per package");
176*0f4c859eSApple OSS Distributions
177*0f4c859eSApple OSS Distributions /*
178*0f4c859eSApple OSS Distributions * machdep.cpu.core_count
179*0f4c859eSApple OSS Distributions *
180*0f4c859eSApple OSS Distributions * x86: derived from CPUID data.
181*0f4c859eSApple OSS Distributions * ARM: # active physical cores in the AP; aka hw.physicalcpu
182*0f4c859eSApple OSS Distributions */
183*0f4c859eSApple OSS Distributions static
184*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, core_count,
185*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
186*0f4c859eSApple OSS Distributions (void *)offsetof(host_basic_info_data_t, physical_cpu),
187*0f4c859eSApple OSS Distributions sizeof(integer_t),
188*0f4c859eSApple OSS Distributions arm_host_info, "I", "Number of enabled cores per package");
189*0f4c859eSApple OSS Distributions
190*0f4c859eSApple OSS Distributions /*
191*0f4c859eSApple OSS Distributions * machdep.cpu.logical_per_package
192*0f4c859eSApple OSS Distributions *
193*0f4c859eSApple OSS Distributions * x86: derived from CPUID data. Returns ENOENT if HTT bit not set, but
194*0f4c859eSApple OSS Distributions * most x64 CPUs have that, so assume it's available.
195*0f4c859eSApple OSS Distributions * ARM: total # logical cores in the AP; aka hw.logicalcpu_max
196*0f4c859eSApple OSS Distributions */
197*0f4c859eSApple OSS Distributions static
198*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, logical_per_package,
199*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
200*0f4c859eSApple OSS Distributions (void *)offsetof(host_basic_info_data_t, logical_cpu_max),
201*0f4c859eSApple OSS Distributions sizeof(integer_t),
202*0f4c859eSApple OSS Distributions arm_host_info, "I", "CPU logical cpus per package");
203*0f4c859eSApple OSS Distributions
204*0f4c859eSApple OSS Distributions /*
205*0f4c859eSApple OSS Distributions * machdep.cpu.thread_count
206*0f4c859eSApple OSS Distributions *
207*0f4c859eSApple OSS Distributions * x86: derived from CPUID data.
208*0f4c859eSApple OSS Distributions * ARM: # active logical cores in the AP; aka hw.logicalcpu
209*0f4c859eSApple OSS Distributions */
210*0f4c859eSApple OSS Distributions static
211*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, thread_count,
212*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
213*0f4c859eSApple OSS Distributions (void *)offsetof(host_basic_info_data_t, logical_cpu),
214*0f4c859eSApple OSS Distributions sizeof(integer_t),
215*0f4c859eSApple OSS Distributions arm_host_info, "I", "Number of enabled threads per package");
216*0f4c859eSApple OSS Distributions
217*0f4c859eSApple OSS Distributions static SECURITY_READ_ONLY_LATE(char*) brand_string = NULL;
218*0f4c859eSApple OSS Distributions static SECURITY_READ_ONLY_LATE(size_t) brand_string_len = 0;
219*0f4c859eSApple OSS Distributions
220*0f4c859eSApple OSS Distributions /*
221*0f4c859eSApple OSS Distributions * SecureDTLookupEntry() is only guaranteed to work before PE_init_iokit(),
222*0f4c859eSApple OSS Distributions * so we load the brand string (if available) in a startup handler.
223*0f4c859eSApple OSS Distributions */
224*0f4c859eSApple OSS Distributions __startup_func
225*0f4c859eSApple OSS Distributions static void
sysctl_load_brand_string(void)226*0f4c859eSApple OSS Distributions sysctl_load_brand_string(void)
227*0f4c859eSApple OSS Distributions {
228*0f4c859eSApple OSS Distributions DTEntry node;
229*0f4c859eSApple OSS Distributions void const *value = NULL;
230*0f4c859eSApple OSS Distributions unsigned int size = 0;
231*0f4c859eSApple OSS Distributions
232*0f4c859eSApple OSS Distributions if (kSuccess != SecureDTLookupEntry(0, "/product", &node)) {
233*0f4c859eSApple OSS Distributions return;
234*0f4c859eSApple OSS Distributions }
235*0f4c859eSApple OSS Distributions
236*0f4c859eSApple OSS Distributions if (kSuccess != SecureDTGetProperty(node, "product-soc-name", (void const **) &value, &size)) {
237*0f4c859eSApple OSS Distributions return;
238*0f4c859eSApple OSS Distributions }
239*0f4c859eSApple OSS Distributions
240*0f4c859eSApple OSS Distributions if (size == 0) {
241*0f4c859eSApple OSS Distributions return;
242*0f4c859eSApple OSS Distributions }
243*0f4c859eSApple OSS Distributions
244*0f4c859eSApple OSS Distributions brand_string = zalloc_permanent(size, ZALIGN_NONE);
245*0f4c859eSApple OSS Distributions if (brand_string == NULL) {
246*0f4c859eSApple OSS Distributions return;
247*0f4c859eSApple OSS Distributions }
248*0f4c859eSApple OSS Distributions
249*0f4c859eSApple OSS Distributions memcpy(brand_string, value, size);
250*0f4c859eSApple OSS Distributions brand_string_len = size;
251*0f4c859eSApple OSS Distributions }
252*0f4c859eSApple OSS Distributions STARTUP(SYSCTL, STARTUP_RANK_MIDDLE, sysctl_load_brand_string);
253*0f4c859eSApple OSS Distributions
254*0f4c859eSApple OSS Distributions /*
255*0f4c859eSApple OSS Distributions * machdep.cpu.brand_string
256*0f4c859eSApple OSS Distributions *
257*0f4c859eSApple OSS Distributions * x86: derived from CPUID data.
258*0f4c859eSApple OSS Distributions * ARM: Grab the product string from the device tree, if it exists.
259*0f4c859eSApple OSS Distributions * Otherwise, cons something up from the CPUID register.
260*0f4c859eSApple OSS Distributions * the value is already exported via the commpage. So keep it simple.
261*0f4c859eSApple OSS Distributions */
262*0f4c859eSApple OSS Distributions static int
263*0f4c859eSApple OSS Distributions make_brand_string SYSCTL_HANDLER_ARGS
264*0f4c859eSApple OSS Distributions {
265*0f4c859eSApple OSS Distributions __unused struct sysctl_oid *unused_oidp = oidp;
266*0f4c859eSApple OSS Distributions __unused void *unused_arg1 = arg1;
267*0f4c859eSApple OSS Distributions __unused int unused_arg2 = arg2;
268*0f4c859eSApple OSS Distributions
269*0f4c859eSApple OSS Distributions if (brand_string != NULL) {
270*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, brand_string, brand_string_len);
271*0f4c859eSApple OSS Distributions }
272*0f4c859eSApple OSS Distributions
273*0f4c859eSApple OSS Distributions const char *impl;
274*0f4c859eSApple OSS Distributions
275*0f4c859eSApple OSS Distributions switch (cpuid_info()->arm_info.arm_implementor) {
276*0f4c859eSApple OSS Distributions case CPU_VID_APPLE:
277*0f4c859eSApple OSS Distributions impl = "Apple";
278*0f4c859eSApple OSS Distributions break;
279*0f4c859eSApple OSS Distributions case CPU_VID_ARM:
280*0f4c859eSApple OSS Distributions impl = "ARM";
281*0f4c859eSApple OSS Distributions break;
282*0f4c859eSApple OSS Distributions default:
283*0f4c859eSApple OSS Distributions impl = "ARM architecture";
284*0f4c859eSApple OSS Distributions break;
285*0f4c859eSApple OSS Distributions }
286*0f4c859eSApple OSS Distributions
287*0f4c859eSApple OSS Distributions char buf[80];
288*0f4c859eSApple OSS Distributions snprintf(buf, sizeof(buf), "%s processor", impl);
289*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, buf, strlen(buf) + 1);
290*0f4c859eSApple OSS Distributions }
291*0f4c859eSApple OSS Distributions
292*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, brand_string,
293*0f4c859eSApple OSS Distributions CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_LOCKED,
294*0f4c859eSApple OSS Distributions 0, 0, make_brand_string, "A", "CPU brand string");
295*0f4c859eSApple OSS Distributions
296*0f4c859eSApple OSS Distributions
297*0f4c859eSApple OSS Distributions static int
298*0f4c859eSApple OSS Distributions virtual_address_size SYSCTL_HANDLER_ARGS
299*0f4c859eSApple OSS Distributions {
300*0f4c859eSApple OSS Distributions #pragma unused(arg1, arg2, oidp)
301*0f4c859eSApple OSS Distributions int return_value = 64 - T0SZ_BOOT;
302*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, &return_value, sizeof(return_value));
303*0f4c859eSApple OSS Distributions }
304*0f4c859eSApple OSS Distributions
305*0f4c859eSApple OSS Distributions static
306*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep, OID_AUTO, virtual_address_size,
307*0f4c859eSApple OSS Distributions CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_LOCKED,
308*0f4c859eSApple OSS Distributions 0, 0, virtual_address_size, "I",
309*0f4c859eSApple OSS Distributions "Number of addressable bits in userspace virtual addresses");
310*0f4c859eSApple OSS Distributions
311*0f4c859eSApple OSS Distributions
312*0f4c859eSApple OSS Distributions #if DEVELOPMENT || DEBUG
313*0f4c859eSApple OSS Distributions extern uint64_t TLockTimeOut;
314*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, tlto,
315*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &TLockTimeOut,
316*0f4c859eSApple OSS Distributions "Ticket spinlock timeout (MATUs): use with care");
317*0f4c859eSApple OSS Distributions
318*0f4c859eSApple OSS Distributions extern uint32_t timebase_validation;
319*0f4c859eSApple OSS Distributions SYSCTL_UINT(_machdep, OID_AUTO, timebase_validation,
320*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &timebase_validation, 0,
321*0f4c859eSApple OSS Distributions "Monotonicity validation of kernel mach_absolute_time()");
322*0f4c859eSApple OSS Distributions
323*0f4c859eSApple OSS Distributions #if __WKDM_ISA_2P_WORKAROUND__
324*0f4c859eSApple OSS Distributions extern uint64_t wkdmdretries, wkdmdretriespb;
325*0f4c859eSApple OSS Distributions extern uint32_t simulate_wkdm2p_error, wkdm_isa_2p_war_required;
326*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, wkdmdretries,
327*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &wkdmdretries,
328*0f4c859eSApple OSS Distributions "Number of WKDM errata retries");
329*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, wkdmdretriespb,
330*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED, &wkdmdretriespb,
331*0f4c859eSApple OSS Distributions "Number of retries where payload was on page boundary");
332*0f4c859eSApple OSS Distributions SYSCTL_UINT(_machdep, OID_AUTO, simulate_wkdm2p_error,
333*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED,
334*0f4c859eSApple OSS Distributions &simulate_wkdm2p_error, 0, "");
335*0f4c859eSApple OSS Distributions SYSCTL_UINT(_machdep, OID_AUTO, wkdm_isa_2p_war_required,
336*0f4c859eSApple OSS Distributions CTLFLAG_RW | CTLFLAG_LOCKED,
337*0f4c859eSApple OSS Distributions &wkdm_isa_2p_war_required, 0, "");
338*0f4c859eSApple OSS Distributions #endif /* __WKDM_ISA_2P_WORKAROUND__ */
339*0f4c859eSApple OSS Distributions
340*0f4c859eSApple OSS Distributions
341*0f4c859eSApple OSS Distributions /*
342*0f4c859eSApple OSS Distributions * macro to generate a sysctl machdep.cpu.sysreg_* for a given system register
343*0f4c859eSApple OSS Distributions * using __builtin_arm_rsr64.
344*0f4c859eSApple OSS Distributions */
345*0f4c859eSApple OSS Distributions #define SYSCTL_PROC_MACHDEP_CPU_SYSREG(name) \
346*0f4c859eSApple OSS Distributions static int \
347*0f4c859eSApple OSS Distributions sysctl_sysreg_##name SYSCTL_HANDLER_ARGS \
348*0f4c859eSApple OSS Distributions { \
349*0f4c859eSApple OSS Distributions _Pragma("unused(arg1, arg2, oidp)") \
350*0f4c859eSApple OSS Distributions uint64_t return_value = __builtin_arm_rsr64(#name); \
351*0f4c859eSApple OSS Distributions return SYSCTL_OUT(req, &return_value, sizeof(return_value)); \
352*0f4c859eSApple OSS Distributions } \
353*0f4c859eSApple OSS Distributions SYSCTL_PROC(_machdep_cpu, OID_AUTO, sysreg_##name, \
354*0f4c859eSApple OSS Distributions CTLFLAG_RD | CTLTYPE_QUAD | CTLFLAG_LOCKED, \
355*0f4c859eSApple OSS Distributions 0, 0, sysctl_sysreg_##name, "Q", \
356*0f4c859eSApple OSS Distributions #name " register on the current CPU");
357*0f4c859eSApple OSS Distributions
358*0f4c859eSApple OSS Distributions
359*0f4c859eSApple OSS Distributions // CPU system registers
360*0f4c859eSApple OSS Distributions // ARM64: AArch64 Vector Base Address Register
361*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(VBAR_EL1);
362*0f4c859eSApple OSS Distributions // ARM64: AArch64 Memory Attribute Indirection Register
363*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(MAIR_EL1);
364*0f4c859eSApple OSS Distributions // ARM64: AArch64 Translation table base register 1
365*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(TTBR1_EL1);
366*0f4c859eSApple OSS Distributions // ARM64: AArch64 System Control Register
367*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(SCTLR_EL1);
368*0f4c859eSApple OSS Distributions // ARM64: AArch64 Translation Control Register
369*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(TCR_EL1);
370*0f4c859eSApple OSS Distributions // ARM64: AArch64 Memory Model Feature Register 0
371*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(ID_AA64MMFR0_EL1);
372*0f4c859eSApple OSS Distributions // ARM64: AArch64 Instruction Set Attribute Register 1
373*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(ID_AA64ISAR1_EL1);
374*0f4c859eSApple OSS Distributions #if APPLE_ARM64_ARCH_FAMILY
375*0f4c859eSApple OSS Distributions // Apple ID Register
376*0f4c859eSApple OSS Distributions SYSCTL_PROC_MACHDEP_CPU_SYSREG(AIDR_EL1);
377*0f4c859eSApple OSS Distributions #endif /* APPLE_ARM64_ARCH_FAMILY */
378*0f4c859eSApple OSS Distributions
379*0f4c859eSApple OSS Distributions #endif /* DEVELOPMENT || DEBUG */
380*0f4c859eSApple OSS Distributions
381*0f4c859eSApple OSS Distributions
382*0f4c859eSApple OSS Distributions #ifdef ML_IO_TIMEOUTS_ENABLED
383*0f4c859eSApple OSS Distributions /*
384*0f4c859eSApple OSS Distributions * Timeouts for ml_{io|phys}_{read|write}...
385*0f4c859eSApple OSS Distributions * RO on DEVELOPMENT/DEBUG kernels.
386*0f4c859eSApple OSS Distributions */
387*0f4c859eSApple OSS Distributions
388*0f4c859eSApple OSS Distributions #if DEVELOPMENT || DEBUG
389*0f4c859eSApple OSS Distributions #define MMIO_TIMEOUT_FLAGS (CTLFLAG_KERN | CTLFLAG_RW | CTLFLAG_LOCKED)
390*0f4c859eSApple OSS Distributions #else
391*0f4c859eSApple OSS Distributions #define MMIO_TIMEOUT_FLAGS (CTLFLAG_KERN | CTLFLAG_RD | CTLFLAG_LOCKED)
392*0f4c859eSApple OSS Distributions #endif
393*0f4c859eSApple OSS Distributions
394*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, report_phy_read_delay, MMIO_TIMEOUT_FLAGS,
395*0f4c859eSApple OSS Distributions &report_phy_read_delay_to, "Maximum time before io/phys read gets reported or panics");
396*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, report_phy_write_delay, MMIO_TIMEOUT_FLAGS,
397*0f4c859eSApple OSS Distributions &report_phy_write_delay_to, "Maximum time before io/phys write gets reported or panics");
398*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, trace_phy_read_delay, MMIO_TIMEOUT_FLAGS,
399*0f4c859eSApple OSS Distributions &trace_phy_read_delay_to, "Maximum time before io/phys read gets ktraced");
400*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, trace_phy_write_delay, MMIO_TIMEOUT_FLAGS,
401*0f4c859eSApple OSS Distributions &trace_phy_write_delay_to, "Maximum time before io/phys write gets ktraced");
402*0f4c859eSApple OSS Distributions
403*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, phy_read_delay_panic, CTLFLAG_KERN | CTLFLAG_RW | CTLFLAG_LOCKED,
404*0f4c859eSApple OSS Distributions &phy_read_panic, 0, "if set, report-phy-read-delay timeout panics");
405*0f4c859eSApple OSS Distributions SYSCTL_INT(_machdep, OID_AUTO, phy_write_delay_panic, CTLFLAG_KERN | CTLFLAG_RW | CTLFLAG_LOCKED,
406*0f4c859eSApple OSS Distributions &phy_write_panic, 0, "if set, report-phy-write-delay timeout panics");
407*0f4c859eSApple OSS Distributions
408*0f4c859eSApple OSS Distributions #if ML_IO_SIMULATE_STRETCHED_ENABLED
409*0f4c859eSApple OSS Distributions SYSCTL_QUAD(_machdep, OID_AUTO, sim_stretched_io_ns, CTLFLAG_KERN | CTLFLAG_RW | CTLFLAG_LOCKED,
410*0f4c859eSApple OSS Distributions &simulate_stretched_io, "simulate stretched io in ml_read_io, ml_write_io");
411*0f4c859eSApple OSS Distributions #endif /* ML_IO_SIMULATE_STRETCHED_ENABLED */
412*0f4c859eSApple OSS Distributions
413*0f4c859eSApple OSS Distributions #endif /* ML_IO_TIMEOUTS_ENABLED */
414