diff options
Diffstat (limited to 'arch/arm64/kernel/entry-common.c')
| -rw-r--r-- | arch/arm64/kernel/entry-common.c | 8 | 
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index f546a914f041..a9c81715ce59 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -697,6 +697,8 @@ static void noinstr el0_breakpt(struct pt_regs *regs, unsigned long esr)  static void noinstr el0_softstp(struct pt_regs *regs, unsigned long esr)  { +	bool step_done; +  	if (!is_ttbr0_addr(regs->pc))  		arm64_apply_bp_hardening(); @@ -707,10 +709,10 @@ static void noinstr el0_softstp(struct pt_regs *regs, unsigned long esr)  	 * If we are stepping a suspended breakpoint there's nothing more to do:  	 * the single-step is complete.  	 */ -	if (!try_step_suspended_breakpoints(regs)) { -		local_daif_restore(DAIF_PROCCTX); +	step_done = try_step_suspended_breakpoints(regs); +	local_daif_restore(DAIF_PROCCTX); +	if (!step_done)  		do_el0_softstep(esr, regs); -	}  	arm64_exit_to_user_mode(regs);  }  | 
