Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/dev/dtrace/riscv/dtrace_isa.c
Show All 31 Lines | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/stack.h> | #include <sys/stack.h> | ||||
#include <sys/pcpu.h> | #include <sys/pcpu.h> | ||||
#include <machine/frame.h> | #include <machine/frame.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#include <machine/encoding.h> | |||||
#include <machine/riscvreg.h> | |||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/vm_param.h> | #include <vm/vm_param.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <machine/atomic.h> | #include <machine/atomic.h> | ||||
#include <machine/db_machdep.h> | #include <machine/db_machdep.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#include <machine/stack.h> | #include <machine/stack.h> | ||||
#include <ddb/db_sym.h> | #include <ddb/db_sym.h> | ||||
#include <ddb/ddb.h> | #include <ddb/ddb.h> | ||||
#include <sys/kdb.h> | #include <sys/kdb.h> | ||||
#include "regset.h" | #include "regset.h" | ||||
#define MAX_USTACK_DEPTH 2048 | #define MAX_USTACK_DEPTH 2048 | ||||
uint8_t dtrace_fuword8_nocheck(void *); | uint8_t dtrace_fuword8_nocheck(void *); | ||||
uint16_t dtrace_fuword16_nocheck(void *); | uint16_t dtrace_fuword16_nocheck(void *); | ||||
uint32_t dtrace_fuword32_nocheck(void *); | uint32_t dtrace_fuword32_nocheck(void *); | ||||
uint64_t dtrace_fuword64_nocheck(void *); | uint64_t dtrace_fuword64_nocheck(void *); | ||||
int dtrace_match_opcode(uint32_t, int, int); | |||||
int dtrace_instr_sdsp(uint32_t **); | |||||
int dtrace_instr_ret(uint32_t **); | |||||
int dtrace_instr_c_sdsp(uint32_t **); | |||||
int dtrace_instr_c_ret(uint32_t **); | |||||
void | void | ||||
dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, | dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, | ||||
uint32_t *intrpc) | uint32_t *intrpc) | ||||
{ | { | ||||
struct unwind_state state; | struct unwind_state state; | ||||
uintptr_t caller; | uintptr_t caller; | ||||
register_t sp; | register_t sp; | ||||
int scp_offset; | int scp_offset; | ||||
▲ Show 20 Lines • Show All 365 Lines • ▼ Show 20 Lines | dtrace_fuword64(void *uaddr) | ||||
if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) { | if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) { | ||||
DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR); | DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR); | ||||
cpu_core[curcpu].cpuc_dtrace_illval = (uintptr_t)uaddr; | cpu_core[curcpu].cpuc_dtrace_illval = (uintptr_t)uaddr; | ||||
return (0); | return (0); | ||||
} | } | ||||
return (dtrace_fuword64_nocheck(uaddr)); | return (dtrace_fuword64_nocheck(uaddr)); | ||||
} | |||||
int | |||||
dtrace_match_opcode(uint32_t insn, int match, int mask) | |||||
{ | |||||
if (((insn ^ match) & mask) == 0) | |||||
return (1); | |||||
return (0); | |||||
} | |||||
int | |||||
dtrace_instr_sdsp(uint32_t **instr) | |||||
{ | |||||
if (dtrace_match_opcode(**instr, (MATCH_SD | RS2_RA | RS1_SP), | |||||
(MASK_SD | RS2_MASK | RS1_MASK))) | |||||
return (1); | |||||
return (0); | |||||
} | |||||
int | |||||
dtrace_instr_c_sdsp(uint32_t **instr) | |||||
{ | |||||
uint16_t *instr1; | |||||
int i; | |||||
for (i = 0; i < 2; i++) { | |||||
instr1 = (uint16_t *)(*instr) + i; | |||||
if (dtrace_match_opcode(*instr1, (MATCH_C_SDSP | RS2_C_RA), | |||||
(MASK_C_SDSP | RS2_C_MASK))) { | |||||
*instr = (uint32_t *)instr1; | |||||
return (1); | |||||
} | |||||
} | |||||
return (0); | |||||
} | |||||
int | |||||
dtrace_instr_ret(uint32_t **instr) | |||||
{ | |||||
if (dtrace_match_opcode(**instr, (MATCH_JALR | (X_RA << RS1_SHIFT)), | |||||
(MASK_JALR | RD_MASK | RS1_MASK | IMM_MASK))) | |||||
return (1); | |||||
return (0); | |||||
} | |||||
int | |||||
dtrace_instr_c_ret(uint32_t **instr) | |||||
{ | |||||
uint16_t *instr1; | |||||
int i; | |||||
for (i = 0; i < 2; i++) { | |||||
instr1 = (uint16_t *)(*instr) + i; | |||||
if (dtrace_match_opcode(*instr1, | |||||
(MATCH_C_JR | (X_RA << RD_SHIFT)), (MASK_C_JR | RD_MASK))) { | |||||
*instr = (uint32_t *)instr1; | |||||
return (1); | |||||
} | |||||
} | |||||
return (0); | |||||
} | } |