--- /dev/null	Mon Aug 26 23:30:17 2013
+++ new/usr/src/cmd/mdb/common/mdb/mdb_gcore.h	Mon Aug 26 23:30:17 2013
@@ -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 */
