#include <sys/types.h>
#include <sys/trap.h>
#include <kmdb/kmdb_dpi_impl.h>
#include <kmdb/kmdb_fault.h>
#include <kmdb/kmdb_kdi.h>
#include <mdb/mdb_err.h>
#include <mdb/mdb_debug.h>
#include <mdb/mdb_kreg.h>
#include <mdb/mdb.h>
void
kmdb_dpi_handle_fault(kreg_t trapno, kreg_t pc, kreg_t sp, int cpuid)
{
kmdb_kdi_system_claim();
mdb_dprintf(MDB_DBG_DPI, "\ndpi_handle_fault: trapno %u, pc 0x%0?p, "
"sp 0x%0?p\n", (int)trapno, pc, sp);
switch (trapno) {
case T_GPFLT:
errno = EACCES;
break;
default:
errno = EMDB_NOMAP;
}
if (kmdb_dpi_fault_pcb != NULL) {
longjmp(*kmdb_dpi_fault_pcb, 1);
}
kmdb_fault(trapno, pc, sp, cpuid);
}
int
kmdb_dpi_get_register(const char *regname, kreg_t *kregp)
{
return (mdb.m_dpi->dpo_get_register(regname, kregp));
}
int
kmdb_dpi_set_register(const char *regname, kreg_t kreg)
{
return (mdb.m_dpi->dpo_set_register(regname, kreg));
}
void
kmdb_dpi_resume_common(int cmd)
{
kreg_t pc, trapno;
ASSERT(kmdb_dpi_resume_requested == 0);
if (setjmp(kmdb_dpi_resume_pcb) == 0) {
(void) kmdb_dpi_get_register("pc", &pc);
mdb_dprintf(MDB_DBG_PROC, "Resume requested, pc is %p\n",
(void *)pc);
if (cmd != KMDB_DPI_CMD_RESUME_UNLOAD)
kmdb_dpi_resume_requested = 1;
longjmp(kmdb_dpi_entry_pcb, cmd);
} else {
(void) kmdb_dpi_get_register("pc", &pc);
(void) kmdb_dpi_get_register("trapno", &trapno);
mdb_dprintf(MDB_DBG_PROC, "Back from resume, pc: %p, "
"trapno: %u\n", (void *)pc, (int)trapno);
kmdb_dpi_resume_requested = 0;
switch (trapno) {
case T_BPTFLT:
kmdb_dpi_set_state(DPI_STATE_FAULTED,
DPI_STATE_WHY_BKPT);
break;
case T_DBGENTR:
kmdb_dpi_set_state(DPI_STATE_STOPPED, 0);
break;
default:
kmdb_dpi_set_state(DPI_STATE_FAULTED,
DPI_STATE_WHY_TRAP);
break;
}
}
mdb_dprintf(MDB_DBG_PROC, "returning from resume\n");
}
void
kmdb_dpi_reboot(void)
{
longjmp(kmdb_dpi_entry_pcb, KMDB_DPI_CMD_REBOOT);
}