xref: /xnu-8020.101.4/bsd/sys/kdebug_common.h (revision e7776783b89a353188416a9a346c6cdb4928faad)
1*e7776783SApple OSS Distributions /*
2*e7776783SApple OSS Distributions  * Copyright (c) 2000-2020 Apple Inc. All rights reserved.
3*e7776783SApple OSS Distributions  *
4*e7776783SApple OSS Distributions  * @Apple_LICENSE_HEADER_START@
5*e7776783SApple OSS Distributions  *
6*e7776783SApple OSS Distributions  * The contents of this file constitute Original Code as defined in and
7*e7776783SApple OSS Distributions  * are subject to the Apple Public Source License Version 1.1 (the
8*e7776783SApple OSS Distributions  * "License").  You may not use this file except in compliance with the
9*e7776783SApple OSS Distributions  * License.  Please obtain a copy of the License at
10*e7776783SApple OSS Distributions  * http://www.apple.com/publicsource and read it before using this file.
11*e7776783SApple OSS Distributions  *
12*e7776783SApple OSS Distributions  * This Original Code and all software distributed under the License are
13*e7776783SApple OSS Distributions  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14*e7776783SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15*e7776783SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16*e7776783SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17*e7776783SApple OSS Distributions  * License for the specific language governing rights and limitations
18*e7776783SApple OSS Distributions  * under the License.
19*e7776783SApple OSS Distributions  *
20*e7776783SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
21*e7776783SApple OSS Distributions  */
22*e7776783SApple OSS Distributions 
23*e7776783SApple OSS Distributions #include <sys/kdebug_private.h>
24*e7776783SApple OSS Distributions #include <sys/param.h>
25*e7776783SApple OSS Distributions #include <kern/assert.h>
26*e7776783SApple OSS Distributions #include <mach/clock_types.h>
27*e7776783SApple OSS Distributions #include <mach/mach_types.h>
28*e7776783SApple OSS Distributions #include <sys/mcache.h>
29*e7776783SApple OSS Distributions #include <vm/vm_kern.h>
30*e7776783SApple OSS Distributions #include <kern/cpu_number.h>
31*e7776783SApple OSS Distributions #include <kern/cpu_data.h>
32*e7776783SApple OSS Distributions #include <mach/mach_time.h>
33*e7776783SApple OSS Distributions #include <kern/clock.h>
34*e7776783SApple OSS Distributions #include <kern/thread.h>
35*e7776783SApple OSS Distributions #include <sys/systm.h>
36*e7776783SApple OSS Distributions #include <machine/machine_routines.h>
37*e7776783SApple OSS Distributions #include <kperf/kperf.h>
38*e7776783SApple OSS Distributions #include <mach/mach_host.h>             /* for host_info() */
39*e7776783SApple OSS Distributions 
40*e7776783SApple OSS Distributions #if defined(__i386__) || defined(__x86_64__)
41*e7776783SApple OSS Distributions #include <i386/rtclock_protos.h>
42*e7776783SApple OSS Distributions #include <i386/mp.h>
43*e7776783SApple OSS Distributions #include <i386/machine_routines.h>
44*e7776783SApple OSS Distributions #include <i386/tsc.h>
45*e7776783SApple OSS Distributions #endif
46*e7776783SApple OSS Distributions 
47*e7776783SApple OSS Distributions 
48*e7776783SApple OSS Distributions #ifndef BSD_SYS_KDEBUG_COMMON_H
49*e7776783SApple OSS Distributions #define BSD_SYS_KDEBUG_COMMON_H
50*e7776783SApple OSS Distributions 
51*e7776783SApple OSS Distributions #define TRIAGE_EVENTS_PER_STORAGE_UNIT        128
52*e7776783SApple OSS Distributions #define TRIAGE_MIN_STORAGE_UNITS_PER_CPU      1
53*e7776783SApple OSS Distributions 
54*e7776783SApple OSS Distributions #define TRACE_EVENTS_PER_STORAGE_UNIT         2048
55*e7776783SApple OSS Distributions #define TRACE_MIN_STORAGE_UNITS_PER_CPU       4
56*e7776783SApple OSS Distributions 
57*e7776783SApple OSS Distributions #define SLOW_NOLOG  0x01
58*e7776783SApple OSS Distributions #define SLOW_CHECKS 0x02
59*e7776783SApple OSS Distributions 
60*e7776783SApple OSS Distributions extern lck_grp_t kdebug_lck_grp;
61*e7776783SApple OSS Distributions 
62*e7776783SApple OSS Distributions struct kd_buf;
63*e7776783SApple OSS Distributions union kds_ptr {
64*e7776783SApple OSS Distributions 	struct {
65*e7776783SApple OSS Distributions 		uint32_t buffer_index:21;
66*e7776783SApple OSS Distributions 		uint16_t offset:11;
67*e7776783SApple OSS Distributions 	};
68*e7776783SApple OSS Distributions 	uint32_t raw;
69*e7776783SApple OSS Distributions };
70*e7776783SApple OSS Distributions 
71*e7776783SApple OSS Distributions /*
72*e7776783SApple OSS Distributions  * Ensure that both LP32 and LP64 variants of arm64 use the same kd_buf
73*e7776783SApple OSS Distributions  * structure.
74*e7776783SApple OSS Distributions  */
75*e7776783SApple OSS Distributions #if defined(__arm64__)
76*e7776783SApple OSS Distributions typedef uint64_t kd_buf_argtype;
77*e7776783SApple OSS Distributions #else
78*e7776783SApple OSS Distributions typedef uintptr_t kd_buf_argtype;
79*e7776783SApple OSS Distributions #endif
80*e7776783SApple OSS Distributions 
81*e7776783SApple OSS Distributions struct kd_storage {
82*e7776783SApple OSS Distributions 	union   kds_ptr kds_next;
83*e7776783SApple OSS Distributions 	uint32_t kds_bufindx;
84*e7776783SApple OSS Distributions 	uint32_t kds_bufcnt;
85*e7776783SApple OSS Distributions 	uint32_t kds_readlast;
86*e7776783SApple OSS Distributions 	uint32_t kds_lostevents:1,
87*e7776783SApple OSS Distributions 	    kds_mode:1,
88*e7776783SApple OSS Distributions 	    unused:30;
89*e7776783SApple OSS Distributions 	uint64_t  kds_timestamp;
90*e7776783SApple OSS Distributions 
91*e7776783SApple OSS Distributions 	kd_buf  kds_records[TRACE_EVENTS_PER_STORAGE_UNIT];
92*e7776783SApple OSS Distributions };
93*e7776783SApple OSS Distributions 
94*e7776783SApple OSS Distributions #define MAX_BUFFER_SIZE            (1024 * 1024 * 128)
95*e7776783SApple OSS Distributions #define N_STORAGE_UNITS_PER_BUFFER (MAX_BUFFER_SIZE / sizeof(struct kd_storage))
96*e7776783SApple OSS Distributions static_assert(N_STORAGE_UNITS_PER_BUFFER <= 0x7ff,
97*e7776783SApple OSS Distributions     "shoudn't overflow kds_ptr.offset");
98*e7776783SApple OSS Distributions 
99*e7776783SApple OSS Distributions struct kd_storage_buffers {
100*e7776783SApple OSS Distributions 	struct  kd_storage      *kdsb_addr;
101*e7776783SApple OSS Distributions 	uint32_t                kdsb_size;
102*e7776783SApple OSS Distributions };
103*e7776783SApple OSS Distributions 
104*e7776783SApple OSS Distributions #define KDS_PTR_NULL 0xffffffff
105*e7776783SApple OSS Distributions 
106*e7776783SApple OSS Distributions struct kd_bufinfo {
107*e7776783SApple OSS Distributions 	union  kds_ptr kd_list_head;
108*e7776783SApple OSS Distributions 	union  kds_ptr kd_list_tail;
109*e7776783SApple OSS Distributions 	bool kd_lostevents;
110*e7776783SApple OSS Distributions 	uint32_t _pad;
111*e7776783SApple OSS Distributions 	uint64_t kd_prev_timebase;
112*e7776783SApple OSS Distributions 	uint32_t num_bufs;
113*e7776783SApple OSS Distributions 	bool continuous_timestamps;
114*e7776783SApple OSS Distributions } __attribute__((aligned(MAX_CPU_CACHE_LINE_SIZE))) __attribute__((packed));
115*e7776783SApple OSS Distributions 
116*e7776783SApple OSS Distributions 
117*e7776783SApple OSS Distributions struct kd_iop;
118*e7776783SApple OSS Distributions struct kd_ctrl_page_t {
119*e7776783SApple OSS Distributions 	union kds_ptr kds_free_list;
120*e7776783SApple OSS Distributions 	uint32_t enabled:1,
121*e7776783SApple OSS Distributions 	    mode:3,
122*e7776783SApple OSS Distributions 	    _pad0:28;
123*e7776783SApple OSS Distributions 	int      kds_inuse_count;
124*e7776783SApple OSS Distributions 	uint32_t kdebug_events_per_storage_unit;
125*e7776783SApple OSS Distributions 	uint32_t kdebug_min_storage_units_per_cpu;
126*e7776783SApple OSS Distributions 	uint32_t kdebug_kdcopybuf_count;
127*e7776783SApple OSS Distributions 	uint32_t kdebug_kdcopybuf_size;
128*e7776783SApple OSS Distributions 	uint32_t kdebug_cpus;
129*e7776783SApple OSS Distributions 	uint32_t kdebug_flags;
130*e7776783SApple OSS Distributions 	uint32_t kdebug_slowcheck;
131*e7776783SApple OSS Distributions 	uint64_t oldest_time;
132*e7776783SApple OSS Distributions 
133*e7776783SApple OSS Distributions 	lck_spin_t  kds_spin_lock;
134*e7776783SApple OSS Distributions 
135*e7776783SApple OSS Distributions 	/*
136*e7776783SApple OSS Distributions 	 * The number of kd_bufinfo structs allocated may not match the current
137*e7776783SApple OSS Distributions 	 * number of active cpus. We capture the iops list head at initialization
138*e7776783SApple OSS Distributions 	 * which we could use to calculate the number of cpus we allocated data for,
139*e7776783SApple OSS Distributions 	 * unless it happens to be null. To avoid that case, we explicitly also
140*e7776783SApple OSS Distributions 	 * capture a cpu count.
141*e7776783SApple OSS Distributions 	 */
142*e7776783SApple OSS Distributions 	struct kd_iop* kdebug_iops;
143*e7776783SApple OSS Distributions 
144*e7776783SApple OSS Distributions 	kd_event_matcher disable_event_match;
145*e7776783SApple OSS Distributions 	kd_event_matcher disable_event_mask;
146*e7776783SApple OSS Distributions };
147*e7776783SApple OSS Distributions 
148*e7776783SApple OSS Distributions struct kd_data_page_t {
149*e7776783SApple OSS Distributions 	int nkdbufs;
150*e7776783SApple OSS Distributions 	int n_storage_units;
151*e7776783SApple OSS Distributions 	int n_storage_threshold;
152*e7776783SApple OSS Distributions 	uint32_t n_storage_buffer;
153*e7776783SApple OSS Distributions 	struct kd_bufinfo *kdbip;
154*e7776783SApple OSS Distributions 	struct kd_storage_buffers *kd_bufs;
155*e7776783SApple OSS Distributions 	kd_buf *kdcopybuf;
156*e7776783SApple OSS Distributions };
157*e7776783SApple OSS Distributions 
158*e7776783SApple OSS Distributions struct kd_record {
159*e7776783SApple OSS Distributions 	int32_t  cpu;
160*e7776783SApple OSS Distributions 	uint32_t debugid;
161*e7776783SApple OSS Distributions 	int64_t timestamp;
162*e7776783SApple OSS Distributions 	kd_buf_argtype arg1;
163*e7776783SApple OSS Distributions 	kd_buf_argtype arg2;
164*e7776783SApple OSS Distributions 	kd_buf_argtype arg3;
165*e7776783SApple OSS Distributions 	kd_buf_argtype arg4;
166*e7776783SApple OSS Distributions 	kd_buf_argtype arg5;
167*e7776783SApple OSS Distributions } __attribute__((packed));
168*e7776783SApple OSS Distributions 
169*e7776783SApple OSS Distributions #define POINTER_FROM_KDS_PTR(kd_bufs, x) (&kd_bufs[x.buffer_index].kdsb_addr[x.offset])
170*e7776783SApple OSS Distributions 
171*e7776783SApple OSS Distributions extern bool kdbg_continuous_time;
172*e7776783SApple OSS Distributions extern int kdbg_debug;
173*e7776783SApple OSS Distributions 
174*e7776783SApple OSS Distributions uint32_t kdbg_cpu_count(bool);
175*e7776783SApple OSS Distributions 
176*e7776783SApple OSS Distributions void kdebug_lck_init(void);
177*e7776783SApple OSS Distributions int kdebug_storage_lock(struct kd_ctrl_page_t *kd_ctrl_page);
178*e7776783SApple OSS Distributions void kdebug_storage_unlock(struct kd_ctrl_page_t *kd_ctrl_page, int intrs_en);
179*e7776783SApple OSS Distributions 
180*e7776783SApple OSS Distributions void
181*e7776783SApple OSS Distributions enable_wrap(struct kd_ctrl_page_t *kd_ctrl_page, uint32_t old_slowcheck);
182*e7776783SApple OSS Distributions 
183*e7776783SApple OSS Distributions bool
184*e7776783SApple OSS Distributions disable_wrap(struct kd_ctrl_page_t *kd_ctrl_page, uint32_t *old_slowcheck, uint32_t *old_flags);
185*e7776783SApple OSS Distributions 
186*e7776783SApple OSS Distributions int
187*e7776783SApple OSS Distributions create_buffers(struct kd_ctrl_page_t *kd_ctrl_page, struct kd_data_page_t *kd_data_page, vm_tag_t tag);
188*e7776783SApple OSS Distributions 
189*e7776783SApple OSS Distributions void
190*e7776783SApple OSS Distributions delete_buffers(struct kd_ctrl_page_t *kd_ctrl_page, struct kd_data_page_t *kd_data_page);
191*e7776783SApple OSS Distributions 
192*e7776783SApple OSS Distributions bool
193*e7776783SApple OSS Distributions allocate_storage_unit(struct kd_ctrl_page_t *kd_ctrl_page, struct kd_data_page_t *kd_data_page, int cpu);
194*e7776783SApple OSS Distributions 
195*e7776783SApple OSS Distributions void
196*e7776783SApple OSS Distributions release_storage_unit(struct kd_ctrl_page_t *kd_ctrl_page, struct kd_data_page_t *kd_data_page, int cpu, uint32_t kdsp_raw);
197*e7776783SApple OSS Distributions 
198*e7776783SApple OSS Distributions void
199*e7776783SApple OSS Distributions kernel_debug_write(struct kd_ctrl_page_t *kd_ctrl_page,
200*e7776783SApple OSS Distributions     struct kd_data_page_t *kd_data_page,
201*e7776783SApple OSS Distributions     struct kd_record kd_rec);
202*e7776783SApple OSS Distributions 
203*e7776783SApple OSS Distributions int
204*e7776783SApple OSS Distributions kernel_debug_read(struct kd_ctrl_page_t *kd_ctrl_page, struct kd_data_page_t *kd_data_page, user_addr_t buffer,
205*e7776783SApple OSS Distributions     size_t *number, vnode_t vp, vfs_context_t ctx, uint32_t file_version);
206*e7776783SApple OSS Distributions 
207*e7776783SApple OSS Distributions 
208*e7776783SApple OSS Distributions extern int     RAW_file_written;
209*e7776783SApple OSS Distributions #define RAW_FLUSH_SIZE  (2 * 1024 * 1024)
210*e7776783SApple OSS Distributions 
211*e7776783SApple OSS Distributions void commpage_update_kdebug_state(void); /* XXX sign */
212*e7776783SApple OSS Distributions 
213*e7776783SApple OSS Distributions #endif /* BSD_SYS_KDEBUG_COMMON_H */
214