]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-arm/ptrace.h
[ARM] 4474/1: Do not check the PSR_F_BIT in valid_user_regs
[linux-2.6-omap-h63xx.git] / include / asm-arm / ptrace.h
index ff038b65f3709e3867aa8565705b16fd5bcf6ba3..7aaa206cb54ef22e8a45d92822b31bc8bda18782 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef __ASM_ARM_PTRACE_H
 #define __ASM_ARM_PTRACE_H
 
+#include <asm/hwcap.h>
+
 #define PTRACE_GETREGS         12
 #define PTRACE_SETREGS         13
 #define PTRACE_GETFPREGS       14
@@ -45,6 +47,7 @@
 #define PSR_T_BIT      0x00000020
 #define PSR_F_BIT      0x00000040
 #define PSR_I_BIT      0x00000080
+#define PSR_A_BIT      0x00000100
 #define PSR_J_BIT      0x01000000
 #define PSR_Q_BIT      0x08000000
 #define PSR_V_BIT      0x10000000
@@ -121,14 +124,17 @@ struct pt_regs {
  */
 static inline int valid_user_regs(struct pt_regs *regs)
 {
-       if (user_mode(regs) &&
-           (regs->ARM_cpsr & (PSR_F_BIT|PSR_I_BIT)) == 0)
+       if (user_mode(regs) && (regs->ARM_cpsr & PSR_I_BIT) == 0) {
+               regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
                return 1;
+       }
 
        /*
         * Force CPSR to something logical...
         */
-       regs->ARM_cpsr &= PSR_f | PSR_s | PSR_x | PSR_T_BIT | MODE32_BIT;
+       regs->ARM_cpsr &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT) | PSR_T_BIT | MODE32_BIT;
+       if (!(elf_hwcap & HWCAP_26BIT))
+               regs->ARM_cpsr |= USR_MODE;
 
        return 0;
 }