svn commit: r336722 - head/sys/arm/arm
John Baldwin
jhb at FreeBSD.org
Wed Jul 25 18:11:38 UTC 2018
Author: jhb
Date: Wed Jul 25 18:11:37 2018
New Revision: 336722
URL: https://svnweb.freebsd.org/changeset/base/336722
Log:
Raise a proper SIGTRAP / TRAP_TRACE signal for a PT_STEP step on arm.
Previously, a step by PT_STEP resulted in no signal being raised to
the debugger so that a step was silently completed with the program
continuing to execute after the step. Fix by raising a SIGTRAP
signal with TRAP_TRACE as the signal code.
To simplify the error handling cases (if ptrace_clear_single_step()
fails, etc.) move the handling of PTRACE_BREAKPOINT into the
gdb_trapper() function. If ptrace_clear_single_step() fails,
gdb_trapper() won't claim the fault, and the default case of
SIGILL / ILL_OPC will be used.
Differential Revision: https://reviews.freebsd.org/D16100
Modified:
head/sys/arm/arm/undefined.c
Modified: head/sys/arm/arm/undefined.c
==============================================================================
--- head/sys/arm/arm/undefined.c Wed Jul 25 17:45:56 2018 (r336721)
+++ head/sys/arm/arm/undefined.c Wed Jul 25 18:11:37 2018 (r336722)
@@ -144,6 +144,7 @@ gdb_trapper(u_int addr, u_int insn, struct trapframe *
{
struct thread *td;
ksiginfo_t ksi;
+ int error;
td = (curthread == NULL) ? &thread0 : curthread;
@@ -162,6 +163,27 @@ gdb_trapper(u_int addr, u_int insn, struct trapframe *
#endif
#endif
}
+
+ if (code == FAULT_USER) {
+ /* TODO: No support for ptrace from Thumb-2 */
+ if ((frame->tf_spsr & PSR_T) == 0 &&
+ insn == PTRACE_BREAKPOINT) {
+ PROC_LOCK(td->td_proc);
+ _PHOLD(td->td_proc);
+ error = ptrace_clear_single_step(td);
+ _PRELE(td->td_proc);
+ PROC_UNLOCK(td->td_proc);
+ if (error == 0) {
+ ksiginfo_init_trap(&ksi);
+ ksi.ksi_signo = SIGTRAP;
+ ksi.ksi_code = TRAP_TRACE;
+ ksi.ksi_addr = (u_int32_t *)addr;
+ trapsignal(td, &ksi);
+ return (0);
+ }
+ }
+ }
+
return 1;
}
@@ -191,7 +213,6 @@ undefinedinstruction(struct trapframe *frame)
int fault_code;
int coprocessor;
struct undefined_handler *uh;
- int error;
#ifdef VERBOSE_ARM32
int s;
#endif
@@ -304,26 +325,6 @@ undefinedinstruction(struct trapframe *frame)
if (uh->uh_handler(fault_pc, fault_instruction, frame,
fault_code) == 0)
break;
-
- if (fault_code & FAULT_USER) {
- /* TODO: No support for ptrace from Thumb-2 */
- if ((frame->tf_spsr & PSR_T) == 0 &&
- fault_instruction == PTRACE_BREAKPOINT) {
- PROC_LOCK(td->td_proc);
- _PHOLD(td->td_proc);
- error = ptrace_clear_single_step(td);
- _PRELE(td->td_proc);
- PROC_UNLOCK(td->td_proc);
- if (error != 0) {
- ksiginfo_init_trap(&ksi);
- ksi.ksi_signo = SIGILL;
- ksi.ksi_code = ILL_ILLOPC;
- ksi.ksi_addr = (u_int32_t *)(intptr_t) fault_pc;
- trapsignal(td, &ksi);
- }
- return;
- }
- }
if (uh == NULL && (fault_code & FAULT_USER)) {
/* Fault has not been handled */
More information about the svn-src-all
mailing list