signal.c 23.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/*
 *  Copyright (C) 1991, 1992  Linus Torvalds
3
 *  Copyright (C) 2000, 2001, 2002 Andi Kleen SuSE Labs
L
Linus Torvalds 已提交
4 5 6
 *
 *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
 *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
7
 *  2000-2002   x86-64 support by Andi Kleen
L
Linus Torvalds 已提交
8 9
 */

10 11 12
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/smp.h>
L
Linus Torvalds 已提交
13 14 15 16
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/errno.h>
#include <linux/wait.h>
17
#include <linux/ptrace.h>
R
Roland McGrath 已提交
18
#include <linux/tracehook.h>
19 20 21 22
#include <linux/unistd.h>
#include <linux/stddef.h>
#include <linux/personality.h>
#include <linux/uaccess.h>
23

L
Linus Torvalds 已提交
24 25 26
#include <asm/processor.h>
#include <asm/ucontext.h>
#include <asm/i387.h>
R
Roland McGrath 已提交
27
#include <asm/vdso.h>
28 29 30 31 32 33 34

#ifdef CONFIG_X86_64
#include <asm/proto.h>
#include <asm/ia32_unistd.h>
#include <asm/mce.h>
#endif /* CONFIG_X86_64 */

35
#include <asm/syscall.h>
36
#include <asm/syscalls.h>
37

38
#include <asm/sigframe.h>
L
Linus Torvalds 已提交
39 40 41

#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))

42 43 44 45 46 47 48 49 50 51 52
#define __FIX_EFLAGS	(X86_EFLAGS_AC | X86_EFLAGS_OF | \
			 X86_EFLAGS_DF | X86_EFLAGS_TF | X86_EFLAGS_SF | \
			 X86_EFLAGS_ZF | X86_EFLAGS_AF | X86_EFLAGS_PF | \
			 X86_EFLAGS_CF)

#ifdef CONFIG_X86_32
# define FIX_EFLAGS	(__FIX_EFLAGS | X86_EFLAGS_RF)
#else
# define FIX_EFLAGS	__FIX_EFLAGS
#endif

53
#define COPY(x)			{		\
54
	get_user_ex(regs->x, &sc->x);		\
55 56 57 58
}

#define COPY_SEG(seg)		{			\
		unsigned short tmp;			\
59
		get_user_ex(tmp, &sc->seg);		\
60 61 62 63 64
		regs->seg = tmp;			\
}

#define COPY_SEG_CPL3(seg)	{			\
		unsigned short tmp;			\
65
		get_user_ex(tmp, &sc->seg);		\
66 67 68 69 70
		regs->seg = tmp | 3;			\
}

#define GET_SEG(seg)		{			\
		unsigned short tmp;			\
71
		get_user_ex(tmp, &sc->seg);		\
72 73 74 75 76 77 78 79 80 81 82 83 84 85
		loadsegment(seg, tmp);			\
}

static int
restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
		   unsigned long *pax)
{
	void __user *buf;
	unsigned int tmpflags;
	unsigned int err = 0;

	/* Always make any pending restarted system calls return -EINTR */
	current_thread_info()->restart_block.fn = do_no_restart_syscall;

86 87
	get_user_try {

88
#ifdef CONFIG_X86_32
89 90 91 92
		GET_SEG(gs);
		COPY_SEG(fs);
		COPY_SEG(es);
		COPY_SEG(ds);
93 94
#endif /* CONFIG_X86_32 */

95 96
		COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
		COPY(dx); COPY(cx); COPY(ip);
97 98

#ifdef CONFIG_X86_64
99 100 101 102 103 104 105 106
		COPY(r8);
		COPY(r9);
		COPY(r10);
		COPY(r11);
		COPY(r12);
		COPY(r13);
		COPY(r14);
		COPY(r15);
107 108 109
#endif /* CONFIG_X86_64 */

#ifdef CONFIG_X86_32
110 111
		COPY_SEG_CPL3(cs);
		COPY_SEG_CPL3(ss);
112
#else /* !CONFIG_X86_32 */
113 114 115 116
		/* Kernel saves and restores only the CS segment register on signals,
		 * which is the bare minimum needed to allow mixed 32/64-bit code.
		 * App's signal handler can save/restore other segments if needed. */
		COPY_SEG_CPL3(cs);
117 118
#endif /* CONFIG_X86_32 */

119 120 121 122 123 124
		get_user_ex(tmpflags, &sc->flags);
		regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
		regs->orig_ax = -1;		/* disable syscall checks */

		get_user_ex(buf, &sc->fpstate);
		err |= restore_i387_xstate(buf);
125

126 127
		get_user_ex(*pax, &sc->ax);
	} get_user_catch(err);
128 129 130 131 132 133 134 135 136 137

	return err;
}

static int
setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
		 struct pt_regs *regs, unsigned long mask)
{
	int err = 0;

138
	put_user_try {
139

140 141 142 143 144 145 146 147 148 149
#ifdef CONFIG_X86_32
		{
			unsigned int tmp;

			savesegment(gs, tmp);
			put_user_ex(tmp, (unsigned int __user *)&sc->gs);
		}
		put_user_ex(regs->fs, (unsigned int __user *)&sc->fs);
		put_user_ex(regs->es, (unsigned int __user *)&sc->es);
		put_user_ex(regs->ds, (unsigned int __user *)&sc->ds);
150 151
#endif /* CONFIG_X86_32 */

152 153 154 155 156 157 158 159
		put_user_ex(regs->di, &sc->di);
		put_user_ex(regs->si, &sc->si);
		put_user_ex(regs->bp, &sc->bp);
		put_user_ex(regs->sp, &sc->sp);
		put_user_ex(regs->bx, &sc->bx);
		put_user_ex(regs->dx, &sc->dx);
		put_user_ex(regs->cx, &sc->cx);
		put_user_ex(regs->ax, &sc->ax);
160
#ifdef CONFIG_X86_64
161 162 163 164 165 166 167 168
		put_user_ex(regs->r8, &sc->r8);
		put_user_ex(regs->r9, &sc->r9);
		put_user_ex(regs->r10, &sc->r10);
		put_user_ex(regs->r11, &sc->r11);
		put_user_ex(regs->r12, &sc->r12);
		put_user_ex(regs->r13, &sc->r13);
		put_user_ex(regs->r14, &sc->r14);
		put_user_ex(regs->r15, &sc->r15);
169 170
#endif /* CONFIG_X86_64 */

171 172 173
		put_user_ex(current->thread.trap_no, &sc->trapno);
		put_user_ex(current->thread.error_code, &sc->err);
		put_user_ex(regs->ip, &sc->ip);
174
#ifdef CONFIG_X86_32
175 176 177 178
		put_user_ex(regs->cs, (unsigned int __user *)&sc->cs);
		put_user_ex(regs->flags, &sc->flags);
		put_user_ex(regs->sp, &sc->sp_at_signal);
		put_user_ex(regs->ss, (unsigned int __user *)&sc->ss);
179
#else /* !CONFIG_X86_32 */
180 181 182 183
		put_user_ex(regs->flags, &sc->flags);
		put_user_ex(regs->cs, &sc->cs);
		put_user_ex(0, &sc->gs);
		put_user_ex(0, &sc->fs);
184 185
#endif /* CONFIG_X86_32 */

186
		put_user_ex(fpstate, &sc->fpstate);
187

188 189 190 191
		/* non-iBCS2 extensions.. */
		put_user_ex(mask, &sc->oldmask);
		put_user_ex(current->thread.cr2, &sc->cr2);
	} put_user_catch(err);
192 193 194 195

	return err;
}

L
Linus Torvalds 已提交
196
/*
197
 * Set up a signal frame.
L
Linus Torvalds 已提交
198
 */
199
#ifdef CONFIG_X86_32
200 201 202 203 204 205 206 207 208
static const struct {
	u16 poplmovl;
	u32 val;
	u16 int80;
} __attribute__((packed)) retcode = {
	0xb858,		/* popl %eax; movl $..., %eax */
	__NR_sigreturn,
	0x80cd,		/* int $0x80 */
};
209

210 211 212 213 214 215 216 217 218 219 220
static const struct {
	u8  movl;
	u32 val;
	u16 int80;
	u8  pad;
} __attribute__((packed)) rt_retcode = {
	0xb8,		/* movl $..., %eax */
	__NR_rt_sigreturn,
	0x80cd,		/* int $0x80 */
	0
};
L
Linus Torvalds 已提交
221 222 223 224 225

/*
 * Determine which stack to use..
 */
static inline void __user *
226
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
227
	     void **fpstate)
L
Linus Torvalds 已提交
228
{
229
	unsigned long sp;
L
Linus Torvalds 已提交
230 231

	/* Default to using normal stack */
232
	sp = regs->sp;
L
Linus Torvalds 已提交
233

234 235 236 237
	/*
	 * If we are on the alternate signal stack and would overflow it, don't.
	 * Return an always-bogus address instead so we will die with SIGSEGV.
	 */
238
	if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size)))
239 240
		return (void __user *) -1L;

L
Linus Torvalds 已提交
241 242
	/* This is the X/Open sanctioned signal stack switching.  */
	if (ka->sa.sa_flags & SA_ONSTACK) {
243 244
		if (sas_ss_flags(sp) == 0)
			sp = current->sas_ss_sp + current->sas_ss_size;
245 246 247 248 249 250
	} else {
		/* This is the legacy signal stack switching. */
		if ((regs->ss & 0xffff) != __USER_DS &&
			!(ka->sa.sa_flags & SA_RESTORER) &&
				ka->sa.sa_restorer)
			sp = (unsigned long) ka->sa.sa_restorer;
L
Linus Torvalds 已提交
251 252
	}

253 254 255
	if (used_math()) {
		sp = sp - sig_xstate_size;
		*fpstate = (struct _fpstate *) sp;
256 257
		if (save_i387_xstate(*fpstate) < 0)
			return (void __user *)-1L;
258 259
	}

260
	sp -= frame_size;
261 262 263 264
	/*
	 * Align the stack pointer according to the i386 ABI,
	 * i.e. so that on function entry ((sp + 4) & 15) == 0.
	 */
265
	sp = ((sp + 4) & -16ul) - 4;
266

267
	return (void __user *) sp;
L
Linus Torvalds 已提交
268 269
}

270
static int
271 272
__setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
	      struct pt_regs *regs)
L
Linus Torvalds 已提交
273 274
{
	struct sigframe __user *frame;
275
	void __user *restorer;
L
Linus Torvalds 已提交
276
	int err = 0;
277
	void __user *fpstate = NULL;
L
Linus Torvalds 已提交
278

279
	frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
L
Linus Torvalds 已提交
280 281

	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
282
		return -EFAULT;
L
Linus Torvalds 已提交
283

284
	if (__put_user(sig, &frame->sig))
285
		return -EFAULT;
L
Linus Torvalds 已提交
286

287
	if (setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]))
288
		return -EFAULT;
L
Linus Torvalds 已提交
289 290

	if (_NSIG_WORDS > 1) {
291 292
		if (__copy_to_user(&frame->extramask, &set->sig[1],
				   sizeof(frame->extramask)))
293
			return -EFAULT;
L
Linus Torvalds 已提交
294 295
	}

296
	if (current->mm->context.vdso)
R
Roland McGrath 已提交
297
		restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn);
298
	else
J
Jan Engelhardt 已提交
299
		restorer = &frame->retcode;
L
Linus Torvalds 已提交
300 301 302 303 304
	if (ka->sa.sa_flags & SA_RESTORER)
		restorer = ka->sa.sa_restorer;

	/* Set up to return from userspace.  */
	err |= __put_user(restorer, &frame->pretcode);
305

L
Linus Torvalds 已提交
306
	/*
307
	 * This is popl %eax ; movl $__NR_sigreturn, %eax ; int $0x80
L
Linus Torvalds 已提交
308 309 310 311 312
	 *
	 * WE DO NOT USE IT ANY MORE! It's only left here for historical
	 * reasons and because gdb uses it as a signature to notice
	 * signal handler stack frames.
	 */
313
	err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode);
L
Linus Torvalds 已提交
314 315

	if (err)
316
		return -EFAULT;
L
Linus Torvalds 已提交
317 318

	/* Set up registers for signal handler */
319 320 321
	regs->sp = (unsigned long)frame;
	regs->ip = (unsigned long)ka->sa.sa_handler;
	regs->ax = (unsigned long)sig;
322 323
	regs->dx = 0;
	regs->cx = 0;
L
Linus Torvalds 已提交
324

325 326 327 328
	regs->ds = __USER_DS;
	regs->es = __USER_DS;
	regs->ss = __USER_DS;
	regs->cs = __USER_CS;
L
Linus Torvalds 已提交
329

330
	return 0;
L
Linus Torvalds 已提交
331 332
}

333 334
static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
			    sigset_t *set, struct pt_regs *regs)
L
Linus Torvalds 已提交
335 336
{
	struct rt_sigframe __user *frame;
337
	void __user *restorer;
L
Linus Torvalds 已提交
338
	int err = 0;
339
	void __user *fpstate = NULL;
L
Linus Torvalds 已提交
340

341
	frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
L
Linus Torvalds 已提交
342 343

	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
344
		return -EFAULT;
L
Linus Torvalds 已提交
345

346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
	put_user_try {
		put_user_ex(sig, &frame->sig);
		put_user_ex(&frame->info, &frame->pinfo);
		put_user_ex(&frame->uc, &frame->puc);
		err |= copy_siginfo_to_user(&frame->info, info);

		/* Create the ucontext.  */
		if (cpu_has_xsave)
			put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags);
		else
			put_user_ex(0, &frame->uc.uc_flags);
		put_user_ex(0, &frame->uc.uc_link);
		put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
		put_user_ex(sas_ss_flags(regs->sp),
			    &frame->uc.uc_stack.ss_flags);
		put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
		err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
					regs, set->sig[0]);
		err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

		/* Set up to return from userspace.  */
		restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
		if (ka->sa.sa_flags & SA_RESTORER)
			restorer = ka->sa.sa_restorer;
		put_user_ex(restorer, &frame->pretcode);

		/*
		 * This is movl $__NR_rt_sigreturn, %ax ; int $0x80
		 *
		 * WE DO NOT USE IT ANY MORE! It's only left here for historical
		 * reasons and because gdb uses it as a signature to notice
		 * signal handler stack frames.
		 */
		put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode);
	} put_user_catch(err);
L
Linus Torvalds 已提交
381 382

	if (err)
383
		return -EFAULT;
L
Linus Torvalds 已提交
384 385

	/* Set up registers for signal handler */
386 387
	regs->sp = (unsigned long)frame;
	regs->ip = (unsigned long)ka->sa.sa_handler;
388
	regs->ax = (unsigned long)sig;
389 390
	regs->dx = (unsigned long)&frame->info;
	regs->cx = (unsigned long)&frame->uc;
L
Linus Torvalds 已提交
391

392 393 394 395
	regs->ds = __USER_DS;
	regs->es = __USER_DS;
	regs->ss = __USER_DS;
	regs->cs = __USER_CS;
L
Linus Torvalds 已提交
396

397
	return 0;
L
Linus Torvalds 已提交
398
}
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
#else /* !CONFIG_X86_32 */
/*
 * Determine which stack to use..
 */
static void __user *
get_stack(struct k_sigaction *ka, unsigned long sp, unsigned long size)
{
	/* Default to using normal stack - redzone*/
	sp -= 128;

	/* This is the X/Open sanctioned signal stack switching.  */
	if (ka->sa.sa_flags & SA_ONSTACK) {
		if (sas_ss_flags(sp) == 0)
			sp = current->sas_ss_sp + current->sas_ss_size;
	}

	return (void __user *)round_down(sp - size, 64);
}

static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
			    sigset_t *set, struct pt_regs *regs)
{
	struct rt_sigframe __user *frame;
	void __user *fp = NULL;
	int err = 0;
	struct task_struct *me = current;

	if (used_math()) {
		fp = get_stack(ka, regs->sp, sig_xstate_size);
		frame = (void __user *)round_down(
			(unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8;

		if (save_i387_xstate(fp) < 0)
			return -EFAULT;
	} else
		frame = get_stack(ka, regs->sp, sizeof(struct rt_sigframe)) - 8;

	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
		return -EFAULT;

	if (ka->sa.sa_flags & SA_SIGINFO) {
		if (copy_siginfo_to_user(&frame->info, info))
			return -EFAULT;
	}

444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
	put_user_try {
		/* Create the ucontext.  */
		if (cpu_has_xsave)
			put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags);
		else
			put_user_ex(0, &frame->uc.uc_flags);
		put_user_ex(0, &frame->uc.uc_link);
		put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
		put_user_ex(sas_ss_flags(regs->sp),
			    &frame->uc.uc_stack.ss_flags);
		put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size);
		err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]);
		err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

		/* Set up to return from userspace.  If provided, use a stub
		   already in userspace.  */
		/* x86-64 should always use SA_RESTORER. */
		if (ka->sa.sa_flags & SA_RESTORER) {
			put_user_ex(ka->sa.sa_restorer, &frame->pretcode);
		} else {
			/* could use a vstub here */
			err |= -EFAULT;
		}
	} put_user_catch(err);
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492

	if (err)
		return -EFAULT;

	/* Set up registers for signal handler */
	regs->di = sig;
	/* In case the signal handler was declared without prototypes */
	regs->ax = 0;

	/* This also works for non SA_SIGINFO handlers because they expect the
	   next argument after the signal number on the stack. */
	regs->si = (unsigned long)&frame->info;
	regs->dx = (unsigned long)&frame->uc;
	regs->ip = (unsigned long) ka->sa.sa_handler;

	regs->sp = (unsigned long)frame;

	/* Set up the CS register to run signal handlers in 64-bit mode,
	   even if the handler happens to be interrupting 32-bit code. */
	regs->cs = __USER_CS;

	return 0;
}
#endif /* CONFIG_X86_32 */

493
#ifdef CONFIG_X86_32
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
/*
 * Atomically swap in the new signal mask, and wait for a signal.
 */
asmlinkage int
sys_sigsuspend(int history0, int history1, old_sigset_t mask)
{
	mask &= _BLOCKABLE;
	spin_lock_irq(&current->sighand->siglock);
	current->saved_sigmask = current->blocked;
	siginitset(&current->blocked, mask);
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);

	current->state = TASK_INTERRUPTIBLE;
	schedule();
	set_restore_sigmask();

	return -ERESTARTNOHAND;
}

asmlinkage int
sys_sigaction(int sig, const struct old_sigaction __user *act,
	      struct old_sigaction __user *oact)
{
	struct k_sigaction new_ka, old_ka;
519
	int ret = 0;
520 521 522 523

	if (act) {
		old_sigset_t mask;

524
		if (!access_ok(VERIFY_READ, act, sizeof(*act)))
525 526
			return -EFAULT;

527 528 529 530 531 532 533 534 535
		get_user_try {
			get_user_ex(new_ka.sa.sa_handler, &act->sa_handler);
			get_user_ex(new_ka.sa.sa_flags, &act->sa_flags);
			get_user_ex(mask, &act->sa_mask);
			get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer);
		} get_user_catch(ret);

		if (ret)
			return -EFAULT;
536 537 538 539 540 541
		siginitset(&new_ka.sa.sa_mask, mask);
	}

	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);

	if (!ret && oact) {
542
		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
543 544
			return -EFAULT;

545 546 547 548 549 550 551 552 553
		put_user_try {
			put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler);
			put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags);
			put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
			put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer);
		} put_user_catch(ret);

		if (ret)
			return -EFAULT;
554 555 556 557
	}

	return ret;
}
558
#endif /* CONFIG_X86_32 */
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584

#ifdef CONFIG_X86_32
asmlinkage int sys_sigaltstack(unsigned long bx)
{
	/*
	 * This is needed to make gcc realize it doesn't own the
	 * "struct pt_regs"
	 */
	struct pt_regs *regs = (struct pt_regs *)&bx;
	const stack_t __user *uss = (const stack_t __user *)bx;
	stack_t __user *uoss = (stack_t __user *)regs->cx;

	return do_sigaltstack(uss, uoss, regs->sp);
}
#else /* !CONFIG_X86_32 */
asmlinkage long
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
		struct pt_regs *regs)
{
	return do_sigaltstack(uss, uoss, regs->sp);
}
#endif /* CONFIG_X86_32 */

/*
 * Do a signal return; undo the signal stack.
 */
585
#ifdef CONFIG_X86_32
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
asmlinkage unsigned long sys_sigreturn(unsigned long __unused)
{
	struct sigframe __user *frame;
	struct pt_regs *regs;
	unsigned long ax;
	sigset_t set;

	regs = (struct pt_regs *) &__unused;
	frame = (struct sigframe __user *)(regs->sp - 8);

	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
		goto badframe;
	if (__get_user(set.sig[0], &frame->sc.oldmask) || (_NSIG_WORDS > 1
		&& __copy_from_user(&set.sig[1], &frame->extramask,
				    sizeof(frame->extramask))))
		goto badframe;

	sigdelsetmask(&set, ~_BLOCKABLE);
	spin_lock_irq(&current->sighand->siglock);
	current->blocked = set;
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);

	if (restore_sigcontext(regs, &frame->sc, &ax))
		goto badframe;
	return ax;

badframe:
614
	signal_fault(regs, frame, "sigreturn");
615 616 617

	return 0;
}
618
#endif /* CONFIG_X86_32 */
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651

static long do_rt_sigreturn(struct pt_regs *regs)
{
	struct rt_sigframe __user *frame;
	unsigned long ax;
	sigset_t set;

	frame = (struct rt_sigframe __user *)(regs->sp - sizeof(long));
	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
		goto badframe;
	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
		goto badframe;

	sigdelsetmask(&set, ~_BLOCKABLE);
	spin_lock_irq(&current->sighand->siglock);
	current->blocked = set;
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);

	if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
		goto badframe;

	if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
		goto badframe;

	return ax;

badframe:
	signal_fault(regs, frame, "rt_sigreturn");
	return 0;
}

#ifdef CONFIG_X86_32
652 653 654 655 656 657
/*
 * Note: do not pass in pt_regs directly as with tail-call optimization
 * GCC will incorrectly stomp on the caller's frame and corrupt user-space
 * register state:
 */
asmlinkage int sys_rt_sigreturn(unsigned long __unused)
658
{
659 660 661
	struct pt_regs *regs = (struct pt_regs *)&__unused;

	return do_rt_sigreturn(regs);
662 663 664 665 666 667 668
}
#else /* !CONFIG_X86_32 */
asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
{
	return do_rt_sigreturn(regs);
}
#endif /* CONFIG_X86_32 */
L
Linus Torvalds 已提交
669 670

/*
671 672
 * OK, we're invoking a handler:
 */
673 674
static int signr_convert(int sig)
{
675
#ifdef CONFIG_X86_32
676 677 678 679
	struct thread_info *info = current_thread_info();

	if (info->exec_domain && info->exec_domain->signal_invmap && sig < 32)
		return info->exec_domain->signal_invmap[sig];
680
#endif /* CONFIG_X86_32 */
681 682 683
	return sig;
}

684 685
#ifdef CONFIG_X86_32

686
#define is_ia32	1
687 688
#define ia32_setup_frame	__setup_frame
#define ia32_setup_rt_frame	__setup_rt_frame
689

690 691 692 693 694 695 696 697
#else /* !CONFIG_X86_32 */

#ifdef CONFIG_IA32_EMULATION
#define is_ia32	test_thread_flag(TIF_IA32)
#else /* !CONFIG_IA32_EMULATION */
#define is_ia32	0
#endif /* CONFIG_IA32_EMULATION */

698 699 700 701 702
int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
		sigset_t *set, struct pt_regs *regs);
int ia32_setup_frame(int sig, struct k_sigaction *ka,
		sigset_t *set, struct pt_regs *regs);

703 704
#endif /* CONFIG_X86_32 */

705 706 707 708
static int
setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
	       sigset_t *set, struct pt_regs *regs)
{
709
	int usig = signr_convert(sig);
710 711 712
	int ret;

	/* Set up the stack frame */
713 714
	if (is_ia32) {
		if (ka->sa.sa_flags & SA_SIGINFO)
715
			ret = ia32_setup_rt_frame(usig, ka, info, set, regs);
716
		else
717
			ret = ia32_setup_frame(usig, ka, set, regs);
718 719
	} else
		ret = __setup_rt_frame(sig, ka, info, set, regs);
720

721 722 723 724 725
	if (ret) {
		force_sigsegv(sig, current);
		return -EFAULT;
	}

726 727 728
	return ret;
}

729
static int
L
Linus Torvalds 已提交
730
handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
731
	      sigset_t *oldset, struct pt_regs *regs)
L
Linus Torvalds 已提交
732
{
733 734
	int ret;

L
Linus Torvalds 已提交
735
	/* Are we from a system call? */
736
	if (syscall_get_nr(current, regs) >= 0) {
L
Linus Torvalds 已提交
737
		/* If so, check system call restarting.. */
738
		switch (syscall_get_error(current, regs)) {
739 740 741 742 743 744 745
		case -ERESTART_RESTARTBLOCK:
		case -ERESTARTNOHAND:
			regs->ax = -EINTR;
			break;

		case -ERESTARTSYS:
			if (!(ka->sa.sa_flags & SA_RESTART)) {
746
				regs->ax = -EINTR;
L
Linus Torvalds 已提交
747
				break;
748 749 750 751 752 753
			}
		/* fallthrough */
		case -ERESTARTNOINTR:
			regs->ax = regs->orig_ax;
			regs->ip -= 2;
			break;
L
Linus Torvalds 已提交
754 755 756 757
		}
	}

	/*
R
Roland McGrath 已提交
758 759
	 * If TF is set due to a debugger (TIF_FORCED_TF), clear the TF
	 * flag so that register information in the sigcontext is correct.
L
Linus Torvalds 已提交
760
	 */
761
	if (unlikely(regs->flags & X86_EFLAGS_TF) &&
R
Roland McGrath 已提交
762
	    likely(test_and_clear_thread_flag(TIF_FORCED_TF)))
763
		regs->flags &= ~X86_EFLAGS_TF;
L
Linus Torvalds 已提交
764

765
	ret = setup_rt_frame(sig, ka, info, oldset, regs);
L
Linus Torvalds 已提交
766

767 768
	if (ret)
		return ret;
769

770 771 772 773 774 775 776 777 778
#ifdef CONFIG_X86_64
	/*
	 * This has nothing to do with segment registers,
	 * despite the name.  This magic affects uaccess.h
	 * macros' behavior.  Reset it to the normal setting.
	 */
	set_fs(USER_DS);
#endif

779 780 781 782 783 784 785 786 787 788 789 790 791
	/*
	 * Clear the direction flag as per the ABI for function entry.
	 */
	regs->flags &= ~X86_EFLAGS_DF;

	/*
	 * Clear TF when entering the signal handler, but
	 * notify any tracer that was single-stepping it.
	 * The tracer may want to single-step inside the
	 * handler too.
	 */
	regs->flags &= ~X86_EFLAGS_TF;

792 793 794 795 796 797 798
	spin_lock_irq(&current->sighand->siglock);
	sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
	if (!(ka->sa.sa_flags & SA_NODEFER))
		sigaddset(&current->blocked, sig);
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);

R
Roland McGrath 已提交
799 800 801
	tracehook_signal_handler(sig, info, ka, regs,
				 test_thread_flag(TIF_SINGLESTEP));

802
	return 0;
L
Linus Torvalds 已提交
803 804
}

805
#ifdef CONFIG_X86_32
806
#define NR_restart_syscall	__NR_restart_syscall
807 808 809 810 811
#else /* !CONFIG_X86_32 */
#define NR_restart_syscall	\
	test_thread_flag(TIF_IA32) ? __NR_ia32_restart_syscall : __NR_restart_syscall
#endif /* CONFIG_X86_32 */

L
Linus Torvalds 已提交
812 813 814 815 816
/*
 * Note that 'init' is a special process: it doesn't get signals it doesn't
 * want to handle. Thus you cannot kill init even with a SIGKILL even by
 * mistake.
 */
817
static void do_signal(struct pt_regs *regs)
L
Linus Torvalds 已提交
818
{
819
	struct k_sigaction ka;
L
Linus Torvalds 已提交
820 821
	siginfo_t info;
	int signr;
822
	sigset_t *oldset;
L
Linus Torvalds 已提交
823 824

	/*
825 826 827 828 829
	 * We want the common case to go fast, which is why we may in certain
	 * cases get here from kernel mode. Just return without doing anything
	 * if so.
	 * X86_32: vm86 regs switched out by assembly code before reaching
	 * here, so testing against kernel CS suffices.
L
Linus Torvalds 已提交
830
	 */
831
	if (!user_mode(regs))
832
		return;
L
Linus Torvalds 已提交
833

R
Roland McGrath 已提交
834
	if (current_thread_info()->status & TS_RESTORE_SIGMASK)
835 836
		oldset = &current->saved_sigmask;
	else
L
Linus Torvalds 已提交
837 838 839 840
		oldset = &current->blocked;

	signr = get_signal_to_deliver(&info, &ka, regs, NULL);
	if (signr > 0) {
841 842
		/*
		 * Re-enable any watchpoints before delivering the
L
Linus Torvalds 已提交
843 844 845 846
		 * signal to user space. The processor register will
		 * have been cleared if the watchpoint triggered
		 * inside the kernel.
		 */
847
		if (current->thread.debugreg7)
848
			set_debugreg(current->thread.debugreg7, 7);
L
Linus Torvalds 已提交
849

850
		/* Whee! Actually deliver the signal.  */
851
		if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
852
			/*
R
Roland McGrath 已提交
853
			 * A signal was successfully delivered; the saved
854 855
			 * sigmask will have been stored in the signal frame,
			 * and will be restored by sigreturn, so we can simply
R
Roland McGrath 已提交
856
			 * clear the TS_RESTORE_SIGMASK flag.
857
			 */
R
Roland McGrath 已提交
858
			current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
859 860
		}
		return;
L
Linus Torvalds 已提交
861 862 863
	}

	/* Did we come from a system call? */
864
	if (syscall_get_nr(current, regs) >= 0) {
L
Linus Torvalds 已提交
865
		/* Restart the system call - no handlers present */
866
		switch (syscall_get_error(current, regs)) {
867 868 869
		case -ERESTARTNOHAND:
		case -ERESTARTSYS:
		case -ERESTARTNOINTR:
870 871
			regs->ax = regs->orig_ax;
			regs->ip -= 2;
872 873 874
			break;

		case -ERESTART_RESTARTBLOCK:
875
			regs->ax = NR_restart_syscall;
876
			regs->ip -= 2;
877
			break;
L
Linus Torvalds 已提交
878 879
		}
	}
880

881 882 883 884
	/*
	 * If there's no signal to deliver, we just put the saved sigmask
	 * back.
	 */
R
Roland McGrath 已提交
885 886
	if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
		current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
887 888
		sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
	}
L
Linus Torvalds 已提交
889 890 891 892
}

/*
 * notification of userspace execution resumption
893
 * - triggered by the TIF_WORK_MASK flags
L
Linus Torvalds 已提交
894
 */
895 896
void
do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
L
Linus Torvalds 已提交
897
{
898 899 900 901 902 903
#if defined(CONFIG_X86_64) && defined(CONFIG_X86_MCE)
	/* notify userspace of pending MCEs */
	if (thread_info_flags & _TIF_MCE_NOTIFY)
		mce_notify_user();
#endif /* CONFIG_X86_64 && CONFIG_X86_MCE */

L
Linus Torvalds 已提交
904
	/* deal with pending signal delivery */
R
Roland McGrath 已提交
905
	if (thread_info_flags & _TIF_SIGPENDING)
906
		do_signal(regs);
P
Peter Zijlstra 已提交
907

908 909 910 911 912
	if (thread_info_flags & _TIF_NOTIFY_RESUME) {
		clear_thread_flag(TIF_NOTIFY_RESUME);
		tracehook_notify_resume(regs);
	}

913
#ifdef CONFIG_X86_32
L
Linus Torvalds 已提交
914
	clear_thread_flag(TIF_IRET);
915
#endif /* CONFIG_X86_32 */
L
Linus Torvalds 已提交
916
}
917 918 919 920 921 922

void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
{
	struct task_struct *me = current;

	if (show_unhandled_signals && printk_ratelimit()) {
923
		printk("%s"
924
		       "%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx",
925
		       task_pid_nr(current) > 1 ? KERN_INFO : KERN_EMERG,
926 927 928 929 930 931 932 933
		       me->comm, me->pid, where, frame,
		       regs->ip, regs->sp, regs->orig_ax);
		print_vma_addr(" in ", regs->ip);
		printk(KERN_CONT "\n");
	}

	force_sig(SIGSEGV, me);
}