Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/dev/dtrace/riscv/dtrace_subr.c
Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
#include <machine/frame.h> | #include <machine/frame.h> | ||||
#include <machine/trap.h> | #include <machine/trap.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
extern dtrace_id_t dtrace_probeid_error; | extern dtrace_id_t dtrace_probeid_error; | ||||
extern int (*dtrace_invop_jump_addr)(struct trapframe *); | extern int (*dtrace_invop_jump_addr)(struct trapframe *); | ||||
extern void dtrace_getnanotime(struct timespec *tsp); | extern void dtrace_getnanotime(struct timespec *tsp); | ||||
int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t); | int dtrace_invop(uintptr_t, struct trapframe *); | ||||
void dtrace_invop_init(void); | void dtrace_invop_init(void); | ||||
void dtrace_invop_uninit(void); | void dtrace_invop_uninit(void); | ||||
typedef struct dtrace_invop_hdlr { | typedef struct dtrace_invop_hdlr { | ||||
int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t); | int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t); | ||||
struct dtrace_invop_hdlr *dtih_next; | struct dtrace_invop_hdlr *dtih_next; | ||||
} dtrace_invop_hdlr_t; | } dtrace_invop_hdlr_t; | ||||
dtrace_invop_hdlr_t *dtrace_invop_hdlr; | dtrace_invop_hdlr_t *dtrace_invop_hdlr; | ||||
int | int | ||||
dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax) | dtrace_invop(uintptr_t addr, struct trapframe *frame) | ||||
{ | { | ||||
dtrace_invop_hdlr_t *hdlr; | dtrace_invop_hdlr_t *hdlr; | ||||
int rval; | int rval; | ||||
for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next) | for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next) | ||||
if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0) | if ((rval = hdlr->dtih_func(addr, frame, 0)) != 0) | ||||
return (rval); | return (rval); | ||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t)) | dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t)) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 166 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
dtrace_invop_start(struct trapframe *frame) | dtrace_invop_start(struct trapframe *frame) | ||||
{ | { | ||||
register_t *sp; | register_t *sp; | ||||
uint32_t uimm; | uint32_t uimm; | ||||
uint32_t imm; | uint32_t imm; | ||||
int invop; | int invop; | ||||
invop = dtrace_invop(frame->tf_sepc, frame, frame->tf_sepc); | invop = dtrace_invop(frame->tf_sepc, frame); | ||||
if (invop == 0) | if (invop == 0) | ||||
return (-1); | return (-1); | ||||
if (match_opcode(invop, (MATCH_SD | RS2_RA | RS1_SP), | if (match_opcode(invop, (MATCH_SD | RS2_RA | RS1_SP), | ||||
(MASK_SD | RS2_MASK | RS1_MASK))) { | (MASK_SD | RS2_MASK | RS1_MASK))) { | ||||
/* Non-compressed store of ra to sp */ | /* Non-compressed store of ra to sp */ | ||||
imm = (invop >> 7) & 0x1f; | imm = (invop >> 7) & 0x1f; | ||||
imm |= ((invop >> 25) & 0x7f) << 5; | imm |= ((invop >> 25) & 0x7f) << 5; | ||||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |