Print this page
27908 ::gcore breaks sparc build
*** 19,29 ****
* function implementations simulate the functionality implemented by procfs.
* The data provided by some of the ops vector functions is not complete
* (missing data is documented in function headers) but there is enough
* information to generate a core file that can be loaded into mdb.
*
! * Currently only x86 is supported!
*/
#ifndef _KMDB
/*
--- 19,30 ----
* function implementations simulate the functionality implemented by procfs.
* The data provided by some of the ops vector functions is not complete
* (missing data is documented in function headers) but there is enough
* information to generate a core file that can be loaded into mdb.
*
! * Currently only x86 is supported. ISA-dependent functions are implemented
! * in gcore_isadep.c.
*/
#ifndef _KMDB
/*
*** 36,50 ****
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_param.h>
#include <mdb/mdb_ks.h>
#include <mdb/mdb_ctf.h>
#include <mdb/mdb_debug.h>
#include <sys/class.h>
#include <sys/cpuvar.h>
#include <sys/proc.h>
- #include <sys/cred_impl.h>
#include <sys/lgrp.h>
#include <sys/pool.h>
#include <sys/project.h>
#include <sys/regset.h>
#include <sys/schedctl.h>
--- 37,51 ----
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_param.h>
#include <mdb/mdb_ks.h>
#include <mdb/mdb_ctf.h>
#include <mdb/mdb_debug.h>
+ #include <mdb/mdb_gcore.h>
#include <sys/class.h>
#include <sys/cpuvar.h>
#include <sys/proc.h>
#include <sys/lgrp.h>
#include <sys/pool.h>
#include <sys/project.h>
#include <sys/regset.h>
#include <sys/schedctl.h>
*** 51,63 ****
#include <sys/session.h>
#include <sys/syscall.h>
#include <sys/task.h>
#include <sys/var.h>
#include <sys/privregs.h>
- #include <sys/psw.h>
#include <sys/fault.h>
- #include <sys/procfs.h>
#include <sys/sysmacros.h>
#include <sys/wait.h>
#include <vm/seg.h>
#include <vm/vpage.h>
#include <fs/proc/prdata.h>
--- 52,62 ----
*** 99,343 ****
#define dprintf(...) mdb_printf(__VA_ARGS__)
#else
#define dprintf(...)
#endif
- /* 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;
-
/* Callback function type for processing lwp entries */
typedef int (*lwp_callback_t)(mdb_proc_t *, lwpent_t *, void *);
/* Private data */
static uintptr_t gcore_segvn_ops;
--- 98,107 ----
*** 722,738 ****
addr += p->p_brksize - 1;
return (gcore_as_segat(p->p_as, addr));
}
- /* ISA dependent function. */
- static uintptr_t
- gcore_prgetstackbase(mdb_proc_t *p)
- {
- return (p->p_usrstack - p->p_stksize);
- }
-
static u_offset_t
gcore_vnode_size(uintptr_t vnode_addr)
{
mdb_vnode_t vnode;
mdb_vnodeops_t vnodeops;
--- 486,495 ----
*** 1383,1482 ****
sp->sa_flags |= SA_NOCLDSTOP;
}
}
}
- /* ISA dependent function. */
- static int
- gcore_prfetchinstr(mdb_klwp_t *lwp, ulong_t *ip)
- {
- *ip = (ulong_t)(instr_t)lwp->lwp_pcb.pcb_instr;
- return (lwp->lwp_pcb.pcb_flags & INSTR_VALID);
- }
-
- /* ISA dependent function. */
- static int
- gcore_prisstep(mdb_klwp_t *lwp)
- {
- return ((lwp->lwp_pcb.pcb_flags &
- (NORMAL_STEP|WATCH_STEP|DEBUG_PENDING)) != 0);
- }
-
- /* ISA dependent function. */
- static void
- gcore_getgregs(mdb_klwp_t *lwp, gregset_t grp)
- {
- struct regs rgs;
- struct regs *rp;
-
- if (mdb_vread(&rgs, sizeof (rgs), lwp->lwp_regs) != sizeof (rgs)) {
- mdb_warn("Failed to read regs from %p\n", lwp->lwp_regs);
- return;
- }
- rp = &rgs;
-
- #if defined(__amd64)
- struct pcb *pcb = &lwp->lwp_pcb;
-
- grp[REG_RDI] = rp->r_rdi;
- grp[REG_RSI] = rp->r_rsi;
- grp[REG_RDX] = rp->r_rdx;
- grp[REG_RCX] = rp->r_rcx;
- grp[REG_R8] = rp->r_r8;
- grp[REG_R9] = rp->r_r9;
- grp[REG_RAX] = rp->r_rax;
- grp[REG_RBX] = rp->r_rbx;
- grp[REG_RBP] = rp->r_rbp;
- grp[REG_R10] = rp->r_r10;
- grp[REG_R11] = rp->r_r11;
- grp[REG_R12] = rp->r_r12;
- grp[REG_R13] = rp->r_r13;
- grp[REG_R14] = rp->r_r14;
- grp[REG_R15] = rp->r_r15;
- grp[REG_FSBASE] = pcb->pcb_fsbase;
- grp[REG_GSBASE] = pcb->pcb_gsbase;
- if (pcb->pcb_rupdate == 1) {
- grp[REG_DS] = pcb->pcb_ds;
- grp[REG_ES] = pcb->pcb_es;
- grp[REG_FS] = pcb->pcb_fs;
- grp[REG_GS] = pcb->pcb_gs;
- } else {
- grp[REG_DS] = rp->r_ds;
- grp[REG_ES] = rp->r_es;
- grp[REG_FS] = rp->r_fs;
- grp[REG_GS] = rp->r_gs;
- }
- grp[REG_TRAPNO] = rp->r_trapno;
- grp[REG_ERR] = rp->r_err;
- grp[REG_RIP] = rp->r_rip;
- grp[REG_CS] = rp->r_cs;
- grp[REG_SS] = rp->r_ss;
- grp[REG_RFL] = rp->r_rfl;
- grp[REG_RSP] = rp->r_rsp;
- #else
- bcopy(&rp->r_gs, grp, sizeof (gregset_t));
- #endif
- }
-
- /* ISA dependent functions. */
- static int
- gcore_prgetrvals(mdb_klwp_t *lwp, long *rval1, long *rval2)
- {
- struct regs *r = lwptoregs(lwp);
-
- if (r->r_ps & PS_C)
- return (r->r_r0);
- if (lwp->lwp_eosys == JUSTRETURN) {
- *rval1 = 0;
- *rval2 = 0;
- } else {
- *rval1 = r->r_r0;
- *rval2 = r->r_r1;
- }
- return (0);
- }
-
static void
gcore_prgetprregs(mdb_klwp_t *lwp, prgregset_t prp)
{
gcore_getgregs(lwp, prp);
}
--- 1140,1149 ----