mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
Fix dtrace fbt return probes on arm64
As with arm and riscv fix return fbt probes on arm64. arg0 should be
the offset within the function of the return instruction and arg1
should be the return value.
Reviewed by: kp, markj
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D33440
(cherry picked from commit e3ccf4f9de
)
This commit is contained in:
parent
4741f854ce
commit
5143c53dfb
@ -270,7 +270,7 @@ dtrace_invop_start(struct trapframe *frame)
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
invop = dtrace_invop(frame->tf_elr, frame, frame->tf_elr);
|
||||
invop = dtrace_invop(frame->tf_elr, frame, frame->tf_x[0]);
|
||||
|
||||
tmp = (invop & LDP_STP_MASK);
|
||||
if (tmp == STP_64 || tmp == LDP_64) {
|
||||
|
@ -56,16 +56,21 @@ fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
|
||||
fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
|
||||
|
||||
for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
|
||||
if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
|
||||
cpu->cpu_dtrace_caller = addr;
|
||||
if ((uintptr_t)fbt->fbtp_patchpoint != addr)
|
||||
continue;
|
||||
|
||||
cpu->cpu_dtrace_caller = addr;
|
||||
|
||||
if (fbt->fbtp_roffset == 0) {
|
||||
dtrace_probe(fbt->fbtp_id, frame->tf_x[0],
|
||||
frame->tf_x[1], frame->tf_x[2],
|
||||
frame->tf_x[3], frame->tf_x[4]);
|
||||
|
||||
cpu->cpu_dtrace_caller = 0;
|
||||
return (fbt->fbtp_savedval);
|
||||
} else {
|
||||
dtrace_probe(fbt->fbtp_id, fbt->fbtp_roffset, rval,
|
||||
0, 0, 0);
|
||||
}
|
||||
cpu->cpu_dtrace_caller = 0;
|
||||
return (fbt->fbtp_savedval);
|
||||
}
|
||||
|
||||
return (0);
|
||||
@ -199,6 +204,7 @@ fbt_provide_module_function(linker_file_t lf, int symindx,
|
||||
fbt->fbtp_rval = DTRACE_INVOP_B;
|
||||
else
|
||||
fbt->fbtp_rval = DTRACE_INVOP_RET;
|
||||
fbt->fbtp_roffset = (uintptr_t)instr - (uintptr_t)symval->value;
|
||||
fbt->fbtp_savedval = *instr;
|
||||
fbt->fbtp_patchval = FBT_PATCHVAL;
|
||||
fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
|
||||
|
Loading…
Reference in New Issue
Block a user