Pull utrace into release branch
Tony Luck [Fri, 17 Oct 2008 20:51:16 +0000 (13:51 -0700)]
1  2 
arch/ia64/Kconfig
arch/ia64/ia32/ia32_entry.S
arch/ia64/ia32/sys_ia32.c

diff --combined arch/ia64/Kconfig
@@@ -21,6 -21,7 +21,7 @@@ config IA6
        select HAVE_KRETPROBES
        select HAVE_DMA_ATTRS
        select HAVE_KVM
+       select HAVE_ARCH_TRACEHOOK
        default y
        help
          The Itanium Processor Family is Intel's 64-bit successor to
@@@ -60,6 -61,14 +61,6 @@@ config RWSEM_XCHGADD_ALGORITH
        bool
        default y
  
 -config ARCH_HAS_ILOG2_U32
 -      bool
 -      default n
 -
 -config ARCH_HAS_ILOG2_U64
 -      bool
 -      default n
 -
  config HUGETLB_PAGE_SIZE_VARIABLE
        bool
        depends on HUGETLB_PAGE
@@@ -108,6 -108,11 +108,11 @@@ GLOBAL_ENTRY(ia32_trace_syscall
        ;;
        st8 [r2]=r3                             // initialize return code to -ENOSYS
        br.call.sptk.few rp=syscall_trace_enter // give parent a chance to catch syscall args
+       cmp.lt p6,p0=r8,r0                      // check tracehook
+       adds r2=IA64_PT_REGS_R8_OFFSET+16,sp    // r2 = &pt_regs.r8
+       ;;
+ (p6)  st8.spill [r2]=r8                       // store return value in slot for r8
+ (p6)  br.spnt.few .ret4
  .ret2:        // Need to reload arguments (they may be changed by the tracing process)
        adds r2=IA64_PT_REGS_R1_OFFSET+16,sp    // r2 = &pt_regs.r1
        adds r3=IA64_PT_REGS_R13_OFFSET+16,sp   // r3 = &pt_regs.r13
@@@ -199,10 -204,10 +204,10 @@@ ia32_syscall_table
        data8 sys_setuid        /* 16-bit version */
        data8 sys_getuid        /* 16-bit version */
        data8 compat_sys_stime    /* 25 */
-       data8 sys32_ptrace
+       data8 compat_sys_ptrace
        data8 sys32_alarm
        data8 sys_ni_syscall
 -      data8 sys32_pause
 +      data8 sys_pause
        data8 compat_sys_utime    /* 30 */
        data8 sys_ni_syscall      /* old stty syscall holder */
        data8 sys_ni_syscall      /* old gtty syscall holder */
        data8 sys_mkdir
        data8 sys_rmdir           /* 40 */
        data8 sys_dup
 -      data8 sys32_pipe
 +      data8 sys_pipe
        data8 compat_sys_times
        data8 sys_ni_syscall      /* old prof syscall holder */
        data8 sys32_brk           /* 45 */
        data8 compat_sys_setrlimit        /* 75 */
        data8 compat_sys_old_getrlimit
        data8 compat_sys_getrusage
 -      data8 sys32_gettimeofday
 -      data8 sys32_settimeofday
 +      data8 compat_sys_gettimeofday
 +      data8 compat_sys_settimeofday
        data8 sys32_getgroups16   /* 80 */
        data8 sys32_setgroups16
        data8 sys32_old_select
@@@ -118,6 -118,41 +118,6 @@@ sys32_execve (char __user *name, compat
        return error;
  }
  
 -int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf)
 -{
 -      compat_ino_t ino;
 -      int err;
 -
 -      if ((u64) stat->size > MAX_NON_LFS ||
 -          !old_valid_dev(stat->dev) ||
 -          !old_valid_dev(stat->rdev))
 -              return -EOVERFLOW;
 -
 -      ino = stat->ino;
 -      if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino)
 -              return -EOVERFLOW;
 -
 -      if (clear_user(ubuf, sizeof(*ubuf)))
 -              return -EFAULT;
 -
 -      err  = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev);
 -      err |= __put_user(ino, &ubuf->st_ino);
 -      err |= __put_user(stat->mode, &ubuf->st_mode);
 -      err |= __put_user(stat->nlink, &ubuf->st_nlink);
 -      err |= __put_user(high2lowuid(stat->uid), &ubuf->st_uid);
 -      err |= __put_user(high2lowgid(stat->gid), &ubuf->st_gid);
 -      err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev);
 -      err |= __put_user(stat->size, &ubuf->st_size);
 -      err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime);
 -      err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec);
 -      err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime);
 -      err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec);
 -      err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime);
 -      err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec);
 -      err |= __put_user(stat->blksize, &ubuf->st_blksize);
 -      err |= __put_user(stat->blocks, &ubuf->st_blocks);
 -      return err;
 -}
  
  #if PAGE_SHIFT > IA32_PAGE_SHIFT
  
@@@ -1098,12 -1133,83 +1098,12 @@@ sys32_mremap (unsigned int addr, unsign
        return ret;
  }
  
 -asmlinkage long
 -sys32_pipe (int __user *fd)
 -{
 -      int retval;
 -      int fds[2];
 -
 -      retval = do_pipe_flags(fds, 0);
 -      if (retval)
 -              goto out;
 -      if (copy_to_user(fd, fds, sizeof(fds)))
 -              retval = -EFAULT;
 -  out:
 -      return retval;
 -}
 -
 -static inline long
 -get_tv32 (struct timeval *o, struct compat_timeval __user *i)
 -{
 -      return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
 -              (__get_user(o->tv_sec, &i->tv_sec) | __get_user(o->tv_usec, &i->tv_usec)));
 -}
 -
 -static inline long
 -put_tv32 (struct compat_timeval __user *o, struct timeval *i)
 -{
 -      return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
 -              (__put_user(i->tv_sec, &o->tv_sec) | __put_user(i->tv_usec, &o->tv_usec)));
 -}
 -
  asmlinkage unsigned long
  sys32_alarm (unsigned int seconds)
  {
        return alarm_setitimer(seconds);
  }
  
 -/* Translations due to time_t size differences.  Which affects all
 -   sorts of things, like timeval and itimerval.  */
 -
 -extern struct timezone sys_tz;
 -
 -asmlinkage long
 -sys32_gettimeofday (struct compat_timeval __user *tv, struct timezone __user *tz)
 -{
 -      if (tv) {
 -              struct timeval ktv;
 -              do_gettimeofday(&ktv);
 -              if (put_tv32(tv, &ktv))
 -                      return -EFAULT;
 -      }
 -      if (tz) {
 -              if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
 -                      return -EFAULT;
 -      }
 -      return 0;
 -}
 -
 -asmlinkage long
 -sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz)
 -{
 -      struct timeval ktv;
 -      struct timespec kts;
 -      struct timezone ktz;
 -
 -      if (tv) {
 -              if (get_tv32(&ktv, tv))
 -                      return -EFAULT;
 -              kts.tv_sec = ktv.tv_sec;
 -              kts.tv_nsec = ktv.tv_usec * 1000;
 -      }
 -      if (tz) {
 -              if (copy_from_user(&ktz, tz, sizeof(ktz)))
 -                      return -EFAULT;
 -      }
 -
 -      return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
 -}
 -
  struct sel_arg_struct {
        unsigned int n;
        unsigned int inp;
@@@ -1194,25 -1300,6 +1194,6 @@@ sys32_waitpid (int pid, unsigned int *s
        return compat_sys_wait4(pid, stat_addr, options, NULL);
  }
  
- static unsigned int
- ia32_peek (struct task_struct *child, unsigned long addr, unsigned int *val)
- {
-       size_t copied;
-       unsigned int ret;
-       copied = access_process_vm(child, addr, val, sizeof(*val), 0);
-       return (copied != sizeof(ret)) ? -EIO : 0;
- }
- static unsigned int
- ia32_poke (struct task_struct *child, unsigned long addr, unsigned int val)
- {
-       if (access_process_vm(child, addr, &val, sizeof(val), 1) != sizeof(val))
-               return -EIO;
-       return 0;
- }
  /*
   *  The order in which registers are stored in the ptrace regs structure
   */
@@@ -1510,49 -1597,15 +1491,15 @@@ restore_ia32_fpxstate (struct task_stru
        return 0;
  }
  
- asmlinkage long
- sys32_ptrace (int request, pid_t pid, unsigned int addr, unsigned int data)
+ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
+       compat_ulong_t caddr, compat_ulong_t cdata)
  {
-       struct task_struct *child;
-       unsigned int value, tmp;
+       unsigned long addr = caddr;
+       unsigned long data = cdata;
+       unsigned int tmp;
        long i, ret;
  
-       lock_kernel();
-       if (request == PTRACE_TRACEME) {
-               ret = ptrace_traceme();
-               goto out;
-       }
-       child = ptrace_get_task_struct(pid);
-       if (IS_ERR(child)) {
-               ret = PTR_ERR(child);
-               goto out;
-       }
-       if (request == PTRACE_ATTACH) {
-               ret = sys_ptrace(request, pid, addr, data);
-               goto out_tsk;
-       }
-       ret = ptrace_check_attach(child, request == PTRACE_KILL);
-       if (ret < 0)
-               goto out_tsk;
        switch (request) {
-             case PTRACE_PEEKTEXT:
-             case PTRACE_PEEKDATA:     /* read word at location addr */
-               ret = ia32_peek(child, addr, &value);
-               if (ret == 0)
-                       ret = put_user(value, (unsigned int __user *) compat_ptr(data));
-               else
-                       ret = -EIO;
-               goto out_tsk;
-             case PTRACE_POKETEXT:
-             case PTRACE_POKEDATA:     /* write the word at location addr */
-               ret = ia32_poke(child, addr, data);
-               goto out_tsk;
              case PTRACE_PEEKUSR:      /* read word at addr in USER area */
                ret = -EIO;
                if ((addr & 3) || addr > 17*sizeof(int))
                                            compat_ptr(data));
                break;
  
-             case PTRACE_GETEVENTMSG:   
-               ret = put_user(child->ptrace_message, (unsigned int __user *) compat_ptr(data));
-               break;
-             case PTRACE_SYSCALL:      /* continue, stop after next syscall */
-             case PTRACE_CONT:         /* restart after signal. */
-             case PTRACE_KILL:
-             case PTRACE_SINGLESTEP:   /* execute chile for one instruction */
-             case PTRACE_DETACH:       /* detach a process */
-               ret = sys_ptrace(request, pid, addr, data);
-               break;
              default:
-               ret = ptrace_request(child, request, addr, data);
-               break;
+               return compat_ptrace_request(child, request, caddr, cdata);
        }
-   out_tsk:
-       put_task_struct(child);
-   out:
-       unlock_kernel();
        return ret;
  }
  
@@@ -1689,6 -1724,14 +1618,6 @@@ out
  }
  
  asmlinkage int
 -sys32_pause (void)
 -{
 -      current->state = TASK_INTERRUPTIBLE;
 -      schedule();
 -      return -ERESTARTNOHAND;
 -}
 -
 -asmlinkage int
  sys32_msync (unsigned int start, unsigned int len, int flags)
  {
        unsigned int addr;