Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d1cbbd6b413510c6512f4f80ffd48db1a8dd554a
Commit:     d1cbbd6b413510c6512f4f80ffd48db1a8dd554a
Parent:     f884b1cf578e079f01682514ae1ae64c74586602
Author:     Catalin Marinas <[EMAIL PROTECTED]>
AuthorDate: Wed Jul 11 11:29:39 2007 +0100
Committer:  Russell King <[EMAIL PROTECTED]>
CommitDate: Thu Jul 12 16:20:52 2007 +0100

    [ARM] 4474/1: Do not check the PSR_F_BIT in valid_user_regs
    
    When running Linux in non-secure mode (on ARM1176 for example),
    depending on the CP15 secure configuration register, the CPSR.F bit
    (6) might only be modified from the secure mode. However, the
    valid_user_regs() function checks for this bit being cleared. With
    commit a6c61e9d, a SIGSEGV is forced in handle_signal() if the user
    registers are not considered valid.
    
    The patch also ensures that the CPSR.A bit is cleared and the USR mode
    is set if the CPU does not support the 26bit user mode.
    
    Signed-off-by: Catalin Marinas <[EMAIL PROTECTED]>
    Signed-off-by: Russell King <[EMAIL PROTECTED]>
---
 include/asm-arm/ptrace.h |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h
index ff038b6..7aaa206 100644
--- a/include/asm-arm/ptrace.h
+++ b/include/asm-arm/ptrace.h
@@ -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;
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to