};
 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))
 
 #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>
 
        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;
 #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
 #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
 #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])
 
                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
                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
 
 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
         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
 
                     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,