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 ----