Commit 2dacab73 authored by Matthew Leach's avatar Matthew Leach Committed by Catalin Marinas

arm64: debug: make aarch32 bkpt checking endian clean

The current breakpoint instruction checking code for A32 is not endian
clean. Fix this with appropriate byte-swapping when retrieving
instructions.
Signed-off-by: default avatarMatthew Leach <matthew.leach@arm.com>
Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 6a2e5e52
...@@ -248,7 +248,8 @@ static int brk_handler(unsigned long addr, unsigned int esr, ...@@ -248,7 +248,8 @@ static int brk_handler(unsigned long addr, unsigned int esr,
int aarch32_break_handler(struct pt_regs *regs) int aarch32_break_handler(struct pt_regs *regs)
{ {
siginfo_t info; siginfo_t info;
unsigned int instr; u32 arm_instr;
u16 thumb_instr;
bool bp = false; bool bp = false;
void __user *pc = (void __user *)instruction_pointer(regs); void __user *pc = (void __user *)instruction_pointer(regs);
...@@ -257,18 +258,21 @@ int aarch32_break_handler(struct pt_regs *regs) ...@@ -257,18 +258,21 @@ int aarch32_break_handler(struct pt_regs *regs)
if (compat_thumb_mode(regs)) { if (compat_thumb_mode(regs)) {
/* get 16-bit Thumb instruction */ /* get 16-bit Thumb instruction */
get_user(instr, (u16 __user *)pc); get_user(thumb_instr, (u16 __user *)pc);
if (instr == AARCH32_BREAK_THUMB2_LO) { thumb_instr = le16_to_cpu(thumb_instr);
if (thumb_instr == AARCH32_BREAK_THUMB2_LO) {
/* get second half of 32-bit Thumb-2 instruction */ /* get second half of 32-bit Thumb-2 instruction */
get_user(instr, (u16 __user *)(pc + 2)); get_user(thumb_instr, (u16 __user *)(pc + 2));
bp = instr == AARCH32_BREAK_THUMB2_HI; thumb_instr = le16_to_cpu(thumb_instr);
bp = thumb_instr == AARCH32_BREAK_THUMB2_HI;
} else { } else {
bp = instr == AARCH32_BREAK_THUMB; bp = thumb_instr == AARCH32_BREAK_THUMB;
} }
} else { } else {
/* 32-bit ARM instruction */ /* 32-bit ARM instruction */
get_user(instr, (u32 __user *)pc); get_user(arm_instr, (u32 __user *)pc);
bp = (instr & ~0xf0000000) == AARCH32_BREAK_ARM; arm_instr = le32_to_cpu(arm_instr);
bp = (arm_instr & ~0xf0000000) == AARCH32_BREAK_ARM;
} }
if (!bp) if (!bp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment