[PATCH v3 09/13] arm64: debug: split single stepping exception entry

Ada Couprie Diaz ada.coupriediaz at arm.com
Fri Jun 20 14:20:45 PDT 2025


On 18/06/2025 17:02, Mark Rutland wrote:

> This looks good; one comment below.
>
> On Mon, Jun 09, 2025 at 06:34:09PM +0100, Ada Couprie Diaz wrote:
>> +void do_softstep(unsigned long esr, struct pt_regs *regs)
>>   {
>> -	/*
>> -	 * If we are stepping a pending breakpoint, call the hw_breakpoint
>> -	 * handler first.
>> -	 */
>> -	if (try_step_suspended_breakpoints(regs))
>> -		return 0;
>> -
>>   	if (call_step_hook(regs, esr) == DBG_HOOK_HANDLED)
>> -		return 0;
>> +		return;
>>   
>>   	if (user_mode(regs)) {
>>   		send_user_sigtrap(TRAP_TRACE);
>> @@ -219,10 +212,8 @@ static int single_step_handler(unsigned long unused, unsigned long esr,
>>   		 */
>>   		set_regs_spsr_ss(regs);
>>   	}
>> -
>> -	return 0;
>>   }
>> -NOKPROBE_SYMBOL(single_step_handler);
>> +NOKPROBE_SYMBOL(do_softstep);
> With the EL0/EL1 entry paths split up, it would be nice to split this
> into separate do_el{0,1}_softstep() handlers, like we do for
> do_el{0,1}_undef(). With the relevant portions of call_step_hook()
> folded in, that'd leave us with:
>
> | void do_el0_softstep(struct pt_regs *regs, unsigned long esr)
> | {
> | 	if (uprobe_singlestep_handler(regs, esr) == DBG_HOOK_HANDLED)
> | 		return;
> | 	
> | 	send_user_sigtrap(TRAP_TRACE);
> | 	/*
> | 	 * ptrace will disable single step unless explicitly asked to
> | 	 * re-enable it. For other clients, it makes sense to leave it
> | 	 * enabled (i.e. rewind the controls to the active-not-pending
> | 	 * state).
> | 	 */
> | 	 user_rewind_single_step(current);
> | }
> |
> | void do_el1_softstep(struct pt_regs *regs, unsigned long esr)
> | {
> | 	if (kgdb_singlestep_handler(regs, esr) == DBG_HOOK_HANDLED)
> | 		return;
> | 	
> | 	pr_warn("Unexpected kernel single-step exception at EL1\n");
> | 	/*
> | 	 * Re-enable stepping since we know that we will be
> | 	 * returning to regs.
> | 	 */
> | 	set_regs_spsr_ss(regs);
> | }
> | NOKPROBE_SYMBOL(do_el1_softstep):
>
> Doing that would remove some indirection, and make this a bit easier to
> follow. That would also permit the EL0 handler to be kprobed (which is
> safe since there's no risk of recursion in the EL0 handler).
>
> Mark.
Agree, that's really nice and being able to probe a bit more is quite 
useful !

I split the EL0/EL1 handlers for the soft step and BRK64 in v4.

Thanks Mark,
Ada





More information about the linux-arm-kernel mailing list