Revert strace hiccups fix.
authorDavid S. Miller <davem@davemloft.net>
Sat, 6 Oct 2012 03:39:04 +0000 (20:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 6 Oct 2012 03:39:04 +0000 (20:39 -0700)
This reverts commit 40138249c3b7a0762155216b963ec7fd4d09b5b4 and
ffa9009c9828db3f74178e459cfbca6e77ff5dd9.

There are problems with how the flag bytes were rearranged, in
particular we really can't move values down into the lowest
16 bits since those are used for individual state bits.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/ptrace.h
arch/sparc/include/asm/thread_info_64.h
arch/sparc/kernel/etrap_64.S
arch/sparc/kernel/syscalls.S
arch/sparc/kernel/traps_64.c

index eeed804316bfa02535b0dab0fe423387a6daa5d7..fd9c3f21cbf059d8130fd90d44cf67c3d0641942 100644 (file)
@@ -202,7 +202,9 @@ struct global_reg_snapshot {
 };
 extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
 
-#define force_successful_syscall_return() set_thread_noerror(1)
+#define force_successful_syscall_return()          \
+do {   current_thread_info()->syscall_noerror = 1; \
+} while (0)
 #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
 #define instruction_pointer(regs) ((regs)->tpc)
 #define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
index 8511e5fcc97dca630a56a7ed2376989227bf6102..cfa8c38fb9c8511d51cfbe17e3d8792584d8b241 100644 (file)
 #define TI_FLAG_CWP_SHIFT              40
 #define TI_FLAG_BYTE_CURRENT_DS                3
 #define TI_FLAG_CURRENT_DS_SHIFT       32
-#define TI_FLAG_BYTE_NOERROR           4
-#define TI_FLAG_BYTE_NOERROR_SHIFT     24
-#define TI_FLAG_BYTE_FPDEPTH           5
-#define TI_FLAG_FPDEPTH_SHIFT          16
-#define TI_FLAG_BYTE_WSAVED            6
-#define TI_FLAG_WSAVED_SHIFT           8
+#define TI_FLAG_BYTE_FPDEPTH           4
+#define TI_FLAG_FPDEPTH_SHIFT          24
+#define TI_FLAG_BYTE_WSAVED            5
+#define TI_FLAG_WSAVED_SHIFT           16
 
 #include <asm/page.h>
 
@@ -49,7 +47,7 @@ struct thread_info {
        struct exec_domain      *exec_domain;
        int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
        __u8                    new_child;
-       __u8                    __pad;
+       __u8                    syscall_noerror;
        __u16                   cpu;
 
        unsigned long           *utraps;
@@ -79,7 +77,6 @@ struct thread_info {
 #define TI_CURRENT_DS  (TI_FLAGS + TI_FLAG_BYTE_CURRENT_DS)
 #define TI_FPDEPTH     (TI_FLAGS + TI_FLAG_BYTE_FPDEPTH)
 #define TI_WSAVED      (TI_FLAGS + TI_FLAG_BYTE_WSAVED)
-#define TI_SYS_NOERROR (TI_FLAGS + TI_FLAG_BYTE_NOERROR)
 #define TI_FPSAVED     0x00000010
 #define TI_KSP         0x00000018
 #define TI_FAULT_ADDR  0x00000020
@@ -87,6 +84,7 @@ struct thread_info {
 #define TI_EXEC_DOMAIN 0x00000030
 #define TI_PRE_COUNT   0x00000038
 #define TI_NEW_CHILD   0x0000003c
+#define TI_SYS_NOERROR 0x0000003d
 #define TI_CPU         0x0000003e
 #define TI_UTRAPS      0x00000040
 #define TI_REG_WINDOW  0x00000048
@@ -157,8 +155,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
 #define set_thread_cwp(val)            (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP] = (val))
 #define get_thread_current_ds()                (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS])
 #define set_thread_current_ds(val)     (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS] = (val))
-#define get_thread_noerror()           (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR])
-#define set_thread_noerror(val)                (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR] = (val))
 #define get_thread_fpdepth()           (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH])
 #define set_thread_fpdepth(val)                (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH] = (val))
 #define get_thread_wsaved()            (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED])
index 1276ca2567bab310771d214baa77876ea9e43f0e..786b185e6e3fa8d37e6cac8b820b0654b1b787c3 100644 (file)
@@ -92,10 +92,8 @@ etrap_save:  save    %g2, -STACK_BIAS, %sp
                rdpr    %wstate, %g2
                wrpr    %g0, 0, %canrestore
                sll     %g2, 3, %g2
-
-               /* Set TI_SYS_FPDEPTH to 1 and clear TI_SYS_NOERROR.  */
                mov     1, %l5
-               sth     %l5, [%l6 + TI_SYS_NOERROR]
+               stb     %l5, [%l6 + TI_FPDEPTH]
 
                wrpr    %g3, 0, %otherwin
                wrpr    %g2, 0, %wstate
@@ -154,9 +152,7 @@ etrap_save: save    %g2, -STACK_BIAS, %sp
                add     %l6, TI_FPSAVED + 1, %l4
                srl     %l5, 1, %l3
                add     %l5, 2, %l5
-
-               /* Set TI_SYS_FPDEPTH to %l5 and clear TI_SYS_NOERROR.  */
-               sth     %l5, [%l6 + TI_SYS_NOERROR]
+               stb     %l5, [%l6 + TI_FPDEPTH]
                ba,pt   %xcc, 2b
                 stb    %g0, [%l4 + %l3]
                nop
index b0ac1030642595911c584a66b908e438a3078c00..1d7e274f3f2b42bfac80354f1745c7ad48cd9e27 100644 (file)
@@ -212,19 +212,24 @@ linux_sparc_syscall:
 3:     stx     %o0, [%sp + PTREGS_OFF + PT_V9_I0]
 ret_sys_call:
        ldx     [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
+       ldx     [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
        sra     %o0, 0, %o0
        mov     %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
        sllx    %g2, 32, %g2
 
+       /* Check if force_successful_syscall_return()
+        * was invoked.
+        */
+       ldub    [%g6 + TI_SYS_NOERROR], %l2
+       brnz,a,pn %l2, 80f
+        stb    %g0, [%g6 + TI_SYS_NOERROR]
+
        cmp     %o0, -ERESTART_RESTARTBLOCK
        bgeu,pn %xcc, 1f
-        andcc  %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
-       ldx     [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
-
-2:
+        andcc  %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
+80:
        /* System call success, clear Carry condition code. */
        andn    %g3, %g2, %g3
-3:
        stx     %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]  
        bne,pn  %icc, linux_syscall_trace2
         add    %l1, 0x4, %l2                   ! npc = npc+4
@@ -233,20 +238,20 @@ ret_sys_call:
         stx    %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
 
 1:
-       /* Check if force_successful_syscall_return()
-        * was invoked.
-        */
-       ldub    [%g6 + TI_SYS_NOERROR], %l2
-       brnz,pn %l2, 2b
-        ldx    [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
        /* System call failure, set Carry condition code.
         * Also, get abs(errno) to return to the process.
         */
+       andcc   %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6  
        sub     %g0, %o0, %o0
+       or      %g3, %g2, %g3
        stx     %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-       ba,pt   %xcc, 3b
-        or     %g3, %g2, %g3
+       stx     %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
+       bne,pn  %icc, linux_syscall_trace2
+        add    %l1, 0x4, %l2                   ! npc = npc+4
+       stx     %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
 
+       b,pt    %xcc, rtrap
+        stx    %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
 linux_syscall_trace2:
        call    syscall_trace_leave
         add    %sp, PTREGS_OFF, %o0
index 82af591fe43f8f0625babb98cea6b19c24ed53ef..fa1f1d375ffc263571ab3b75e4dd0477284d583b 100644 (file)
@@ -2547,6 +2547,8 @@ void __init trap_init(void)
                     TI_PRE_COUNT != offsetof(struct thread_info,
                                              preempt_count) ||
                     TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
+                    TI_SYS_NOERROR != offsetof(struct thread_info,
+                                               syscall_noerror) ||
                     TI_RESTART_BLOCK != offsetof(struct thread_info,
                                                  restart_block) ||
                     TI_KUNA_REGS != offsetof(struct thread_info,