Commit 41e2e8fd authored by Russell King's avatar Russell King

ARM: Tighten check for allowable CPSR values

Reviewed-by: default avatarArve Hjønnevåg <arve@android.com>
Acked-by: default avatarDima Zavin <dima@android.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 21d93e2e
...@@ -158,15 +158,24 @@ struct pt_regs { ...@@ -158,15 +158,24 @@ struct pt_regs {
*/ */
static inline int valid_user_regs(struct pt_regs *regs) static inline int valid_user_regs(struct pt_regs *regs)
{ {
if (user_mode(regs) && (regs->ARM_cpsr & PSR_I_BIT) == 0) { unsigned long mode = regs->ARM_cpsr & MODE_MASK;
/*
* Always clear the F (FIQ) and A (delayed abort) bits
*/
regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT); regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
if ((regs->ARM_cpsr & PSR_I_BIT) == 0) {
if (mode == USR_MODE)
return 1;
if (elf_hwcap & HWCAP_26BIT && mode == USR26_MODE)
return 1; return 1;
} }
/* /*
* Force CPSR to something logical... * Force CPSR to something logical...
*/ */
regs->ARM_cpsr &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT) | PSR_T_BIT | MODE32_BIT; regs->ARM_cpsr &= PSR_f | PSR_s | PSR_x | PSR_T_BIT | MODE32_BIT;
if (!(elf_hwcap & HWCAP_26BIT)) if (!(elf_hwcap & HWCAP_26BIT))
regs->ARM_cpsr |= USR_MODE; regs->ARM_cpsr |= USR_MODE;
......
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