summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorChristopher Siden <chris.siden@delphix.com>2013-08-27 10:51:34 -0800
committerChristopher Siden <chris.siden@delphix.com>2013-08-27 11:51:35 -0700
commit69a119caa6570c7077699161b7c28b6ee9f8b0f4 (patch)
tree7541d20ce9e18db879405a63920687b79020fa70 /usr/src
parent2df37efa12a69b067c7197296dd802eb4b8a9e85 (diff)
downloadillumos-joyent-69a119caa6570c7077699161b7c28b6ee9f8b0f4.tar.gz
3946 ::gcore (fix sparc build)
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/mdb/common/mdb/mdb_gcore.h277
-rw-r--r--usr/src/cmd/mdb/common/modules/genunix/Makefile.files1
-rw-r--r--usr/src/cmd/mdb/common/modules/genunix/gcore.c339
-rw-r--r--usr/src/cmd/mdb/intel/amd64/genunix/Makefile2
-rw-r--r--usr/src/cmd/mdb/intel/ia32/genunix/Makefile2
-rw-r--r--usr/src/cmd/mdb/intel/modules/genunix/gcore_isadep.c112
-rw-r--r--usr/src/cmd/mdb/sparc/modules/genunix/gcore_isadep.c58
-rw-r--r--usr/src/cmd/mdb/sparc/v9/genunix/Makefile4
-rw-r--r--usr/src/lib/libproc/common/Pservice.c5
-rw-r--r--usr/src/lib/libproc/sparc/Pisadep.c5
-rw-r--r--usr/src/lib/libproc/sparcv9/Pisadep.c5
11 files changed, 467 insertions, 343 deletions
diff --git a/usr/src/cmd/mdb/common/mdb/mdb_gcore.h b/usr/src/cmd/mdb/common/mdb/mdb_gcore.h
new file mode 100644
index 0000000000..efa8fd1165
--- /dev/null
+++ b/usr/src/cmd/mdb/common/mdb/mdb_gcore.h
@@ -0,0 +1,277 @@
+/*
+ * 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 */
diff --git a/usr/src/cmd/mdb/common/modules/genunix/Makefile.files b/usr/src/cmd/mdb/common/modules/genunix/Makefile.files
index 4270e3ff47..bb9fed2547 100644
--- a/usr/src/cmd/mdb/common/modules/genunix/Makefile.files
+++ b/usr/src/cmd/mdb/common/modules/genunix/Makefile.files
@@ -48,6 +48,7 @@ GENUNIX_SRCS = \
findstack_subr.c \
fm.c \
gcore.c \
+ gcore_isadep.c \
genunix.c \
group.c \
hotplug.c \
diff --git a/usr/src/cmd/mdb/common/modules/genunix/gcore.c b/usr/src/cmd/mdb/common/modules/genunix/gcore.c
index 12636444c8..cd8499b888 100644
--- a/usr/src/cmd/mdb/common/modules/genunix/gcore.c
+++ b/usr/src/cmd/mdb/common/modules/genunix/gcore.c
@@ -21,7 +21,8 @@
* (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
@@ -38,11 +39,11 @@
#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>
@@ -53,9 +54,7 @@
#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>
@@ -101,241 +100,6 @@
#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 *);
@@ -724,13 +488,6 @@ gcore_break_seg(mdb_proc_t *p)
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)
{
@@ -1385,96 +1142,6 @@ gcore_prgetaction(mdb_proc_t *p, user_t *up, uint_t sig, struct sigaction *sp)
}
}
-/* 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)
{
diff --git a/usr/src/cmd/mdb/intel/amd64/genunix/Makefile b/usr/src/cmd/mdb/intel/amd64/genunix/Makefile
index 8a284bb2d0..07f1069a84 100644
--- a/usr/src/cmd/mdb/intel/amd64/genunix/Makefile
+++ b/usr/src/cmd/mdb/intel/amd64/genunix/Makefile
@@ -76,3 +76,5 @@ CERRWARN += -_gcc=-Wno-parentheses
CERRWARN += -_gcc=-Wno-type-limits
LINTFLAGS64 += -erroff=E_EMPTY_TRANSLATION_UNIT
+
+MODSRCS_DIR = ../../../intel/modules/genunix
diff --git a/usr/src/cmd/mdb/intel/ia32/genunix/Makefile b/usr/src/cmd/mdb/intel/ia32/genunix/Makefile
index 354dc8e6b2..c2c36dcc2e 100644
--- a/usr/src/cmd/mdb/intel/ia32/genunix/Makefile
+++ b/usr/src/cmd/mdb/intel/ia32/genunix/Makefile
@@ -73,3 +73,5 @@ CERRWARN += -_gcc=-Wno-parentheses
CERRWARN += -_gcc=-Wno-type-limits
LINTFLAGS += -erroff=E_EMPTY_TRANSLATION_UNIT
+
+MODSRCS_DIR = ../../../intel/modules/genunix
diff --git a/usr/src/cmd/mdb/intel/modules/genunix/gcore_isadep.c b/usr/src/cmd/mdb/intel/modules/genunix/gcore_isadep.c
new file mode 100644
index 0000000000..73d5ecbb94
--- /dev/null
+++ b/usr/src/cmd/mdb/intel/modules/genunix/gcore_isadep.c
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ */
+
+#include <mdb/mdb_modapi.h>
+#include <mdb/mdb_gcore.h>
+#include <mdb/mdb_debug.h>
+
+#include <sys/psw.h>
+#include <sys/privregs.h>
+
+uintptr_t
+gcore_prgetstackbase(mdb_proc_t *p)
+{
+ return (p->p_usrstack - p->p_stksize);
+}
+
+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);
+}
+
+int
+gcore_prisstep(mdb_klwp_t *lwp)
+{
+ return ((lwp->lwp_pcb.pcb_flags &
+ (NORMAL_STEP|WATCH_STEP|DEBUG_PENDING)) != 0);
+}
+
+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
+}
+
+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);
+}
diff --git a/usr/src/cmd/mdb/sparc/modules/genunix/gcore_isadep.c b/usr/src/cmd/mdb/sparc/modules/genunix/gcore_isadep.c
new file mode 100644
index 0000000000..50f60516a1
--- /dev/null
+++ b/usr/src/cmd/mdb/sparc/modules/genunix/gcore_isadep.c
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+/*
+ * ::gcore is not supported on sparc, so these functions are not
+ * implemented.
+ */
+
+#ifndef _KMDB
+
+#include <mdb/mdb_gcore.h>
+
+/* ARGSUSED */
+uintptr_t
+gcore_prgetstackbase(mdb_proc_t *p)
+{
+ return (0);
+}
+
+/* ARGSUSED */
+int
+gcore_prfetchinstr(mdb_klwp_t *lwp, ulong_t *ip)
+{
+ return (0);
+}
+
+/* ARGSUSED */
+int
+gcore_prisstep(mdb_klwp_t *lwp)
+{
+ return (0);
+}
+
+/* ARGSUSED */
+void
+gcore_getgregs(mdb_klwp_t *lwp, gregset_t grp)
+{
+}
+
+/* ARGSUSED */
+int
+gcore_prgetrvals(mdb_klwp_t *lwp, long *rval1, long *rval2)
+{
+ return (0);
+}
+
+#endif /* _KMDB */
diff --git a/usr/src/cmd/mdb/sparc/v9/genunix/Makefile b/usr/src/cmd/mdb/sparc/v9/genunix/Makefile
index bb127fd0e3..7eaef5c824 100644
--- a/usr/src/cmd/mdb/sparc/v9/genunix/Makefile
+++ b/usr/src/cmd/mdb/sparc/v9/genunix/Makefile
@@ -50,7 +50,7 @@ include ../../../../Makefile.cmd.64
include ../../Makefile.sparcv9
include ../../../Makefile.module
-dmod/$(MODULE) := LDLIBS += -lm
+dmod/$(MODULE) := LDLIBS += -lm -lproc
#
# We are not actually hardwiring some dependency on sun4u, we just need to
@@ -70,3 +70,5 @@ CERRWARN += -_gcc=-Wno-unused-label
CERRWARN += -_gcc=-Wno-uninitialized
CERRWARN += -_gcc=-Wno-parentheses
CERRWARN += -_gcc=-Wno-type-limits
+
+MODSRCS_DIR = ../../../sparc/modules/genunix
diff --git a/usr/src/lib/libproc/common/Pservice.c b/usr/src/lib/libproc/common/Pservice.c
index 62c88d3ec8..03d013364f 100644
--- a/usr/src/lib/libproc/common/Pservice.c
+++ b/usr/src/lib/libproc/common/Pservice.c
@@ -176,10 +176,11 @@ ps_lgetxregsize(struct ps_prochandle *P, lwpid_t lwpid, int *xrsize)
struct stat statb;
if (P->state == PS_DEAD) {
- lwp_info_t *lwp = list_next(&P->core->core_lwp_head);
+ core_info_t *core = P->data;
+ lwp_info_t *lwp = list_next(&core->core_lwp_head);
uint_t i;
- for (i = 0; i < P->core->core_nlwp; i++, lwp = list_next(lwp)) {
+ for (i = 0; i < core->core_nlwp; i++, lwp = list_next(lwp)) {
if (lwp->lwp_id == lwpid) {
if (lwp->lwp_xregs != NULL)
*xrsize = sizeof (prxregset_t);
diff --git a/usr/src/lib/libproc/sparc/Pisadep.c b/usr/src/lib/libproc/sparc/Pisadep.c
index 9bdb2703ce..c3bbd99788 100644
--- a/usr/src/lib/libproc/sparc/Pisadep.c
+++ b/usr/src/lib/libproc/sparc/Pisadep.c
@@ -187,11 +187,12 @@ read_gwin(struct ps_prochandle *P, struct rwindow *rwp, uintptr_t sp)
gwin_query_t gq;
if (P->state == PS_DEAD) {
- lwp_info_t *lwp = list_next(&P->core->core_lwp_head);
+ core_info_t *core = P->data;
+ lwp_info_t *lwp = list_next(&core->core_lwp_head);
uint_t n;
int i;
- for (n = 0; n < P->core->core_nlwp; n++, lwp = list_next(lwp)) {
+ for (n = 0; n < core->core_nlwp; n++, lwp = list_next(lwp)) {
gwindows_t *gwin = lwp->lwp_gwins;
if (gwin == NULL)
diff --git a/usr/src/lib/libproc/sparcv9/Pisadep.c b/usr/src/lib/libproc/sparcv9/Pisadep.c
index 9a78ed08a5..6aff474ec0 100644
--- a/usr/src/lib/libproc/sparcv9/Pisadep.c
+++ b/usr/src/lib/libproc/sparcv9/Pisadep.c
@@ -235,11 +235,12 @@ read_gwin(struct ps_prochandle *P, struct rwindow *rwp, uintptr_t sp)
gwin_query_t gq;
if (P->state == PS_DEAD) {
- lwp_info_t *lwp = list_next(&P->core->core_lwp_head);
+ core_info_t *core = P->data;
+ lwp_info_t *lwp = list_next(&core->core_lwp_head);
uint_t n;
int i;
- for (n = 0; n < P->core->core_nlwp; n++, lwp = list_next(lwp)) {
+ for (n = 0; n < core->core_nlwp; n++, lwp = list_next(lwp)) {
gwindows_t *gwin = lwp->lwp_gwins;
if (gwin == NULL)