Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89b881f3 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Greg Kroah-Hartman
Browse files

ARM: Fix kgdb breakpoint for Thumb2



commit d920eaa4c4559f59be7b4c2d26fa0a2e1aaa3da9 upstream.

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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 87765309
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);
}