diff options
author | Dan Williams <dan.j.williams@intel.com> | 2007-05-02 19:18:34 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-05-03 09:07:48 -0400 |
commit | 99cce8f7b10716f8fdbaca21a7f3ba000119ad3b (patch) | |
tree | 028915c49215df5352d20f6ccc9258f3b25a3e9e /arch/arm/kernel/traps.c | |
parent | f16fb1ecc5a1cb2f7cc595179d1fe55e711e599f (diff) |
[ARM] 4356/1: arm: fix handling of svc mode undefined instructions
Now that do_undefinstr handles kernel and user mode undefined
instruction exceptions it must not assume that interrupts are enabled at
entry.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 6055ab4b58d9..f05e66b0f868 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -286,6 +286,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
286 | struct undef_hook *hook; | 286 | struct undef_hook *hook; |
287 | siginfo_t info; | 287 | siginfo_t info; |
288 | void __user *pc; | 288 | void __user *pc; |
289 | unsigned long flags; | ||
289 | 290 | ||
290 | /* | 291 | /* |
291 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, | 292 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, |
@@ -304,7 +305,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
304 | get_user(instr, (u32 __user *)pc); | 305 | get_user(instr, (u32 __user *)pc); |
305 | } | 306 | } |
306 | 307 | ||
307 | spin_lock_irq(&undef_lock); | 308 | spin_lock_irqsave(&undef_lock, flags); |
308 | list_for_each_entry(hook, &undef_hook, node) { | 309 | list_for_each_entry(hook, &undef_hook, node) { |
309 | if ((instr & hook->instr_mask) == hook->instr_val && | 310 | if ((instr & hook->instr_mask) == hook->instr_val && |
310 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { | 311 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { |
@@ -314,7 +315,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
314 | } | 315 | } |
315 | } | 316 | } |
316 | } | 317 | } |
317 | spin_unlock_irq(&undef_lock); | 318 | spin_unlock_irqrestore(&undef_lock, flags); |
318 | 319 | ||
319 | #ifdef CONFIG_DEBUG_USER | 320 | #ifdef CONFIG_DEBUG_USER |
320 | if (user_debug & UDBG_UNDEFINED) { | 321 | if (user_debug & UDBG_UNDEFINED) { |