diff options
Diffstat (limited to 'arch/x86/ia32')
-rw-r--r-- | arch/x86/ia32/ia32_signal.c | 22 | ||||
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 12 | ||||
-rw-r--r-- | arch/x86/ia32/sys_ia32.c | 2 |
3 files changed, 16 insertions, 20 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 588a7aa937e..65577698cab 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -127,15 +127,17 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
127 | 127 | ||
128 | asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask) | 128 | asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask) |
129 | { | 129 | { |
130 | mask &= _BLOCKABLE; | 130 | sigset_t blocked; |
131 | spin_lock_irq(¤t->sighand->siglock); | 131 | |
132 | current->saved_sigmask = current->blocked; | 132 | current->saved_sigmask = current->blocked; |
133 | siginitset(¤t->blocked, mask); | 133 | |
134 | recalc_sigpending(); | 134 | mask &= _BLOCKABLE; |
135 | spin_unlock_irq(¤t->sighand->siglock); | 135 | siginitset(&blocked, mask); |
136 | set_current_blocked(&blocked); | ||
136 | 137 | ||
137 | current->state = TASK_INTERRUPTIBLE; | 138 | current->state = TASK_INTERRUPTIBLE; |
138 | schedule(); | 139 | schedule(); |
140 | |||
139 | set_restore_sigmask(); | 141 | set_restore_sigmask(); |
140 | return -ERESTARTNOHAND; | 142 | return -ERESTARTNOHAND; |
141 | } | 143 | } |
@@ -279,10 +281,7 @@ asmlinkage long sys32_sigreturn(struct pt_regs *regs) | |||
279 | goto badframe; | 281 | goto badframe; |
280 | 282 | ||
281 | sigdelsetmask(&set, ~_BLOCKABLE); | 283 | sigdelsetmask(&set, ~_BLOCKABLE); |
282 | spin_lock_irq(¤t->sighand->siglock); | 284 | set_current_blocked(&set); |
283 | current->blocked = set; | ||
284 | recalc_sigpending(); | ||
285 | spin_unlock_irq(¤t->sighand->siglock); | ||
286 | 285 | ||
287 | if (ia32_restore_sigcontext(regs, &frame->sc, &ax)) | 286 | if (ia32_restore_sigcontext(regs, &frame->sc, &ax)) |
288 | goto badframe; | 287 | goto badframe; |
@@ -308,10 +307,7 @@ asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) | |||
308 | goto badframe; | 307 | goto badframe; |
309 | 308 | ||
310 | sigdelsetmask(&set, ~_BLOCKABLE); | 309 | sigdelsetmask(&set, ~_BLOCKABLE); |
311 | spin_lock_irq(¤t->sighand->siglock); | 310 | set_current_blocked(&set); |
312 | current->blocked = set; | ||
313 | recalc_sigpending(); | ||
314 | spin_unlock_irq(¤t->sighand->siglock); | ||
315 | 311 | ||
316 | if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 312 | if (ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
317 | goto badframe; | 313 | goto badframe; |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index c1870dddd32..54edb207ff3 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -143,7 +143,7 @@ ENTRY(ia32_sysenter_target) | |||
143 | CFI_REL_OFFSET rip,0 | 143 | CFI_REL_OFFSET rip,0 |
144 | pushq_cfi %rax | 144 | pushq_cfi %rax |
145 | cld | 145 | cld |
146 | SAVE_ARGS 0,0,1 | 146 | SAVE_ARGS 0,1,0 |
147 | /* no need to do an access_ok check here because rbp has been | 147 | /* no need to do an access_ok check here because rbp has been |
148 | 32bit zero extended */ | 148 | 32bit zero extended */ |
149 | 1: movl (%rbp),%ebp | 149 | 1: movl (%rbp),%ebp |
@@ -173,7 +173,7 @@ sysexit_from_sys_call: | |||
173 | andl $~0x200,EFLAGS-R11(%rsp) | 173 | andl $~0x200,EFLAGS-R11(%rsp) |
174 | movl RIP-R11(%rsp),%edx /* User %eip */ | 174 | movl RIP-R11(%rsp),%edx /* User %eip */ |
175 | CFI_REGISTER rip,rdx | 175 | CFI_REGISTER rip,rdx |
176 | RESTORE_ARGS 1,24,1,1,1,1 | 176 | RESTORE_ARGS 0,24,0,0,0,0 |
177 | xorq %r8,%r8 | 177 | xorq %r8,%r8 |
178 | xorq %r9,%r9 | 178 | xorq %r9,%r9 |
179 | xorq %r10,%r10 | 179 | xorq %r10,%r10 |
@@ -289,7 +289,7 @@ ENTRY(ia32_cstar_target) | |||
289 | * disabled irqs and here we enable it straight after entry: | 289 | * disabled irqs and here we enable it straight after entry: |
290 | */ | 290 | */ |
291 | ENABLE_INTERRUPTS(CLBR_NONE) | 291 | ENABLE_INTERRUPTS(CLBR_NONE) |
292 | SAVE_ARGS 8,1,1 | 292 | SAVE_ARGS 8,0,0 |
293 | movl %eax,%eax /* zero extension */ | 293 | movl %eax,%eax /* zero extension */ |
294 | movq %rax,ORIG_RAX-ARGOFFSET(%rsp) | 294 | movq %rax,ORIG_RAX-ARGOFFSET(%rsp) |
295 | movq %rcx,RIP-ARGOFFSET(%rsp) | 295 | movq %rcx,RIP-ARGOFFSET(%rsp) |
@@ -328,7 +328,7 @@ cstar_dispatch: | |||
328 | jnz sysretl_audit | 328 | jnz sysretl_audit |
329 | sysretl_from_sys_call: | 329 | sysretl_from_sys_call: |
330 | andl $~TS_COMPAT,TI_status(%r10) | 330 | andl $~TS_COMPAT,TI_status(%r10) |
331 | RESTORE_ARGS 1,-ARG_SKIP,1,1,1 | 331 | RESTORE_ARGS 0,-ARG_SKIP,0,0,0 |
332 | movl RIP-ARGOFFSET(%rsp),%ecx | 332 | movl RIP-ARGOFFSET(%rsp),%ecx |
333 | CFI_REGISTER rip,rcx | 333 | CFI_REGISTER rip,rcx |
334 | movl EFLAGS-ARGOFFSET(%rsp),%r11d | 334 | movl EFLAGS-ARGOFFSET(%rsp),%r11d |
@@ -419,7 +419,7 @@ ENTRY(ia32_syscall) | |||
419 | cld | 419 | cld |
420 | /* note the registers are not zero extended to the sf. | 420 | /* note the registers are not zero extended to the sf. |
421 | this could be a problem. */ | 421 | this could be a problem. */ |
422 | SAVE_ARGS 0,0,1 | 422 | SAVE_ARGS 0,1,0 |
423 | GET_THREAD_INFO(%r10) | 423 | GET_THREAD_INFO(%r10) |
424 | orl $TS_COMPAT,TI_status(%r10) | 424 | orl $TS_COMPAT,TI_status(%r10) |
425 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) | 425 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) |
@@ -672,7 +672,7 @@ ia32_sys_call_table: | |||
672 | .quad sys32_vm86_warning /* vm86 */ | 672 | .quad sys32_vm86_warning /* vm86 */ |
673 | .quad quiet_ni_syscall /* query_module */ | 673 | .quad quiet_ni_syscall /* query_module */ |
674 | .quad sys_poll | 674 | .quad sys_poll |
675 | .quad compat_sys_nfsservctl | 675 | .quad quiet_ni_syscall /* old nfsservctl */ |
676 | .quad sys_setresgid16 /* 170 */ | 676 | .quad sys_setresgid16 /* 170 */ |
677 | .quad sys_getresgid16 | 677 | .quad sys_getresgid16 |
678 | .quad sys_prctl | 678 | .quad sys_prctl |
diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index 5852519b2d0..f6f5c53dc90 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <asm/mman.h> | 43 | #include <asm/mman.h> |
44 | #include <asm/types.h> | 44 | #include <asm/types.h> |
45 | #include <asm/uaccess.h> | 45 | #include <asm/uaccess.h> |
46 | #include <asm/atomic.h> | 46 | #include <linux/atomic.h> |
47 | #include <asm/vgtod.h> | 47 | #include <asm/vgtod.h> |
48 | #include <asm/sys_ia32.h> | 48 | #include <asm/sys_ia32.h> |
49 | 49 | ||