diff options
| -rw-r--r-- | arch/sparc64/kernel/entry.S | 17 | ||||
| -rw-r--r-- | arch/sparc64/kernel/process.c | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/traps.c | 2 | ||||
| -rw-r--r-- | include/asm-sparc64/ptrace.h | 5 | ||||
| -rw-r--r-- | include/asm-sparc64/system.h | 11 | ||||
| -rw-r--r-- | include/asm-sparc64/thread_info.h | 12 |
7 files changed, 27 insertions, 24 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index d781f10adc52..88332f00094a 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
| @@ -1600,11 +1600,11 @@ sys_clone: flushw | |||
| 1600 | ba,pt %xcc, sparc_do_fork | 1600 | ba,pt %xcc, sparc_do_fork |
| 1601 | add %sp, PTREGS_OFF, %o2 | 1601 | add %sp, PTREGS_OFF, %o2 |
| 1602 | ret_from_syscall: | 1602 | ret_from_syscall: |
| 1603 | /* Clear SPARC_FLAG_NEWCHILD, switch_to leaves thread.flags in | 1603 | /* Clear current_thread_info()->new_child, and |
| 1604 | * %o7 for us. Check performance counter stuff too. | 1604 | * check performance counter stuff too. |
| 1605 | */ | 1605 | */ |
| 1606 | andn %o7, _TIF_NEWCHILD, %l0 | 1606 | stb %g0, [%g6 + TI_NEW_CHILD] |
| 1607 | stx %l0, [%g6 + TI_FLAGS] | 1607 | ldx [%g6 + TI_FLAGS], %l0 |
| 1608 | call schedule_tail | 1608 | call schedule_tail |
| 1609 | mov %g7, %o0 | 1609 | mov %g7, %o0 |
| 1610 | andcc %l0, _TIF_PERFCTR, %g0 | 1610 | andcc %l0, _TIF_PERFCTR, %g0 |
| @@ -1720,12 +1720,11 @@ ret_sys_call: | |||
| 1720 | /* Check if force_successful_syscall_return() | 1720 | /* Check if force_successful_syscall_return() |
| 1721 | * was invoked. | 1721 | * was invoked. |
| 1722 | */ | 1722 | */ |
| 1723 | ldx [%curptr + TI_FLAGS], %l0 | 1723 | ldub [%curptr + TI_SYS_NOERROR], %l0 |
| 1724 | andcc %l0, _TIF_SYSCALL_SUCCESS, %g0 | 1724 | brz,pt %l0, 1f |
| 1725 | be,pt %icc, 1f | 1725 | nop |
| 1726 | andn %l0, _TIF_SYSCALL_SUCCESS, %l0 | ||
| 1727 | ba,pt %xcc, 80f | 1726 | ba,pt %xcc, 80f |
| 1728 | stx %l0, [%curptr + TI_FLAGS] | 1727 | stb %g0, [%curptr + TI_SYS_NOERROR] |
| 1729 | 1728 | ||
| 1730 | 1: | 1729 | 1: |
| 1731 | cmp %o0, -ERESTART_RESTARTBLOCK | 1730 | cmp %o0, -ERESTART_RESTARTBLOCK |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index a0cd2b2494d6..cffb1c8ab4fc 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
| @@ -621,8 +621,8 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
| 621 | memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); | 621 | memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); |
| 622 | 622 | ||
| 623 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | | 623 | t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) | |
| 624 | _TIF_NEWCHILD | | ||
| 625 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); | 624 | (((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT); |
| 625 | t->new_child = 1; | ||
| 626 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; | 626 | t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS; |
| 627 | t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf)); | 627 | t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf)); |
| 628 | t->fpsaved[0] = 0; | 628 | t->fpsaved[0] = 0; |
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 7e8e2919e186..b9b42491e118 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -137,7 +137,7 @@ void __init smp_callin(void) | |||
| 137 | /* Clear this or we will die instantly when we | 137 | /* Clear this or we will die instantly when we |
| 138 | * schedule back to this idler... | 138 | * schedule back to this idler... |
| 139 | */ | 139 | */ |
| 140 | clear_thread_flag(TIF_NEWCHILD); | 140 | current_thread_info()->new_child = 0; |
| 141 | 141 | ||
| 142 | /* Attach to the address space of init_task. */ | 142 | /* Attach to the address space of init_task. */ |
| 143 | atomic_inc(&init_mm.mm_count); | 143 | atomic_inc(&init_mm.mm_count); |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index a9f4596d7c2b..100b0107c4be 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
| @@ -2125,6 +2125,8 @@ void __init trap_init(void) | |||
| 2125 | TI_PCR != offsetof(struct thread_info, pcr_reg) || | 2125 | TI_PCR != offsetof(struct thread_info, pcr_reg) || |
| 2126 | TI_CEE_STUFF != offsetof(struct thread_info, cee_stuff) || | 2126 | TI_CEE_STUFF != offsetof(struct thread_info, cee_stuff) || |
| 2127 | TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || | 2127 | TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || |
| 2128 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || | ||
| 2129 | TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) || | ||
| 2128 | TI_FPREGS != offsetof(struct thread_info, fpregs) || | 2130 | TI_FPREGS != offsetof(struct thread_info, fpregs) || |
| 2129 | (TI_FPREGS & (64 - 1))) | 2131 | (TI_FPREGS & (64 - 1))) |
| 2130 | thread_info_offsets_are_bolixed_dave(); | 2132 | thread_info_offsets_are_bolixed_dave(); |
diff --git a/include/asm-sparc64/ptrace.h b/include/asm-sparc64/ptrace.h index 2d2b5a113d24..6194f771e9fc 100644 --- a/include/asm-sparc64/ptrace.h +++ b/include/asm-sparc64/ptrace.h | |||
| @@ -94,8 +94,9 @@ struct sparc_trapf { | |||
| 94 | #define STACKFRAME32_SZ sizeof(struct sparc_stackf32) | 94 | #define STACKFRAME32_SZ sizeof(struct sparc_stackf32) |
| 95 | 95 | ||
| 96 | #ifdef __KERNEL__ | 96 | #ifdef __KERNEL__ |
| 97 | #define force_successful_syscall_return() \ | 97 | #define force_successful_syscall_return() \ |
| 98 | set_thread_flag(TIF_SYSCALL_SUCCESS) | 98 | do { current_thread_info()->syscall_noerror = 1; \ |
| 99 | } while (0) | ||
| 99 | #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV)) | 100 | #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV)) |
| 100 | #define instruction_pointer(regs) ((regs)->tpc) | 101 | #define instruction_pointer(regs) ((regs)->tpc) |
| 101 | #ifdef CONFIG_SMP | 102 | #ifdef CONFIG_SMP |
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index f9be2c5b4dc9..ee4bdfc6b88f 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h | |||
| @@ -190,24 +190,23 @@ do { if (test_thread_flag(TIF_PERFCTR)) { \ | |||
| 190 | "wrpr %%g1, %%cwp\n\t" \ | 190 | "wrpr %%g1, %%cwp\n\t" \ |
| 191 | "ldx [%%g6 + %3], %%o6\n\t" \ | 191 | "ldx [%%g6 + %3], %%o6\n\t" \ |
| 192 | "ldub [%%g6 + %2], %%o5\n\t" \ | 192 | "ldub [%%g6 + %2], %%o5\n\t" \ |
| 193 | "ldx [%%g6 + %4], %%o7\n\t" \ | 193 | "ldub [%%g6 + %4], %%o7\n\t" \ |
| 194 | "mov %%g6, %%l2\n\t" \ | 194 | "mov %%g6, %%l2\n\t" \ |
| 195 | "wrpr %%o5, 0x0, %%wstate\n\t" \ | 195 | "wrpr %%o5, 0x0, %%wstate\n\t" \ |
| 196 | "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ | 196 | "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ |
| 197 | "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ | 197 | "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ |
| 198 | "wrpr %%g0, 0x94, %%pstate\n\t" \ | 198 | "wrpr %%g0, 0x94, %%pstate\n\t" \ |
| 199 | "mov %%l2, %%g6\n\t" \ | 199 | "mov %%l2, %%g6\n\t" \ |
| 200 | "ldx [%%g6 + %7], %%g4\n\t" \ | 200 | "ldx [%%g6 + %6], %%g4\n\t" \ |
| 201 | "wrpr %%g0, 0x96, %%pstate\n\t" \ | 201 | "wrpr %%g0, 0x96, %%pstate\n\t" \ |
| 202 | "andcc %%o7, %6, %%g0\n\t" \ | 202 | "brz,pt %%o7, 1f\n\t" \ |
| 203 | "beq,pt %%icc, 1f\n\t" \ | ||
| 204 | " mov %%g7, %0\n\t" \ | 203 | " mov %%g7, %0\n\t" \ |
| 205 | "b,a ret_from_syscall\n\t" \ | 204 | "b,a ret_from_syscall\n\t" \ |
| 206 | "1:\n\t" \ | 205 | "1:\n\t" \ |
| 207 | : "=&r" (last) \ | 206 | : "=&r" (last) \ |
| 208 | : "0" (next->thread_info), \ | 207 | : "0" (next->thread_info), \ |
| 209 | "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_FLAGS), "i" (TI_CWP), \ | 208 | "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_NEW_CHILD), \ |
| 210 | "i" (_TIF_NEWCHILD), "i" (TI_TASK) \ | 209 | "i" (TI_CWP), "i" (TI_TASK) \ |
| 211 | : "cc", \ | 210 | : "cc", \ |
| 212 | "g1", "g2", "g3", "g7", \ | 211 | "g1", "g2", "g3", "g7", \ |
| 213 | "l2", "l3", "l4", "l5", "l6", "l7", \ | 212 | "l2", "l3", "l4", "l5", "l6", "l7", \ |
diff --git a/include/asm-sparc64/thread_info.h b/include/asm-sparc64/thread_info.h index a1d25c06f92a..352d9943661a 100644 --- a/include/asm-sparc64/thread_info.h +++ b/include/asm-sparc64/thread_info.h | |||
| @@ -47,7 +47,9 @@ struct thread_info { | |||
| 47 | struct pt_regs *kregs; | 47 | struct pt_regs *kregs; |
| 48 | struct exec_domain *exec_domain; | 48 | struct exec_domain *exec_domain; |
| 49 | int preempt_count; /* 0 => preemptable, <0 => BUG */ | 49 | int preempt_count; /* 0 => preemptable, <0 => BUG */ |
| 50 | int __pad; | 50 | __u8 new_child; |
| 51 | __u8 syscall_noerror; | ||
| 52 | __u16 __pad; | ||
| 51 | 53 | ||
| 52 | unsigned long *utraps; | 54 | unsigned long *utraps; |
| 53 | 55 | ||
| @@ -87,6 +89,8 @@ struct thread_info { | |||
| 87 | #define TI_KREGS 0x00000028 | 89 | #define TI_KREGS 0x00000028 |
| 88 | #define TI_EXEC_DOMAIN 0x00000030 | 90 | #define TI_EXEC_DOMAIN 0x00000030 |
| 89 | #define TI_PRE_COUNT 0x00000038 | 91 | #define TI_PRE_COUNT 0x00000038 |
| 92 | #define TI_NEW_CHILD 0x0000003c | ||
| 93 | #define TI_SYS_NOERROR 0x0000003d | ||
| 90 | #define TI_UTRAPS 0x00000040 | 94 | #define TI_UTRAPS 0x00000040 |
| 91 | #define TI_REG_WINDOW 0x00000048 | 95 | #define TI_REG_WINDOW 0x00000048 |
| 92 | #define TI_RWIN_SPTRS 0x000003c8 | 96 | #define TI_RWIN_SPTRS 0x000003c8 |
| @@ -219,10 +223,10 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
| 219 | #define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */ | 223 | #define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */ |
| 220 | #define TIF_NEWSIGNALS 6 /* wants new-style signals */ | 224 | #define TIF_NEWSIGNALS 6 /* wants new-style signals */ |
| 221 | #define TIF_32BIT 7 /* 32-bit binary */ | 225 | #define TIF_32BIT 7 /* 32-bit binary */ |
| 222 | #define TIF_NEWCHILD 8 /* just-spawned child process */ | 226 | /* flag bit 8 is available */ |
| 223 | #define TIF_SECCOMP 9 /* secure computing */ | 227 | #define TIF_SECCOMP 9 /* secure computing */ |
| 224 | #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */ | 228 | #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */ |
| 225 | #define TIF_SYSCALL_SUCCESS 11 | 229 | /* flag bit 11 is available */ |
| 226 | /* NOTE: Thread flags >= 12 should be ones we have no interest | 230 | /* NOTE: Thread flags >= 12 should be ones we have no interest |
| 227 | * in using in assembly, else we can't use the mask as | 231 | * in using in assembly, else we can't use the mask as |
| 228 | * an immediate value in instructions such as andcc. | 232 | * an immediate value in instructions such as andcc. |
| @@ -239,10 +243,8 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
| 239 | #define _TIF_UNALIGNED (1<<TIF_UNALIGNED) | 243 | #define _TIF_UNALIGNED (1<<TIF_UNALIGNED) |
| 240 | #define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS) | 244 | #define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS) |
| 241 | #define _TIF_32BIT (1<<TIF_32BIT) | 245 | #define _TIF_32BIT (1<<TIF_32BIT) |
| 242 | #define _TIF_NEWCHILD (1<<TIF_NEWCHILD) | ||
| 243 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 246 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
| 244 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 247 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
| 245 | #define _TIF_SYSCALL_SUCCESS (1<<TIF_SYSCALL_SUCCESS) | ||
| 246 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) | 248 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) |
| 247 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 249 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
| 248 | 250 | ||
