[PATCH] ARM: Fix kgdb breakpoint for Thumb2

Johannes Stezenbach js at sig21.net
Wed Feb 16 08:47:49 PST 2022


On Wed, Feb 16, 2022 at 03:41:22PM +0000, Russell King (Oracle) wrote:
> The kgdb code needs to register an undef hook for the Thumb UDF
> instruction that will fault in order to be functional on Thumb2
> platforms.
> 
> Reported-by: Johannes Stezenbach <js at sig21.net>
> Signed-off-by: Russell King (Oracle) <rmk+kernel at armlinux.org.uk>
> ---
> This has the kgdb_arch_exit() problems fixed. Please check and
> supply tested-by etc attributations. Thanks.

Compiles cleanly and works.

Tested-by: Johannes Stezenbach <js at sig21.net>

Thanks,
Johannes


>  arch/arm/kernel/kgdb.c | 36 ++++++++++++++++++++++++++++--------
>  1 file changed, 28 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/arm/kernel/kgdb.c b/arch/arm/kernel/kgdb.c
> index 7bd30c0a4280..22f937e6f3ff 100644
> --- a/arch/arm/kernel/kgdb.c
> +++ b/arch/arm/kernel/kgdb.c
> @@ -154,22 +154,38 @@ static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int instr)
>  	return 0;
>  }
>  
> -static struct undef_hook kgdb_brkpt_hook = {
> +static struct undef_hook kgdb_brkpt_arm_hook = {
>  	.instr_mask		= 0xffffffff,
>  	.instr_val		= KGDB_BREAKINST,
> -	.cpsr_mask		= MODE_MASK,
> +	.cpsr_mask		= PSR_T_BIT | MODE_MASK,
>  	.cpsr_val		= SVC_MODE,
>  	.fn			= kgdb_brk_fn
>  };
>  
> -static struct undef_hook kgdb_compiled_brkpt_hook = {
> +static struct undef_hook kgdb_brkpt_thumb_hook = {
> +	.instr_mask		= 0xffff,
> +	.instr_val		= KGDB_BREAKINST & 0xffff,
> +	.cpsr_mask		= PSR_T_BIT | MODE_MASK,
> +	.cpsr_val		= PSR_T_BIT | SVC_MODE,
> +	.fn			= kgdb_brk_fn
> +};
> +
> +static struct undef_hook kgdb_compiled_brkpt_arm_hook = {
>  	.instr_mask		= 0xffffffff,
>  	.instr_val		= KGDB_COMPILED_BREAK,
> -	.cpsr_mask		= MODE_MASK,
> +	.cpsr_mask		= PSR_T_BIT | MODE_MASK,
>  	.cpsr_val		= SVC_MODE,
>  	.fn			= kgdb_compiled_brk_fn
>  };
>  
> +static struct undef_hook kgdb_compiled_brkpt_thumb_hook = {
> +	.instr_mask		= 0xffff,
> +	.instr_val		= KGDB_COMPILED_BREAK & 0xffff,
> +	.cpsr_mask		= PSR_T_BIT | MODE_MASK,
> +	.cpsr_val		= PSR_T_BIT | SVC_MODE,
> +	.fn			= kgdb_compiled_brk_fn
> +};
> +
>  static int __kgdb_notify(struct die_args *args, unsigned long cmd)
>  {
>  	struct pt_regs *regs = args->regs;
> @@ -210,8 +226,10 @@ int kgdb_arch_init(void)
>  	if (ret != 0)
>  		return ret;
>  
> -	register_undef_hook(&kgdb_brkpt_hook);
> -	register_undef_hook(&kgdb_compiled_brkpt_hook);
> +	register_undef_hook(&kgdb_brkpt_arm_hook);
> +	register_undef_hook(&kgdb_brkpt_thumb_hook);
> +	register_undef_hook(&kgdb_compiled_brkpt_arm_hook);
> +	register_undef_hook(&kgdb_compiled_brkpt_thumb_hook);
>  
>  	return 0;
>  }
> @@ -224,8 +242,10 @@ int kgdb_arch_init(void)
>   */
>  void kgdb_arch_exit(void)
>  {
> -	unregister_undef_hook(&kgdb_brkpt_hook);
> -	unregister_undef_hook(&kgdb_compiled_brkpt_hook);
> +	unregister_undef_hook(&kgdb_brkpt_arm_hook);
> +	unregister_undef_hook(&kgdb_brkpt_thumb_hook);
> +	unregister_undef_hook(&kgdb_compiled_brkpt_arm_hook);
> +	unregister_undef_hook(&kgdb_compiled_brkpt_thumb_hook);
>  	unregister_die_notifier(&kgdb_notifier);
>  }
>  
> -- 
> 2.30.2
> 
> 



More information about the linux-arm-kernel mailing list