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