69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden/*
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * This file and its contents are supplied under the terms of the
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * Common Development and Distribution License ("CDDL"), version 1.0.
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * You may only use this file in accordance with the terms of version
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * 1.0 of the CDDL.
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * A full copy of the text of the CDDL should have accompanied this
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * source. A copy of the CDDL is also available via the Internet at
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * http://www.illumos.org/license/CDDL.
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden */
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden/*
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden * Copyright (c) 2013 by Delphix. All rights reserved.
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden */
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#include <mdb/mdb_modapi.h>
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#include <mdb/mdb_gcore.h>
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#include <mdb/mdb_debug.h>
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#include <sys/psw.h>
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#include <sys/privregs.h>
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidenuintptr_t
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidengcore_prgetstackbase(mdb_proc_t *p)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden{
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return (p->p_usrstack - p->p_stksize);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden}
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidenint
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidengcore_prfetchinstr(mdb_klwp_t *lwp, ulong_t *ip)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden{
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *ip = (ulong_t)(instr_t)lwp->lwp_pcb.pcb_instr;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return (lwp->lwp_pcb.pcb_flags & INSTR_VALID);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden}
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidenint
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidengcore_prisstep(mdb_klwp_t *lwp)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden{
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return ((lwp->lwp_pcb.pcb_flags &
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden (NORMAL_STEP|WATCH_STEP|DEBUG_PENDING)) != 0);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden}
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidenvoid
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidengcore_getgregs(mdb_klwp_t *lwp, gregset_t grp)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden{
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden struct regs rgs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden struct regs *rp;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden if (mdb_vread(&rgs, sizeof (rgs), lwp->lwp_regs) != sizeof (rgs)) {
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden mdb_warn("Failed to read regs from %p\n", lwp->lwp_regs);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden }
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden rp = &rgs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#if defined(__amd64)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden struct pcb *pcb = &lwp->lwp_pcb;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RDI] = rp->r_rdi;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RSI] = rp->r_rsi;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RDX] = rp->r_rdx;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RCX] = rp->r_rcx;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R8] = rp->r_r8;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R9] = rp->r_r9;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RAX] = rp->r_rax;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RBX] = rp->r_rbx;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RBP] = rp->r_rbp;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R10] = rp->r_r10;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R11] = rp->r_r11;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R12] = rp->r_r12;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R13] = rp->r_r13;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R14] = rp->r_r14;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_R15] = rp->r_r15;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_FSBASE] = pcb->pcb_fsbase;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_GSBASE] = pcb->pcb_gsbase;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden if (pcb->pcb_rupdate == 1) {
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_DS] = pcb->pcb_ds;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_ES] = pcb->pcb_es;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_FS] = pcb->pcb_fs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_GS] = pcb->pcb_gs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden } else {
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_DS] = rp->r_ds;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_ES] = rp->r_es;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_FS] = rp->r_fs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_GS] = rp->r_gs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden }
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_TRAPNO] = rp->r_trapno;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_ERR] = rp->r_err;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RIP] = rp->r_rip;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_CS] = rp->r_cs;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_SS] = rp->r_ss;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RFL] = rp->r_rfl;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden grp[REG_RSP] = rp->r_rsp;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#else
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden bcopy(&rp->r_gs, grp, sizeof (gregset_t));
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden#endif
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden}
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidenint
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Sidengcore_prgetrvals(mdb_klwp_t *lwp, long *rval1, long *rval2)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden{
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden struct regs *r = lwptoregs(lwp);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden if (r->r_ps & PS_C)
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return (r->r_r0);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden if (lwp->lwp_eosys == JUSTRETURN) {
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *rval1 = 0;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *rval2 = 0;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden } else {
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *rval1 = r->r_r0;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden *rval2 = r->r_r1;
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden }
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden return (0);
69a119caa6570c7077699161b7c28b6ee9f8b0f4Christopher Siden}