[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