1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 /* 12 * Copyright (c) 2013 by Delphix. All rights reserved. 13 */ 14 15 #ifndef _MDB_GCORE_H 16 #define _MDB_GCORE_H 17 18 /* 19 * The kernel has its own definition of exit which has a different signature 20 * than the user space definition. This seems to be the standard way to deal 21 * with this. 22 */ 23 #define exit kern_exit 24 25 #include <sys/cpuvar.h> 26 #include <sys/cred_impl.h> 27 #include <sys/procfs.h> 28 #include <vm/anon.h> 29 30 #undef exit 31 32 /* mdb versions of kernel structures used for ctf read calls */ 33 typedef struct mdb_proc { 34 uintptr_t p_as; 35 uintptr_t p_brkbase; 36 size_t p_brksize; 37 uintptr_t p_usrstack; 38 size_t p_stksize; 39 user_t p_user; 40 uintptr_t p_agenttp; 41 uintptr_t p_tlist; 42 uintptr_t p_zone; 43 uintptr_t p_ldt; 44 kcondvar_t p_holdlwps; 45 int p_lwpcnt; 46 uintptr_t p_lwpdir; 47 uint_t p_lwpdir_sz; 48 uintptr_t p_cred; 49 uint_t p_flag; 50 int p_zombcnt; 51 uintptr_t p_pidp; 52 pid_t p_ppid; 53 uintptr_t p_pgidp; 54 uintptr_t p_sessp; 55 uintptr_t p_task; 56 uintptr_t p_pool; 57 model_t p_model; 58 char p_wcode; 59 ushort_t p_ldtlimit; 60 uintptr_t p_exec; 61 uint_t p_proc_flag; 62 ushort_t p_pidflag; 63 k_sigset_t p_ignore; 64 k_sigset_t p_siginfo; 65 k_sigset_t p_sig; 66 k_sigset_t p_sigmask; 67 k_fltset_t p_fltmask; 68 int p_wdata; 69 } mdb_proc_t; 70 71 typedef struct mdb_kthread { 72 ushort_t t_proc_flag; 73 uint_t t_state; 74 lwpchan_t t_lwpchan; 75 ushort_t t_whystop; 76 uint8_t t_dtrace_stop; 77 uintptr_t t_forw; 78 uintptr_t t_lwp; 79 id_t t_tid; 80 short t_sysnum; 81 pri_t t_pri; 82 time_t t_start; 83 id_t t_cid; 84 uintptr_t t_cpu; 85 int t_bind_pset; 86 short t_bind_cpu; 87 uintptr_t t_lpl; 88 ushort_t t_schedflag; 89 ushort_t t_whatstop; 90 k_sigset_t t_sig; 91 uintptr_t t_schedctl; 92 k_sigset_t t_hold; 93 hrtime_t t_stoptime; 94 } mdb_kthread_t; 95 96 typedef struct mdb_seg { 97 uintptr_t s_base; 98 size_t s_size; 99 uintptr_t s_ops; 100 uintptr_t s_data; 101 uintptr_t s_as; 102 } mdb_seg_t; 103 104 typedef struct mdb_as { 105 uintptr_t a_proc; 106 } mdb_as_t; 107 108 typedef struct mdb_segvn_data { 109 uintptr_t vp; 110 uint64_t offset; 111 uint16_t flags; 112 uint8_t pageprot; 113 uint8_t prot; 114 uintptr_t amp; 115 struct vpage *vpage; 116 uint64_t anon_index; 117 uint8_t type; 118 } mdb_segvn_data_t; 119 120 typedef struct mdb_vnode { 121 enum vtype v_type; 122 uintptr_t v_data; 123 uintptr_t v_op; 124 uintptr_t v_path; 125 } mdb_vnode_t; 126 127 typedef struct mdb_znode { 128 uint64_t z_size; 129 } mdb_znode_t; 130 131 typedef struct mdb_tmpnode { 132 vattr_t tn_attr; 133 } mdb_tmpnode_t; 134 135 typedef struct mdb_vnodeops { 136 uintptr_t vnop_name; 137 } mdb_vnodeops_t; 138 139 typedef struct mdb_shm_data { 140 uintptr_t shm_sptseg; 141 } mdb_shm_data_t; 142 143 typedef struct mdb_watched_page { 144 uintptr_t wp_vaddr; 145 uint8_t wp_oprot; 146 } mdb_watched_page_t; 147 148 typedef struct mdb_pid { 149 pid_t pid_id; 150 } mdb_pid_t; 151 152 typedef struct mdb_sess { 153 uintptr_t s_sidp; 154 } mdb_sess_t; 155 156 typedef struct mdb_task { 157 taskid_t tk_tkid; 158 uintptr_t tk_proj; 159 } mdb_task_t; 160 161 typedef struct mdb_kproject { 162 projid_t kpj_id; 163 } mdb_kproject_t; 164 165 typedef struct mdb_zone { 166 zoneid_t zone_id; 167 uintptr_t zone_name; 168 } mdb_zone_t; 169 170 typedef struct mdb_sc_shared { 171 char sc_sigblock; 172 } mdb_sc_shared_t; 173 174 typedef struct mdb_klwp { 175 uintptr_t lwp_regs; 176 struct pcb lwp_pcb; 177 uchar_t lwp_asleep; 178 uchar_t lwp_cursig; 179 uintptr_t lwp_curinfo; 180 k_siginfo_t lwp_siginfo; 181 stack_t lwp_sigaltstack; 182 uintptr_t lwp_oldcontext; 183 short lwp_badpriv; 184 uintptr_t lwp_ustack; 185 char lwp_eosys; 186 } mdb_klwp_t; 187 188 typedef struct mdb_cpu { 189 processorid_t cpu_id; 190 } mdb_cpu_t; 191 192 typedef struct mdb_lpl { 193 lgrp_id_t lpl_lgrpid; 194 } mdb_lpl_t; 195 196 typedef struct mdb_sigqueue { 197 k_siginfo_t sq_info; 198 } mdb_sigqueue_t; 199 200 typedef struct mdb_pool { 201 poolid_t pool_id; 202 } mdb_pool_t; 203 204 typedef struct mdb_amp { 205 uintptr_t ahp; 206 } mdb_amp_t; 207 208 typedef struct mdb_anon_hdr { 209 pgcnt_t size; 210 uintptr_t array_chunk; 211 int flags; 212 } mdb_anon_hdr_t; 213 214 typedef struct mdb_anon { 215 uintptr_t an_vp; 216 anoff_t an_off; 217 } mdb_anon_t; 218 219 /* Used to construct a linked list of prmap_ts */ 220 typedef struct prmap_node { 221 struct prmap_node *next; 222 prmap_t m; 223 } prmap_node_t; 224 225 /* Fields common to psinfo_t and pstatus_t */ 226 typedef struct pcommon { 227 int pc_nlwp; 228 int pc_nzomb; 229 pid_t pc_pid; 230 pid_t pc_ppid; 231 pid_t pc_pgid; 232 pid_t pc_sid; 233 taskid_t pc_taskid; 234 projid_t pc_projid; 235 zoneid_t pc_zoneid; 236 char pc_dmodel; 237 } pcommon_t; 238 239 /* AVL walk callback structures */ 240 typedef struct read_maps_cbarg { 241 mdb_proc_t *p; 242 uintptr_t brkseg; 243 uintptr_t stkseg; 244 prmap_node_t *map_head; 245 prmap_node_t *map_tail; 246 int map_len; 247 } read_maps_cbarg_t; 248 249 typedef struct as_segat_cbarg { 250 uintptr_t addr; 251 uintptr_t res; 252 } as_segat_cbarg_t; 253 254 typedef struct getwatchprot_cbarg { 255 uintptr_t wp_vaddr; 256 mdb_watched_page_t wp; 257 boolean_t found; 258 } getwatchprot_cbarg_t; 259 260 struct gcore_segops; 261 typedef struct gcore_seg { 262 mdb_seg_t *gs_seg; 263 void *gs_data; 264 struct gcore_segops *gs_ops; 265 } gcore_seg_t; 266 267 /* 268 * These are the ISA-dependent functions that need to be 269 * implemented for ::gcore. 270 */ 271 extern uintptr_t gcore_prgetstackbase(mdb_proc_t *); 272 extern int gcore_prfetchinstr(mdb_klwp_t *, ulong_t *); 273 extern int gcore_prisstep(mdb_klwp_t *); 274 extern void gcore_getgregs(mdb_klwp_t *, gregset_t); 275 extern int gcore_prgetrvals(mdb_klwp_t *, long *, long *); 276 277 #endif /* _MDB_GCORE_H */ 278