svn commit: r365626 - in head/sys/cddl/dev: dtrace/riscv fbt/riscv
Kristof Provost
kp at FreeBSD.org
Fri Sep 11 09:15:50 UTC 2020
Author: kp
Date: Fri Sep 11 09:15:49 2020
New Revision: 365626
URL: https://svnweb.freebsd.org/changeset/base/365626
Log:
dtrace: fix fbt return probes on RISC-V
Return values are passed in a0, so read it from there. We also pass a1 through
to userspace, as the ABI allows small structs to be returned in registers
a0/a1. While here read the register values directly from the trapframe rather
than rtval, and remove the now unneeded argument from dtrace_invop().
Set fbtp_roffset so that we get the correct return location in arg0.
Reviewed by: markj
Sponsored by: Axiado
Differential Revision: https://reviews.freebsd.org/D26389
Modified:
head/sys/cddl/dev/dtrace/riscv/dtrace_subr.c
head/sys/cddl/dev/fbt/riscv/fbt_isa.c
Modified: head/sys/cddl/dev/dtrace/riscv/dtrace_subr.c
==============================================================================
--- head/sys/cddl/dev/dtrace/riscv/dtrace_subr.c Fri Sep 11 05:45:27 2020 (r365625)
+++ head/sys/cddl/dev/dtrace/riscv/dtrace_subr.c Fri Sep 11 09:15:49 2020 (r365626)
@@ -53,7 +53,7 @@ extern dtrace_id_t dtrace_probeid_error;
extern int (*dtrace_invop_jump_addr)(struct trapframe *);
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_uninit(void);
@@ -65,13 +65,13 @@ typedef struct dtrace_invop_hdlr {
dtrace_invop_hdlr_t *dtrace_invop_hdlr;
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;
int rval;
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 (0);
@@ -254,7 +254,7 @@ dtrace_invop_start(struct trapframe *frame)
uint32_t imm;
int invop;
- invop = dtrace_invop(frame->tf_sepc, frame, frame->tf_sepc);
+ invop = dtrace_invop(frame->tf_sepc, frame);
if (invop == 0)
return (-1);
Modified: head/sys/cddl/dev/fbt/riscv/fbt_isa.c
==============================================================================
--- head/sys/cddl/dev/fbt/riscv/fbt_isa.c Fri Sep 11 05:45:27 2020 (r365625)
+++ head/sys/cddl/dev/fbt/riscv/fbt_isa.c Fri Sep 11 09:15:49 2020 (r365626)
@@ -59,9 +59,14 @@ fbt_invop(uintptr_t addr, struct trapframe *frame, uin
if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
cpu->cpu_dtrace_caller = addr;
- dtrace_probe(fbt->fbtp_id, frame->tf_a[0],
- frame->tf_a[1], frame->tf_a[2],
- frame->tf_a[3], frame->tf_a[4]);
+ if (fbt->fbtp_roffset == 0) {
+ dtrace_probe(fbt->fbtp_id, frame->tf_a[0],
+ frame->tf_a[1], frame->tf_a[2],
+ frame->tf_a[3], frame->tf_a[4]);
+ } else {
+ dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset,
+ frame->tf_a[0], frame->tf_a[1], 0, 0);
+ }
cpu->cpu_dtrace_caller = 0;
return (fbt->fbtp_savedval);
@@ -233,6 +238,7 @@ again:
fbt->fbtp_loadcnt = lf->loadcnt;
fbt->fbtp_symindx = symindx;
fbt->fbtp_rval = rval;
+ fbt->fbtp_roffset = (uintptr_t)instr - (uintptr_t)symval->value;
fbt->fbtp_savedval = *instr;
fbt->fbtp_patchval = patchval;
fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
More information about the svn-src-all
mailing list