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