| /* |
| * This file and its contents are supplied under the terms of the |
| * Common Development and Distribution License ("CDDL"), version 1.0. |
| * You may only use this file in accordance with the terms of version |
| * 1.0 of the CDDL. |
| * |
| * A full copy of the text of the CDDL should have accompanied this |
| * source. A copy of the CDDL is also available via the Internet at |
| * http://www.illumos.org/license/CDDL. |
| */ |
| /* |
| * Copyright (c) 2013 by Delphix. All rights reserved. |
| */ |
| |
| #ifndef _MDB_GCORE_H |
| #define _MDB_GCORE_H |
| |
| /* |
| * The kernel has its own definition of exit which has a different signature |
| * than the user space definition. This seems to be the standard way to deal |
| * with this. |
| */ |
| #define exit kern_exit |
| |
| #include <sys/cpuvar.h> |
| #include <sys/cred_impl.h> |
| #include <sys/procfs.h> |
| #include <vm/anon.h> |
| |
| #undef exit |
| |
| /* mdb versions of kernel structures used for ctf read calls */ |
| typedef struct mdb_proc { |
| uintptr_t p_as; |
| uintptr_t p_brkbase; |
| size_t p_brksize; |
| uintptr_t p_usrstack; |
| size_t p_stksize; |
| user_t p_user; |
| uintptr_t p_agenttp; |
| uintptr_t p_tlist; |
| uintptr_t p_zone; |
| uintptr_t p_ldt; |
| kcondvar_t p_holdlwps; |
| int p_lwpcnt; |
| uintptr_t p_lwpdir; |
| uint_t p_lwpdir_sz; |
| uintptr_t p_cred; |
| uint_t p_flag; |
| int p_zombcnt; |
| uintptr_t p_pidp; |
| pid_t p_ppid; |
| uintptr_t p_pgidp; |
| uintptr_t p_sessp; |
| uintptr_t p_task; |
| uintptr_t p_pool; |
| model_t p_model; |
| char p_wcode; |
| ushort_t p_ldtlimit; |
| uintptr_t p_exec; |
| uint_t p_proc_flag; |
| ushort_t p_pidflag; |
| k_sigset_t p_ignore; |
| k_sigset_t p_siginfo; |
| k_sigset_t p_sig; |
| k_sigset_t p_sigmask; |
| k_fltset_t p_fltmask; |
| int p_wdata; |
| } mdb_proc_t; |
| |
| typedef struct mdb_kthread { |
| ushort_t t_proc_flag; |
| uint_t t_state; |
| lwpchan_t t_lwpchan; |
| ushort_t t_whystop; |
| uint8_t t_dtrace_stop; |
| uintptr_t t_forw; |
| uintptr_t t_lwp; |
| id_t t_tid; |
| short t_sysnum; |
| pri_t t_pri; |
| time_t t_start; |
| id_t t_cid; |
| uintptr_t t_cpu; |
| int t_bind_pset; |
| short t_bind_cpu; |
| uintptr_t t_lpl; |
| ushort_t t_schedflag; |
| ushort_t t_whatstop; |
| k_sigset_t t_sig; |
| uintptr_t t_schedctl; |
| k_sigset_t t_hold; |
| hrtime_t t_stoptime; |
| } mdb_kthread_t; |
| |
| typedef struct mdb_seg { |
| uintptr_t s_base; |
| size_t s_size; |
| uintptr_t s_ops; |
| uintptr_t s_data; |
| uintptr_t s_as; |
| } mdb_seg_t; |
| |
| typedef struct mdb_as { |
| uintptr_t a_proc; |
| } mdb_as_t; |
| |
| typedef struct mdb_segvn_data { |
| uintptr_t vp; |
| uint64_t offset; |
| uint16_t flags; |
| uint8_t pageprot; |
| uint8_t prot; |
| uintptr_t amp; |
| struct vpage *vpage; |
| uint64_t anon_index; |
| uint8_t type; |
| } mdb_segvn_data_t; |
| |
| typedef struct mdb_vnode { |
| enum vtype v_type; |
| uintptr_t v_data; |
| uintptr_t v_op; |
| uintptr_t v_path; |
| } mdb_vnode_t; |
| |
| typedef struct mdb_znode { |
| uint64_t z_size; |
| } mdb_znode_t; |
| |
| typedef struct mdb_tmpnode { |
| vattr_t tn_attr; |
| } mdb_tmpnode_t; |
| |
| typedef struct mdb_vnodeops { |
| uintptr_t vnop_name; |
| } mdb_vnodeops_t; |
| |
| typedef struct mdb_shm_data { |
| uintptr_t shm_sptseg; |
| } mdb_shm_data_t; |
| |
| typedef struct mdb_watched_page { |
| uintptr_t wp_vaddr; |
| uint8_t wp_oprot; |
| } mdb_watched_page_t; |
| |
| typedef struct mdb_pid { |
| pid_t pid_id; |
| } mdb_pid_t; |
| |
| typedef struct mdb_sess { |
| uintptr_t s_sidp; |
| } mdb_sess_t; |
| |
| typedef struct mdb_task { |
| taskid_t tk_tkid; |
| uintptr_t tk_proj; |
| } mdb_task_t; |
| |
| typedef struct mdb_kproject { |
| projid_t kpj_id; |
| } mdb_kproject_t; |
| |
| typedef struct mdb_zone { |
| zoneid_t zone_id; |
| uintptr_t zone_name; |
| } mdb_zone_t; |
| |
| typedef struct mdb_sc_shared { |
| char sc_sigblock; |
| } mdb_sc_shared_t; |
| |
| typedef struct mdb_klwp { |
| uintptr_t lwp_regs; |
| struct pcb lwp_pcb; |
| uchar_t lwp_asleep; |
| uchar_t lwp_cursig; |
| uintptr_t lwp_curinfo; |
| k_siginfo_t lwp_siginfo; |
| stack_t lwp_sigaltstack; |
| uintptr_t lwp_oldcontext; |
| short lwp_badpriv; |
| uintptr_t lwp_ustack; |
| char lwp_eosys; |
| } mdb_klwp_t; |
| |
| typedef struct mdb_cpu { |
| processorid_t cpu_id; |
| } mdb_cpu_t; |
| |
| typedef struct mdb_lpl { |
| lgrp_id_t lpl_lgrpid; |
| } mdb_lpl_t; |
| |
| typedef struct mdb_sigqueue { |
| k_siginfo_t sq_info; |
| } mdb_sigqueue_t; |
| |
| typedef struct mdb_pool { |
| poolid_t pool_id; |
| } mdb_pool_t; |
| |
| typedef struct mdb_amp { |
| uintptr_t ahp; |
| } mdb_amp_t; |
| |
| typedef struct mdb_anon_hdr { |
| pgcnt_t size; |
| uintptr_t array_chunk; |
| int flags; |
| } mdb_anon_hdr_t; |
| |
| typedef struct mdb_anon { |
| uintptr_t an_vp; |
| anoff_t an_off; |
| } mdb_anon_t; |
| |
| /* Used to construct a linked list of prmap_ts */ |
| typedef struct prmap_node { |
| struct prmap_node *next; |
| prmap_t m; |
| } prmap_node_t; |
| |
| /* Fields common to psinfo_t and pstatus_t */ |
| typedef struct pcommon { |
| int pc_nlwp; |
| int pc_nzomb; |
| pid_t pc_pid; |
| pid_t pc_ppid; |
| pid_t pc_pgid; |
| pid_t pc_sid; |
| taskid_t pc_taskid; |
| projid_t pc_projid; |
| zoneid_t pc_zoneid; |
| char pc_dmodel; |
| } pcommon_t; |
| |
| /* AVL walk callback structures */ |
| typedef struct read_maps_cbarg { |
| mdb_proc_t *p; |
| uintptr_t brkseg; |
| uintptr_t stkseg; |
| prmap_node_t *map_head; |
| prmap_node_t *map_tail; |
| int map_len; |
| } read_maps_cbarg_t; |
| |
| typedef struct as_segat_cbarg { |
| uintptr_t addr; |
| uintptr_t res; |
| } as_segat_cbarg_t; |
| |
| typedef struct getwatchprot_cbarg { |
| uintptr_t wp_vaddr; |
| mdb_watched_page_t wp; |
| boolean_t found; |
| } getwatchprot_cbarg_t; |
| |
| struct gcore_segops; |
| typedef struct gcore_seg { |
| mdb_seg_t *gs_seg; |
| void *gs_data; |
| struct gcore_segops *gs_ops; |
| } gcore_seg_t; |
| |
| /* |
| * These are the ISA-dependent functions that need to be |
| * implemented for ::gcore. |
| */ |
| extern uintptr_t gcore_prgetstackbase(mdb_proc_t *); |
| extern int gcore_prfetchinstr(mdb_klwp_t *, ulong_t *); |
| extern int gcore_prisstep(mdb_klwp_t *); |
| extern void gcore_getgregs(mdb_klwp_t *, gregset_t); |
| extern int gcore_prgetrvals(mdb_klwp_t *, long *, long *); |
| |
| #endif /* _MDB_GCORE_H */ |