Print this page
27908 ::gcore breaks sparc build

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/modules/genunix/gcore.c
          +++ new/usr/src/cmd/mdb/common/modules/genunix/gcore.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14  
  15   15  /*
  16   16   * This file implements the mdb ::gcore command.  The command relies on the
  17   17   * libproc Pgcore function to actually generate the core file but we provide
  18   18   * our own ops vector to populate data required by Pgcore.  The ops vector
  19   19   * function implementations simulate the functionality implemented by procfs.
  20   20   * The data provided by some of the ops vector functions is not complete
  21   21   * (missing data is documented in function headers) but there is enough
  22   22   * information to generate a core file that can be loaded into mdb.
  23   23   *
  24      - * Currently only x86 is supported!
       24 + * Currently only x86 is supported. ISA-dependent functions are implemented
       25 + * in gcore_isadep.c.
  25   26   */
  26   27  
  27   28  #ifndef _KMDB
  28   29  
  29   30  /*
  30   31   * The kernel has its own definition of exit which has a different signature
  31   32   * than the user space definition.  This seems to be the standard way to deal
  32   33   * with this.
  33   34   */
  34   35  #define exit kern_exit
  35   36  
  36   37  #include <mdb/mdb_modapi.h>
  37   38  #include <mdb/mdb_param.h>
  38   39  #include <mdb/mdb_ks.h>
  39   40  #include <mdb/mdb_ctf.h>
  40   41  #include <mdb/mdb_debug.h>
       42 +#include <mdb/mdb_gcore.h>
  41   43  
  42   44  #include <sys/class.h>
  43   45  #include <sys/cpuvar.h>
  44   46  #include <sys/proc.h>
  45      -#include <sys/cred_impl.h>
  46   47  #include <sys/lgrp.h>
  47   48  #include <sys/pool.h>
  48   49  #include <sys/project.h>
  49   50  #include <sys/regset.h>
  50   51  #include <sys/schedctl.h>
  51   52  #include <sys/session.h>
  52   53  #include <sys/syscall.h>
  53   54  #include <sys/task.h>
  54   55  #include <sys/var.h>
  55   56  #include <sys/privregs.h>
  56      -#include <sys/psw.h>
  57   57  #include <sys/fault.h>
  58      -#include <sys/procfs.h>
  59   58  #include <sys/sysmacros.h>
  60   59  #include <sys/wait.h>
  61   60  #include <vm/seg.h>
  62   61  #include <vm/vpage.h>
  63   62  #include <fs/proc/prdata.h>
  64   63  
  65   64  #undef exit
  66   65  
  67   66  #include <stdio.h>
  68   67  #include <stdbool.h>
↓ open down ↓ 25 lines elided ↑ open up ↑
  94   93          (_gs)->gs_ops->gsop_name((_gs), (_name), (_size))
  95   94  #define GSOP_NORESERVE(_gs)             \
  96   95          (_gs)->gs_ops->gsop_noreserve((_gs))
  97   96  
  98   97  #ifdef GCORE_DEBUG
  99   98  #define dprintf(...)    mdb_printf(__VA_ARGS__)
 100   99  #else
 101  100  #define dprintf(...)
 102  101  #endif
 103  102  
 104      -/* mdb versions of kernel structures used for ctf read calls */
 105      -typedef struct mdb_proc {
 106      -        uintptr_t       p_as;
 107      -        uintptr_t       p_brkbase;
 108      -        size_t          p_brksize;
 109      -        uintptr_t       p_usrstack;
 110      -        size_t          p_stksize;
 111      -        user_t          p_user;
 112      -        uintptr_t       p_agenttp;
 113      -        uintptr_t       p_tlist;
 114      -        uintptr_t       p_zone;
 115      -        uintptr_t       p_ldt;
 116      -        kcondvar_t      p_holdlwps;
 117      -        int             p_lwpcnt;
 118      -        uintptr_t       p_lwpdir;
 119      -        uint_t          p_lwpdir_sz;
 120      -        uintptr_t       p_cred;
 121      -        uint_t          p_flag;
 122      -        int             p_zombcnt;
 123      -        uintptr_t       p_pidp;
 124      -        pid_t           p_ppid;
 125      -        uintptr_t       p_pgidp;
 126      -        uintptr_t       p_sessp;
 127      -        uintptr_t       p_task;
 128      -        uintptr_t       p_pool;
 129      -        model_t         p_model;
 130      -        char            p_wcode;
 131      -        ushort_t        p_ldtlimit;
 132      -        uintptr_t       p_exec;
 133      -        uint_t          p_proc_flag;
 134      -        ushort_t        p_pidflag;
 135      -        k_sigset_t      p_ignore;
 136      -        k_sigset_t      p_siginfo;
 137      -        k_sigset_t      p_sig;
 138      -        k_sigset_t      p_sigmask;
 139      -        k_fltset_t      p_fltmask;
 140      -        int             p_wdata;
 141      -} mdb_proc_t;
 142      -
 143      -typedef struct mdb_kthread {
 144      -        ushort_t        t_proc_flag;
 145      -        uint_t          t_state;
 146      -        lwpchan_t       t_lwpchan;
 147      -        ushort_t        t_whystop;
 148      -        uint8_t         t_dtrace_stop;
 149      -        uintptr_t       t_forw;
 150      -        uintptr_t       t_lwp;
 151      -        id_t            t_tid;
 152      -        short           t_sysnum;
 153      -        pri_t           t_pri;
 154      -        time_t          t_start;
 155      -        id_t            t_cid;
 156      -        uintptr_t       t_cpu;
 157      -        int             t_bind_pset;
 158      -        short           t_bind_cpu;
 159      -        uintptr_t       t_lpl;
 160      -        ushort_t        t_schedflag;
 161      -        ushort_t        t_whatstop;
 162      -        k_sigset_t      t_sig;
 163      -        uintptr_t       t_schedctl;
 164      -        k_sigset_t      t_hold;
 165      -        hrtime_t        t_stoptime;
 166      -} mdb_kthread_t;
 167      -
 168      -typedef struct mdb_seg {
 169      -        uintptr_t       s_base;
 170      -        size_t          s_size;
 171      -        uintptr_t       s_ops;
 172      -        uintptr_t       s_data;
 173      -        uintptr_t       s_as;
 174      -} mdb_seg_t;
 175      -
 176      -typedef struct mdb_as {
 177      -        uintptr_t       a_proc;
 178      -} mdb_as_t;
 179      -
 180      -typedef struct mdb_segvn_data {
 181      -        uintptr_t       vp;
 182      -        uint64_t        offset;
 183      -        uint16_t        flags;
 184      -        uint8_t         pageprot;
 185      -        uint8_t         prot;
 186      -        uintptr_t       amp;
 187      -        struct vpage    *vpage;
 188      -        uint64_t        anon_index;
 189      -        uint8_t         type;
 190      -} mdb_segvn_data_t;
 191      -
 192      -typedef struct mdb_vnode {
 193      -        enum vtype      v_type;
 194      -        uintptr_t       v_data;
 195      -        uintptr_t       v_op;
 196      -        uintptr_t       v_path;
 197      -} mdb_vnode_t;
 198      -
 199      -typedef struct mdb_znode {
 200      -        uint64_t        z_size;
 201      -} mdb_znode_t;
 202      -
 203      -typedef struct mdb_tmpnode {
 204      -        vattr_t         tn_attr;
 205      -} mdb_tmpnode_t;
 206      -
 207      -typedef struct mdb_vnodeops {
 208      -        uintptr_t       vnop_name;
 209      -} mdb_vnodeops_t;
 210      -
 211      -typedef struct mdb_shm_data {
 212      -        uintptr_t       shm_sptseg;
 213      -} mdb_shm_data_t;
 214      -
 215      -typedef struct mdb_watched_page {
 216      -        uintptr_t       wp_vaddr;
 217      -        uint8_t         wp_oprot;
 218      -} mdb_watched_page_t;
 219      -
 220      -typedef struct mdb_pid {
 221      -        pid_t           pid_id;
 222      -} mdb_pid_t;
 223      -
 224      -typedef struct mdb_sess {
 225      -        uintptr_t       s_sidp;
 226      -} mdb_sess_t;
 227      -
 228      -typedef struct mdb_task {
 229      -        taskid_t        tk_tkid;
 230      -        uintptr_t       tk_proj;
 231      -} mdb_task_t;
 232      -
 233      -typedef struct mdb_kproject {
 234      -        projid_t        kpj_id;
 235      -} mdb_kproject_t;
 236      -
 237      -typedef struct mdb_zone {
 238      -        zoneid_t        zone_id;
 239      -        uintptr_t       zone_name;
 240      -} mdb_zone_t;
 241      -
 242      -typedef struct mdb_sc_shared {
 243      -        char            sc_sigblock;
 244      -} mdb_sc_shared_t;
 245      -
 246      -typedef struct mdb_klwp {
 247      -        uintptr_t       lwp_regs;
 248      -        struct pcb      lwp_pcb;
 249      -        uchar_t         lwp_asleep;
 250      -        uchar_t         lwp_cursig;
 251      -        uintptr_t       lwp_curinfo;
 252      -        k_siginfo_t     lwp_siginfo;
 253      -        stack_t         lwp_sigaltstack;
 254      -        uintptr_t       lwp_oldcontext;
 255      -        short           lwp_badpriv;
 256      -        uintptr_t       lwp_ustack;
 257      -        char            lwp_eosys;
 258      -} mdb_klwp_t;
 259      -
 260      -typedef struct mdb_cpu {
 261      -        processorid_t   cpu_id;
 262      -} mdb_cpu_t;
 263      -
 264      -typedef struct mdb_lpl {
 265      -        lgrp_id_t       lpl_lgrpid;
 266      -} mdb_lpl_t;
 267      -
 268      -typedef struct mdb_sigqueue {
 269      -        k_siginfo_t     sq_info;
 270      -} mdb_sigqueue_t;
 271      -
 272      -typedef struct mdb_pool {
 273      -        poolid_t        pool_id;
 274      -} mdb_pool_t;
 275      -
 276      -typedef struct mdb_amp {
 277      -        uintptr_t       ahp;
 278      -} mdb_amp_t;
 279      -
 280      -typedef struct mdb_anon_hdr {
 281      -        pgcnt_t         size;
 282      -        uintptr_t       array_chunk;
 283      -        int             flags;
 284      -} mdb_anon_hdr_t;
 285      -
 286      -typedef struct mdb_anon {
 287      -        uintptr_t       an_vp;
 288      -        anoff_t         an_off;
 289      -} mdb_anon_t;
 290      -
 291      -/* Used to construct a linked list of prmap_ts */
 292      -typedef struct prmap_node {
 293      -        struct prmap_node *next;
 294      -        prmap_t         m;
 295      -} prmap_node_t;
 296      -
 297      -/* Fields common to psinfo_t and pstatus_t */
 298      -typedef struct pcommon {
 299      -        int             pc_nlwp;
 300      -        int             pc_nzomb;
 301      -        pid_t           pc_pid;
 302      -        pid_t           pc_ppid;
 303      -        pid_t           pc_pgid;
 304      -        pid_t           pc_sid;
 305      -        taskid_t        pc_taskid;
 306      -        projid_t        pc_projid;
 307      -        zoneid_t        pc_zoneid;
 308      -        char            pc_dmodel;
 309      -} pcommon_t;
 310      -
 311      -/* AVL walk callback structures */
 312      -typedef struct read_maps_cbarg {
 313      -        mdb_proc_t      *p;
 314      -        uintptr_t       brkseg;
 315      -        uintptr_t       stkseg;
 316      -        prmap_node_t    *map_head;
 317      -        prmap_node_t    *map_tail;
 318      -        int             map_len;
 319      -} read_maps_cbarg_t;
 320      -
 321      -typedef struct as_segat_cbarg {
 322      -        uintptr_t       addr;
 323      -        uintptr_t       res;
 324      -} as_segat_cbarg_t;
 325      -
 326      -typedef struct getwatchprot_cbarg {
 327      -        uintptr_t       wp_vaddr;
 328      -        mdb_watched_page_t wp;
 329      -        boolean_t       found;
 330      -} getwatchprot_cbarg_t;
 331      -
 332      -struct gcore_segops;
 333      -typedef struct gcore_seg {
 334      -        mdb_seg_t       *gs_seg;
 335      -        void            *gs_data;
 336      -        struct gcore_segops *gs_ops;
 337      -} gcore_seg_t;
 338      -
 339  103  /* Callback function type for processing lwp entries */
 340  104  typedef int (*lwp_callback_t)(mdb_proc_t *, lwpent_t *, void *);
 341  105  
 342  106  /* Private data */
 343  107  static uintptr_t gcore_segvn_ops;
 344  108  static priv_impl_info_t prinfo;
 345  109  static sclass_t *gcore_sclass;
 346  110  static uintptr_t gcore_kas;
 347  111  static boolean_t gcore_initialized = B_FALSE;
 348  112  
↓ open down ↓ 368 lines elided ↑ open up ↑
 717  481  gcore_break_seg(mdb_proc_t *p)
 718  482  {
 719  483          uintptr_t addr = p->p_brkbase;
 720  484  
 721  485          if (p->p_brkbase != 0)
 722  486                  addr += p->p_brksize - 1;
 723  487  
 724  488          return (gcore_as_segat(p->p_as, addr));
 725  489  }
 726  490  
 727      -/* ISA dependent function. */
 728      -static uintptr_t
 729      -gcore_prgetstackbase(mdb_proc_t *p)
 730      -{
 731      -        return (p->p_usrstack - p->p_stksize);
 732      -}
 733      -
 734  491  static u_offset_t
 735  492  gcore_vnode_size(uintptr_t vnode_addr)
 736  493  {
 737  494          mdb_vnode_t     vnode;
 738  495          mdb_vnodeops_t  vnodeops;
 739  496          char            vops_name[128];
 740  497  
 741  498          if (mdb_ctf_vread(&vnode, "vnode_t", "mdb_vnode_t", vnode_addr, 0) ==
 742  499              -1) {
 743  500                  return (-1);
↓ open down ↓ 634 lines elided ↑ open up ↑
1378 1135                          sp->sa_flags |= SA_NODEFER;
1379 1136                  if (sig == SIGCLD) {
1380 1137                          if (p->p_flag & SNOWAIT)
1381 1138                                  sp->sa_flags |= SA_NOCLDWAIT;
1382 1139                          if ((p->p_flag & SJCTL) == 0)
1383 1140                                  sp->sa_flags |= SA_NOCLDSTOP;
1384 1141                  }
1385 1142          }
1386 1143  }
1387 1144  
1388      -/* ISA dependent function. */
1389      -static int
1390      -gcore_prfetchinstr(mdb_klwp_t *lwp, ulong_t *ip)
1391      -{
1392      -        *ip = (ulong_t)(instr_t)lwp->lwp_pcb.pcb_instr;
1393      -        return (lwp->lwp_pcb.pcb_flags & INSTR_VALID);
1394      -}
1395      -
1396      -/* ISA dependent function. */
1397      -static int
1398      -gcore_prisstep(mdb_klwp_t *lwp)
1399      -{
1400      -        return ((lwp->lwp_pcb.pcb_flags &
1401      -            (NORMAL_STEP|WATCH_STEP|DEBUG_PENDING)) != 0);
1402      -}
1403      -
1404      -/* ISA dependent function. */
1405      -static void
1406      -gcore_getgregs(mdb_klwp_t *lwp, gregset_t grp)
1407      -{
1408      -        struct regs rgs;
1409      -        struct regs *rp;
1410      -
1411      -        if (mdb_vread(&rgs, sizeof (rgs), lwp->lwp_regs) != sizeof (rgs)) {
1412      -                mdb_warn("Failed to read regs from %p\n", lwp->lwp_regs);
1413      -                return;
1414      -        }
1415      -        rp = &rgs;
1416      -
1417      -#if defined(__amd64)
1418      -        struct pcb *pcb = &lwp->lwp_pcb;
1419      -
1420      -        grp[REG_RDI] = rp->r_rdi;
1421      -        grp[REG_RSI] = rp->r_rsi;
1422      -        grp[REG_RDX] = rp->r_rdx;
1423      -        grp[REG_RCX] = rp->r_rcx;
1424      -        grp[REG_R8] = rp->r_r8;
1425      -        grp[REG_R9] = rp->r_r9;
1426      -        grp[REG_RAX] = rp->r_rax;
1427      -        grp[REG_RBX] = rp->r_rbx;
1428      -        grp[REG_RBP] = rp->r_rbp;
1429      -        grp[REG_R10] = rp->r_r10;
1430      -        grp[REG_R11] = rp->r_r11;
1431      -        grp[REG_R12] = rp->r_r12;
1432      -        grp[REG_R13] = rp->r_r13;
1433      -        grp[REG_R14] = rp->r_r14;
1434      -        grp[REG_R15] = rp->r_r15;
1435      -        grp[REG_FSBASE] = pcb->pcb_fsbase;
1436      -        grp[REG_GSBASE] = pcb->pcb_gsbase;
1437      -        if (pcb->pcb_rupdate == 1) {
1438      -                grp[REG_DS] = pcb->pcb_ds;
1439      -                grp[REG_ES] = pcb->pcb_es;
1440      -                grp[REG_FS] = pcb->pcb_fs;
1441      -                grp[REG_GS] = pcb->pcb_gs;
1442      -        } else {
1443      -                grp[REG_DS] = rp->r_ds;
1444      -                grp[REG_ES] = rp->r_es;
1445      -                grp[REG_FS] = rp->r_fs;
1446      -                grp[REG_GS] = rp->r_gs;
1447      -        }
1448      -        grp[REG_TRAPNO] = rp->r_trapno;
1449      -        grp[REG_ERR] = rp->r_err;
1450      -        grp[REG_RIP] = rp->r_rip;
1451      -        grp[REG_CS] = rp->r_cs;
1452      -        grp[REG_SS] = rp->r_ss;
1453      -        grp[REG_RFL] = rp->r_rfl;
1454      -        grp[REG_RSP] = rp->r_rsp;
1455      -#else
1456      -        bcopy(&rp->r_gs, grp, sizeof (gregset_t));
1457      -#endif
1458      -}
1459      -
1460      -/* ISA dependent functions. */
1461      -static int
1462      -gcore_prgetrvals(mdb_klwp_t *lwp, long *rval1, long *rval2)
1463      -{
1464      -        struct regs *r = lwptoregs(lwp);
1465      -
1466      -        if (r->r_ps & PS_C)
1467      -                return (r->r_r0);
1468      -        if (lwp->lwp_eosys == JUSTRETURN) {
1469      -                *rval1 = 0;
1470      -                *rval2 = 0;
1471      -        } else {
1472      -                *rval1 = r->r_r0;
1473      -                *rval2 = r->r_r1;
1474      -        }
1475      -        return (0);
1476      -}
1477      -
1478 1145  static void
1479 1146  gcore_prgetprregs(mdb_klwp_t *lwp, prgregset_t prp)
1480 1147  {
1481 1148          gcore_getgregs(lwp, prp);
1482 1149  }
1483 1150  
1484 1151  /*
1485 1152   * Field not populated:
1486 1153   *   - pr_tstamp
1487 1154   *   - pr_utime
↓ open down ↓ 933 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX