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