Commit d920eaa4 authored by Russell King (Oracle)'s avatar Russell King (Oracle)
Browse files

ARM: Fix kgdb breakpoint for Thumb2



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: default avatarJohannes Stezenbach <js@sig21.net>
Tested-by: default avatarJohannes Stezenbach <js@sig21.net>
Fixes: 5cbad0eb ("kgdb: support for ARCH=arm")
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent 9f80ccda
Loading
Loading
Loading
Loading
+28 −8
Original line number Diff line number Diff line
@@ -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);
}