提交 99cce8f7 编写于 作者: D Dan Williams 提交者: Russell King

[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: NDan Williams <dan.j.williams@intel.com>
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
上级 f16fb1ec
...@@ -286,6 +286,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) ...@@ -286,6 +286,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
struct undef_hook *hook; struct undef_hook *hook;
siginfo_t info; siginfo_t info;
void __user *pc; void __user *pc;
unsigned long flags;
/* /*
* According to the ARM ARM, PC is 2 or 4 bytes ahead, * 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,7 +305,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
get_user(instr, (u32 __user *)pc); get_user(instr, (u32 __user *)pc);
} }
spin_lock_irq(&undef_lock); spin_lock_irqsave(&undef_lock, flags);
list_for_each_entry(hook, &undef_hook, node) { list_for_each_entry(hook, &undef_hook, node) {
if ((instr & hook->instr_mask) == hook->instr_val && if ((instr & hook->instr_mask) == hook->instr_val &&
(regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) {
...@@ -314,7 +315,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) ...@@ -314,7 +315,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
} }
} }
} }
spin_unlock_irq(&undef_lock); spin_unlock_irqrestore(&undef_lock, flags);
#ifdef CONFIG_DEBUG_USER #ifdef CONFIG_DEBUG_USER
if (user_debug & UDBG_UNDEFINED) { if (user_debug & UDBG_UNDEFINED) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册