signal.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:15k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/x86_64/kernel/signal.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *  Copyright (C) 2000, 2001  SuSE Labs
  6.  *
  7.  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
  8.  *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
  9.  *  2000-2001   x86-64 support by Andi Kleen
  10.  * 
  11.  *  $Id: signal.c,v 1.35 2002/07/29 10:34:03 ak Exp $
  12.  */
  13. #include <linux/sched.h>
  14. #include <linux/mm.h>
  15. #include <linux/smp.h>
  16. #include <linux/smp_lock.h>
  17. #include <linux/kernel.h>
  18. #include <linux/signal.h>
  19. #include <linux/errno.h>
  20. #include <linux/wait.h>
  21. #include <linux/ptrace.h>
  22. #include <linux/unistd.h>
  23. #include <linux/stddef.h>
  24. #include <linux/tty.h>
  25. #include <linux/personality.h>
  26. #include <linux/compiler.h>
  27. #include <linux/binfmts.h>
  28. #include <asm/ucontext.h>
  29. #include <asm/uaccess.h>
  30. #include <asm/i387.h>
  31. #define DEBUG_SIG 0
  32. #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  33. asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset);
  34. void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  35.                sigset_t *set, struct pt_regs * regs); 
  36. void ia32_setup_frame(int sig, struct k_sigaction *ka,
  37.             sigset_t *set, struct pt_regs * regs); 
  38. void signal_fault(struct pt_regs *regs, void *frame, char *where);
  39. extern int exception_trace;
  40. int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  41. {
  42. if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  43. return -EFAULT;
  44. if (from->si_code < 0)
  45. return __copy_to_user(to, from, sizeof(siginfo_t));
  46. else {
  47. int err;
  48. /* If you change siginfo_t structure, please be sure
  49.    this code is fixed accordingly.
  50.    It should never copy any pad contained in the structure
  51.    to avoid security leaks, but must copy the generic
  52.    3 ints plus the relevant union member.  */
  53. err = __put_user(from->si_signo, &to->si_signo);
  54. err |= __put_user(from->si_errno, &to->si_errno);
  55. err |= __put_user((short)from->si_code, &to->si_code);
  56. /* First 32bits of unions are always present.  */
  57. err |= __put_user(from->si_pid, &to->si_pid);
  58. switch (from->si_code >> 16) {
  59. case __SI_FAULT >> 16:
  60. break;
  61. case __SI_CHLD >> 16:
  62. err |= __put_user(from->si_utime, &to->si_utime);
  63. err |= __put_user(from->si_stime, &to->si_stime);
  64. err |= __put_user(from->si_status, &to->si_status);
  65. default:
  66. err |= __put_user(from->si_uid, &to->si_uid);
  67. break;
  68. /* case __SI_RT: This is not generated by the kernel as of now.  */
  69. }
  70. return err;
  71. }
  72. }
  73. asmlinkage long
  74. sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs regs)
  75. {
  76. sigset_t saveset, newset;
  77. /* XXX: Don't preclude handling different sized sigset_t's.  */
  78. if (sigsetsize != sizeof(sigset_t))
  79. return -EINVAL;
  80. if (copy_from_user(&newset, unewset, sizeof(newset)))
  81. return -EFAULT;
  82. sigdelsetmask(&newset, ~_BLOCKABLE);
  83. spin_lock_irq(&current->sigmask_lock);
  84. saveset = current->blocked;
  85. current->blocked = newset;
  86. recalc_sigpending(current);
  87. spin_unlock_irq(&current->sigmask_lock);
  88. #if DEBUG_SIG
  89. printk("rt_sigsuspend savset(%lx) newset(%lx) regs(%p) rip(%lx)n",
  90. saveset, newset, &regs, regs.rip);
  91. #endif 
  92. regs.rax = -EINTR;
  93. while (1) {
  94. current->state = TASK_INTERRUPTIBLE;
  95. schedule();
  96. if (do_signal(&regs, &saveset))
  97. return -EINTR;
  98. }
  99. }
  100. asmlinkage long
  101. sys_sigaltstack(const stack_t *uss, stack_t *uoss, struct pt_regs regs)
  102. {
  103. return do_sigaltstack(uss, uoss, regs.rsp);
  104. }
  105. /*
  106.  * Do a signal return; undo the signal stack.
  107.  */
  108. struct rt_sigframe
  109. {
  110. char *pretcode;
  111. struct ucontext uc;
  112. struct siginfo info;
  113. };
  114. static int
  115. restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, unsigned long *prax)
  116. {
  117. unsigned int err = 0;
  118. #define COPY(x) err |= __get_user(regs->x, &sc->x)
  119. #define COPY_CANON(x)   
  120. COPY(x); 
  121. if ((regs->x >> 48)  != 0 && (regs->x >> 48) != 0xffff) 
  122. regs->x = 0; 
  123. unsigned int seg; 
  124. err |= __get_user(seg, &sc->gs); 
  125. load_gs_index(seg); 
  126. err |= __get_user(seg, &sc->fs);
  127. loadsegment(fs,seg);
  128. }
  129. COPY(rdi); COPY(rsi); COPY(rbp); COPY_CANON(rsp); COPY(rbx);
  130. COPY(rdx); COPY(rcx); COPY_CANON(rip);
  131. COPY(r8);
  132. COPY(r9);
  133. COPY(r10);
  134. COPY(r11);
  135. COPY(r12);
  136. COPY(r13);
  137. COPY(r14);
  138. COPY(r15);
  139. /* do not copy CS/SS because 64bit should not need it. 
  140.    also need IRET exception handling anyways. */
  141. {
  142. unsigned int tmpflags;
  143. err |= __get_user(tmpflags, &sc->eflags);
  144. regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
  145. regs->orig_rax = -1; /* disable syscall checks */
  146. }
  147. {
  148. struct _fpstate * buf;
  149. err |= __get_user(buf, &sc->fpstate);
  150. if (buf) {
  151. if (unlikely(verify_area(VERIFY_READ, buf, sizeof(*buf))))
  152. return 1;
  153. err |= restore_i387(buf);
  154. }
  155. }
  156. err |= __get_user(*prax, &sc->rax);
  157. return err;
  158. }
  159. #undef COPY
  160. asmlinkage long sys_rt_sigreturn(struct pt_regs regs)
  161. {
  162. struct rt_sigframe *frame = (struct rt_sigframe *)(regs.rsp - 8);
  163. sigset_t set;
  164. stack_t st;
  165. long eax;
  166. if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
  167. goto badframe;
  168. if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
  169. goto badframe;
  170. sigdelsetmask(&set, ~_BLOCKABLE);
  171. spin_lock_irq(&current->sigmask_lock);
  172. current->blocked = set;
  173. recalc_sigpending(current);
  174. spin_unlock_irq(&current->sigmask_lock);
  175. if (restore_sigcontext(&regs, &frame->uc.uc_mcontext, &eax))
  176. goto badframe;
  177. #if DEBUG_SIG
  178. printk("%d sigreturn rip:%lx rsp:%lx frame:%p rax:%lxn",current->pid,regs.rip,regs.rsp,frame,eax);
  179. #endif
  180. if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
  181. goto badframe;
  182. /* It is more difficult to avoid calling this function than to
  183.    call it and ignore errors.  */
  184. do_sigaltstack(&st, NULL, regs.rsp);
  185. return eax;
  186. badframe:
  187. signal_fault(&regs, frame, "rt_sigreturn"); 
  188. return 0;
  189. }
  190. /*
  191.  * Set up a signal frame.
  192.  */
  193. static int
  194. setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, unsigned long mask)
  195. {
  196. int tmp, err = 0;
  197. struct task_struct *me = current;
  198. tmp = 0;
  199. __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
  200. err |= __put_user(tmp, (unsigned int *)&sc->gs);
  201. __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
  202. err |= __put_user(tmp, (unsigned int *)&sc->fs);
  203. err |= __put_user(regs->rdi, &sc->rdi);
  204. err |= __put_user(regs->rsi, &sc->rsi);
  205. err |= __put_user(regs->rbp, &sc->rbp);
  206. err |= __put_user(regs->rsp, &sc->rsp);
  207. err |= __put_user(regs->rbx, &sc->rbx);
  208. err |= __put_user(regs->rdx, &sc->rdx);
  209. err |= __put_user(regs->rcx, &sc->rcx);
  210. err |= __put_user(regs->rax, &sc->rax);
  211. err |= __put_user(regs->r8, &sc->r8);
  212. err |= __put_user(regs->r9, &sc->r9);
  213. err |= __put_user(regs->r10, &sc->r10);
  214. err |= __put_user(regs->r11, &sc->r11);
  215. err |= __put_user(regs->r12, &sc->r12);
  216. err |= __put_user(regs->r13, &sc->r13);
  217. err |= __put_user(regs->r14, &sc->r14);
  218. err |= __put_user(regs->r15, &sc->r15);
  219. err |= __put_user(me->thread.trap_no, &sc->trapno);
  220. err |= __put_user(me->thread.error_code, &sc->err);
  221. err |= __put_user(regs->rip, &sc->rip);
  222. err |= __put_user(regs->cs, &sc->cs);
  223. err |= __put_user(regs->eflags, &sc->eflags);
  224. err |= __put_user(mask, &sc->oldmask);
  225. err |= __put_user(me->thread.cr2, &sc->cr2);
  226. return err;
  227. }
  228. /*
  229.  * Determine which stack to use..
  230.  */
  231. #define round_down(p, r) ((void *)  ((unsigned long)((p) - (r) + 1) & ~((r)-1)))
  232. static void * 
  233. get_stack(struct k_sigaction *ka, struct pt_regs *regs, unsigned long size)
  234. {
  235. unsigned long rsp;
  236. /* Default to using normal stack - redzone*/
  237. rsp = regs->rsp - 128;
  238. /* This is the X/Open sanctioned signal stack switching.  */
  239. if (ka->sa.sa_flags & SA_ONSTACK) {
  240. if (! sas_ss_flags(rsp) == 0)
  241. rsp = current->sas_ss_sp + current->sas_ss_size;
  242. }
  243. return round_down(rsp - size, 16); 
  244. }
  245. static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  246.    sigset_t *set, struct pt_regs * regs)
  247. {
  248. struct rt_sigframe *frame = NULL;
  249. struct _fpstate *fp = NULL; 
  250. int err = 0;
  251. if (current->used_math) {
  252. fp = get_stack(ka, regs, sizeof(struct _fpstate)); 
  253. frame = round_down((char *)fp - sizeof(struct rt_sigframe), 16) - 8;
  254. if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate))) { 
  255. goto give_sigsegv;
  256. }
  257. if (save_i387(fp) < 0) 
  258. err |= -1; 
  259. }
  260. if (!frame)
  261. frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8;
  262. if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) {
  263. goto give_sigsegv;
  264. }
  265. if (ka->sa.sa_flags & SA_SIGINFO) { 
  266. err |= copy_siginfo_to_user(&frame->info, info);
  267. if (err)
  268. goto give_sigsegv;
  269. }
  270. /* Create the ucontext.  */
  271. err |= __put_user(0, &frame->uc.uc_flags);
  272. err |= __put_user(0, &frame->uc.uc_link);
  273. err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
  274. err |= __put_user(sas_ss_flags(regs->rsp),
  275.   &frame->uc.uc_stack.ss_flags);
  276. err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
  277. err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
  278. err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate);
  279. err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  280. /* Set up to return from userspace.  If provided, use a stub
  281.    already in userspace.  */
  282. /* x86-64 should always use SA_RESTORER. */
  283. if (ka->sa.sa_flags & SA_RESTORER) {
  284. err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
  285. } else {
  286. printk("%s forgot to set SA_RESTORER for signal %d.n", current->comm, sig); 
  287. goto give_sigsegv; 
  288. }
  289. if (err)
  290. goto give_sigsegv;
  291. #if DEBUG_SIG
  292. printk("%d old rip %lx old rsp %lx old rax %lxn", current->pid,regs->rip,regs->rsp,regs->rax);
  293. #endif
  294. /* Set up registers for signal handler */
  295. struct exec_domain *ed = current->exec_domain;
  296. if (unlikely(ed && ed->signal_invmap && sig < 32))
  297. sig = ed->signal_invmap[sig];
  298. regs->rdi = sig;
  299. /* could reload DS/ES to __USER_DS here, but assume for now
  300.    that 64bit does not care */
  301. /* In case the signal handler was declared without prototypes */ 
  302. regs->rax = 0;
  303. /* This also works for non SA_SIGINFO handlers because they expect the
  304.    next argument after the signal number on the stack. */
  305. regs->rsi = (unsigned long)&frame->info; 
  306. regs->rdx = (unsigned long)&frame->uc; 
  307. regs->rsp = (unsigned long) frame;
  308. regs->rip = (unsigned long) ka->sa.sa_handler;
  309. regs->cs = __USER_CS;
  310. regs->ss = __USER_DS; 
  311. set_fs(USER_DS);
  312. regs->eflags &= ~TF_MASK;
  313. #if DEBUG_SIG
  314. printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%pn",
  315. current->comm, current->pid, frame, regs->rip, frame->pretcode);
  316. #endif
  317. return;
  318. give_sigsegv:
  319. if (sig == SIGSEGV)
  320. ka->sa.sa_handler = SIG_DFL;
  321. signal_fault(regs, frame, "signal deliver"); 
  322. }
  323. /*
  324.  * OK, we're invoking a handler
  325.  */
  326. static void
  327. handle_signal(unsigned long sig, struct k_sigaction *ka,
  328.       siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
  329. {
  330. #if DEBUG_SIG
  331. printk("handle_signal pid:%d sig:%lu rip:%lx rsp:%lx regs=%pn", current->pid, sig, 
  332. regs->rip, regs->rsp, regs);
  333. #endif
  334. /* Are we from a system call? */
  335. if (regs->orig_rax >= 0) {
  336. /* If so, check system call restarting.. */
  337. switch (regs->rax) {
  338. case -ERESTARTNOHAND:
  339. regs->rax = -EINTR;
  340. break;
  341. case -ERESTARTSYS:
  342. if (!(ka->sa.sa_flags & SA_RESTART)) {
  343. regs->rax = -EINTR;
  344. break;
  345. }
  346. /* fallthrough */
  347. case -ERESTARTNOINTR:
  348. regs->rax = regs->orig_rax;
  349. regs->rip -= 2;
  350. break; 
  351. }
  352. }
  353. #ifdef CONFIG_IA32_EMULATION
  354. if (current->thread.flags & THREAD_IA32) { 
  355. if (ka->sa.sa_flags & SA_SIGINFO)
  356. ia32_setup_rt_frame(sig, ka, info, oldset, regs);
  357. else
  358. ia32_setup_frame(sig, ka, oldset, regs);
  359. } else 
  360. #endif
  361. setup_rt_frame(sig, ka, info, oldset, regs);
  362. if (ka->sa.sa_flags & SA_ONESHOT)
  363. ka->sa.sa_handler = SIG_DFL;
  364. if (!(ka->sa.sa_flags & SA_NODEFER)) {
  365. spin_lock_irq(&current->sigmask_lock);
  366. sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
  367. sigaddset(&current->blocked,sig);
  368. recalc_sigpending(current);
  369. spin_unlock_irq(&current->sigmask_lock);
  370. }
  371. }
  372. /*
  373.  * Note that 'init' is a special process: it doesn't get signals it doesn't
  374.  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  375.  * mistake.
  376.  */
  377. int do_signal(struct pt_regs *regs, sigset_t *oldset)
  378. {
  379. siginfo_t info;
  380. struct k_sigaction *ka;
  381. /*
  382.  * We want the common case to go fast, which
  383.  * is why we may in certain cases get here from
  384.  * kernel mode. Just return without doing anything
  385.  * if so.
  386.  */
  387. if ((regs->cs & 3) != 3) {
  388. return 1;
  389. if (!oldset)
  390. oldset = &current->blocked;
  391. for (;;) {
  392. unsigned long signr;
  393. spin_lock_irq(&current->sigmask_lock);
  394. signr = dequeue_signal(&current->blocked, &info);
  395. spin_unlock_irq(&current->sigmask_lock);
  396. if (!signr) { 
  397. break;
  398. }
  399. if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
  400. /* Let the debugger run.  */
  401. current->exit_code = signr;
  402. current->state = TASK_STOPPED;
  403. notify_parent(current, SIGCHLD);
  404. schedule();
  405. /* We're back.  Did the debugger cancel the sig?  */
  406. if (!(signr = current->exit_code))
  407. continue;
  408. current->exit_code = 0;
  409. /* The debugger continued.  Ignore SIGSTOP.  */
  410. if (signr == SIGSTOP)
  411. continue;
  412. /* Update the siginfo structure.  Is this good?  */
  413. if (signr != info.si_signo) {
  414. info.si_signo = signr;
  415. info.si_errno = 0;
  416. info.si_code = SI_USER;
  417. info.si_pid = current->p_pptr->pid;
  418. info.si_uid = current->p_pptr->uid;
  419. }
  420. /* If the (new) signal is now blocked, requeue it.  */
  421. if (sigismember(&current->blocked, signr)) {
  422. send_sig_info(signr, &info, current);
  423. continue;
  424. }
  425. }
  426. ka = &current->sig->action[signr-1];
  427. if (ka->sa.sa_handler == SIG_IGN) {
  428. if (signr != SIGCHLD)
  429. continue;
  430. /* Check for SIGCHLD: it's special.  */
  431. while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
  432. /* nothing */;
  433. continue;
  434. }
  435. if (ka->sa.sa_handler == SIG_DFL) {
  436. int exit_code = signr;
  437. /* Init gets no signals it doesn't want.  */
  438. if (current->pid == 1)       
  439. continue;
  440. switch (signr) {
  441. case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
  442. continue;
  443. case SIGTSTP: case SIGTTIN: case SIGTTOU:
  444. if (is_orphaned_pgrp(current->pgrp))
  445. continue;
  446. /* FALLTHRU */
  447. case SIGSTOP: {
  448. struct signal_struct *sig;
  449. current->state = TASK_STOPPED;
  450. current->exit_code = signr;
  451. sig = current->p_pptr->sig;
  452. if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
  453. notify_parent(current, SIGCHLD);
  454. schedule();
  455. continue;
  456. }
  457. case SIGQUIT: case SIGILL: case SIGTRAP:
  458. case SIGABRT: case SIGFPE: case SIGSEGV:
  459. case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
  460. if (do_coredump(signr, regs))
  461. exit_code |= 0x80;
  462. /* FALLTHRU */
  463. default:
  464. sig_exit(signr, exit_code, &info);
  465. /* NOTREACHED */
  466. }
  467. }
  468. /* Reenable any watchpoints before delivering the
  469.  * signal to user space. The processor register will
  470.  * have been cleared if the watchpoint triggered
  471.  * inside the kernel.
  472.  */
  473. __asm__("movq %0,%%db7" : : "r" (current->thread.debugreg[7]));
  474. /* Whee!  Actually deliver the signal.  */
  475. handle_signal(signr, ka, &info, oldset, regs);
  476. return 1;
  477. }
  478. /* Did we come from a system call? */
  479. if (regs->orig_rax >= 0) {
  480. /* Restart the system call - no handlers present */
  481. if (regs->rax == -ERESTARTNOHAND ||
  482.     regs->rax == -ERESTARTSYS ||
  483.     regs->rax == -ERESTARTNOINTR) {
  484. regs->rax = regs->orig_rax;
  485. regs->rip -= 2;
  486. }
  487. }
  488. return 0;
  489. }
  490. void signal_fault(struct pt_regs *regs, void *frame, char *where)
  491. struct task_struct *me = current; 
  492. if (exception_trace)
  493. printk("%s[%d] bad frame in %s frame:%p rip:%lx rsp:%lx orax:%lxn",
  494.        me->comm,me->pid,where,frame,regs->rip,regs->rsp,regs->orig_rax); 
  495. force_sig(SIGSEGV, me);