root/usr/src/cmd/mdb/common/mdb/mdb_gcore.h
/*
 * 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 */