Diff for /linux/kernel/signal.c between versions 1.1.1.5 and 1.1.1.6

version 1.1.1.5, 2018/04/24 18:08:01 version 1.1.1.6, 2018/04/24 18:09:48
Line 10 Line 10
   
 #include <signal.h>  #include <signal.h>
 #include <sys/wait.h>  #include <sys/wait.h>
   #include <sys/ptrace.h>
 #include <errno.h>  #include <errno.h>
   
   extern int core_dump(long signr,struct pt_regs * regs);
   
 int sys_sgetmask()  int sys_sgetmask()
 {  {
         return current->blocked;          return current->blocked;
Line 91  int sys_signal(int signum, long handler, Line 94  int sys_signal(int signum, long handler,
                 return -EINVAL;                  return -EINVAL;
         tmp.sa_handler = (void (*)(int)) handler;          tmp.sa_handler = (void (*)(int)) handler;
         tmp.sa_mask = 0;          tmp.sa_mask = 0;
         tmp.sa_flags = SA_ONESHOT | SA_NOMASK;          tmp.sa_flags = SA_ONESHOT | SA_NOMASK | SA_INTERRUPT;
         tmp.sa_restorer = (void (*)(void)) restorer;          tmp.sa_restorer = (void (*)(void)) restorer;
         handler = (long) current->sigaction[signum-1].sa_handler;          handler = (long) current->sigaction[signum-1].sa_handler;
         current->sigaction[signum-1] = tmp;          current->sigaction[signum-1] = tmp;
Line 117  int sys_sigaction(int signum, const stru Line 120  int sys_sigaction(int signum, const stru
         return 0;          return 0;
 }  }
   
 /*  
  * Routine writes a core dump image in the current directory.  
  * Currently not implemented.  
  */  
 int core_dump(long signr)  
 {  
         return(0);      /* We didn't do a dump */  
 }  
   
 extern int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options);  extern int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options);
   
 int do_signal(long signr,long ebx, long ecx, long edx,  int do_signal(long signr,struct pt_regs * regs)
               long esi, long edi, long ebp, long eax,  
               long ds, long es, long fs, long gs,  
               long orig_eax,  
         long eip, long cs, long eflags,  
         unsigned long * esp, long ss)  
 {  {
         unsigned long sa_handler;          unsigned long sa_handler;
         long old_eip=eip;          long old_eip = regs->eip;
         struct sigaction * sa = current->sigaction + signr - 1;          struct sigaction * sa = current->sigaction + signr - 1;
         int longs;          int longs;
   
         unsigned long * tmp_esp;          unsigned long * tmp_esp;
   
 #ifdef notdef  #ifdef notdef
         printk("pid: %d, signr: %x, eax=%d, oeax = %d, int=%d\n",           printk("pid: %d, signr: %x, eax=%d, oeax = %d, int=%d\n", 
                 current->pid, signr, eax, orig_eax,                   current->pid, signr, regs->eax, regs->orig_eax, 
                 sa->sa_flags & SA_INTERRUPT);                  sa->sa_flags & SA_INTERRUPT);
 #endif  #endif
         if ((orig_eax != -1) &&          sa_handler = (unsigned long) sa->sa_handler;
             ((eax == -ERESTARTSYS) || (eax == -ERESTARTNOINTR))) {          if ((regs->orig_eax != -1) &&
                 if ((eax == -ERESTARTSYS) && ((sa->sa_flags & SA_INTERRUPT) ||              ((regs->eax == -ERESTARTSYS) || (regs->eax == -ERESTARTNOINTR))) {
                     signr < SIGCONT || signr > SIGTTOU))                  if ((sa_handler > 1) && (regs->eax == -ERESTARTSYS) &&
                         *(&eax) = -EINTR;                      (sa->sa_flags & SA_INTERRUPT))
                           regs->eax = -EINTR;
                 else {                  else {
                         *(&eax) = orig_eax;                          regs->eax = regs->orig_eax;
                         *(&eip) = old_eip -= 2;                          regs->eip = old_eip -= 2;
                 }                  }
         }          }
         sa_handler = (unsigned long) sa->sa_handler;  
         if (sa_handler==1) {          if (sa_handler==1) {
 /* check for SIGCHLD: it's special */  /* check for SIGCHLD: it's special */
                 if (signr == SIGCHLD)                  if (signr == SIGCHLD)
Line 180  int do_signal(long signr,long ebx, long  Line 168  int do_signal(long signr,long ebx, long 
                         current->exit_code = signr;                          current->exit_code = signr;
                         if (!(current->p_pptr->sigaction[SIGCHLD-1].sa_flags &                           if (!(current->p_pptr->sigaction[SIGCHLD-1].sa_flags & 
                                         SA_NOCLDSTOP))                                          SA_NOCLDSTOP))
                           send_sig(SIGCHLD, current->p_pptr, 1);                                  send_sig(SIGCHLD, current->p_pptr, 1);                  
 /*                              current->p_pptr->signal |= (1<<(SIGCHLD-1));*/  
                           
                         return(1);  /* Reschedule another event */                          return(1);  /* Reschedule another event */
   
                 case SIGQUIT:                  case SIGQUIT:
Line 191  int do_signal(long signr,long ebx, long  Line 177  int do_signal(long signr,long ebx, long 
                 case SIGIOT:                  case SIGIOT:
                 case SIGFPE:                  case SIGFPE:
                 case SIGSEGV:                  case SIGSEGV:
                         if (core_dump(signr))                          if (core_dump(signr,regs))
                                 do_exit(signr|0x80);                                  do_exit(signr|0x80);
                         /* fall through */                          /* fall through */
                 default:                  default:
Line 203  int do_signal(long signr,long ebx, long  Line 189  int do_signal(long signr,long ebx, long 
          */           */
         if (sa->sa_flags & SA_ONESHOT)          if (sa->sa_flags & SA_ONESHOT)
                 sa->sa_handler = NULL;                  sa->sa_handler = NULL;
         *(&eip) = sa_handler;          regs->eip = sa_handler;
         longs = (sa->sa_flags & SA_NOMASK)?7:8;          longs = (sa->sa_flags & SA_NOMASK)?(7*4):(8*4);
         *(&esp) -= longs;          regs->esp -= longs;
         verify_area(esp,longs*4);          tmp_esp = (unsigned long *) regs->esp;
         tmp_esp=esp;          verify_area(tmp_esp,longs);
         put_fs_long((long) sa->sa_restorer,tmp_esp++);          put_fs_long((long) sa->sa_restorer,tmp_esp++);
         put_fs_long(signr,tmp_esp++);          put_fs_long(signr,tmp_esp++);
         if (!(sa->sa_flags & SA_NOMASK))          if (!(sa->sa_flags & SA_NOMASK))
                 put_fs_long(current->blocked,tmp_esp++);                  put_fs_long(current->blocked,tmp_esp++);
         put_fs_long(eax,tmp_esp++);          put_fs_long(regs->eax,tmp_esp++);
         put_fs_long(ecx,tmp_esp++);          put_fs_long(regs->ecx,tmp_esp++);
         put_fs_long(edx,tmp_esp++);          put_fs_long(regs->edx,tmp_esp++);
         put_fs_long(eflags,tmp_esp++);          put_fs_long(regs->eflags,tmp_esp++);
         put_fs_long(old_eip,tmp_esp++);          put_fs_long(old_eip,tmp_esp++);
         current->blocked |= sa->sa_mask;          current->blocked |= sa->sa_mask;
 /* force a supervisor-mode page-in of the signal handler to reduce races */  /* force a supervisor-mode page-in of the signal handler to reduce races */

Removed from v.1.1.1.5  
changed lines
  Added in v.1.1.1.6


unix.superglobalmegacorp.com