Print this page
27908 ::gcore breaks sparc build

@@ -19,11 +19,12 @@
  * 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!
+ * Currently only x86 is supported. ISA-dependent functions are implemented
+ * in gcore_isadep.c.
  */
 
 #ifndef _KMDB
 
 /*

@@ -36,15 +37,15 @@
 #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/cred_impl.h>
 #include <sys/lgrp.h>
 #include <sys/pool.h>
 #include <sys/project.h>
 #include <sys/regset.h>
 #include <sys/schedctl.h>

@@ -51,13 +52,11 @@
 #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>

@@ -99,245 +98,10 @@
 #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;

@@ -722,17 +486,10 @@
                 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;

@@ -1383,100 +1140,10 @@
                                 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);
 }