⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traps-linux.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
            }          case __NR_sync:            sync();            result = 0;            break;          case __NR_rename:            result = rename((char *) t2h_addr(cb, &s, arg1),                            (char *) t2h_addr(cb, &s, arg2));            errcode = errno;            break;          case __NR_mkdir:            result = mkdir((char *) t2h_addr(cb, &s, arg1), arg2);            errcode = errno;            break;          case __NR_rmdir:            result = rmdir((char *) t2h_addr(cb, &s, arg1));            errcode = errno;            break;          case __NR_dup:            result = dup(arg1);            errcode = errno;            break;          case __NR_brk:            result = brk((void *) arg1);            errcode = errno;            //result = arg1;            break;          case __NR_getgid:            result = getgid();            errcode = errno;            break;          case __NR_geteuid:            result = geteuid();            errcode = errno;            break;          case __NR_getegid:            result = getegid();            errcode = errno;            break;          case __NR_ioctl:            result = ioctl(arg1, arg2, arg3);            errcode = errno;            break;          case __NR_fcntl:            result = fcntl(arg1, arg2, arg3);            errcode = errno;            break;          case __NR_dup2:            result = dup2(arg1, arg2);            errcode = errno;            break;          case __NR_getppid:            result = getppid();            errcode = errno;            break;          case __NR_getpgrp:            result = getpgrp();            errcode = errno;            break;          case __NR_getrlimit:            {              struct rlimit rlim;              result = getrlimit(arg1, &rlim);              errcode = errno;              if (result != 0)                break;              translate_endian((void *) &rlim, sizeof(rlim));              if ((s.write_mem) (cb, &s, arg2, (char *) &rlim, sizeof(rlim))                  != sizeof(rlim))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_getrusage:            {              struct rusage usage;              result = getrusage(arg1, &usage);              errcode = errno;              if (result != 0)                break;              translate_endian((void *) &usage, sizeof(usage));              if ((s.write_mem) (cb, &s, arg2, (char *) &usage, sizeof(usage))                  != sizeof(usage))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_gettimeofday:            {              struct timeval tv;              struct timezone tz;                            result = gettimeofday(&tv, &tz);              errcode = errno;                            if (result != 0)                break;              translate_endian((void *) &tv, sizeof(tv));              if ((s.write_mem) (cb, &s, arg1, (char *) &tv, sizeof(tv))                  != sizeof(tv))                {                  result = -1;                  errcode = EINVAL;                }              translate_endian((void *) &tz, sizeof(tz));              if ((s.write_mem) (cb, &s, arg2, (char *) &tz, sizeof(tz))                  != sizeof(tz))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_getgroups:            {              gid_t *list;              if (arg1 > 0)                list = (gid_t *) malloc(arg1 * sizeof(gid_t));              result = getgroups(arg1, list);              errcode = errno;              if (result != 0)                break;              translate_endian((void *) list, arg1 * sizeof(gid_t));              if (arg1 > 0)                if ((s.write_mem) (cb, &s, arg2, (char *) list, arg1 * sizeof(gid_t))                    != arg1 * sizeof(gid_t))                  {                    result = -1;                     errcode = EINVAL;                  }            }            break;          case __NR_select:            {              int n;              fd_set readfds;              fd_set *treadfdsp;              fd_set *hreadfdsp;              fd_set writefds;              fd_set *twritefdsp;              fd_set *hwritefdsp;              fd_set exceptfds;              fd_set *texceptfdsp;              fd_set *hexceptfdsp;              struct timeval *ttimeoutp;              struct timeval timeout;                            n = arg1;              treadfdsp = (fd_set *) arg2;              if (treadfdsp != NULL)                {                  readfds = *((fd_set *) t2h_addr(cb, &s, (unsigned int) treadfdsp));                  translate_endian((void *) &readfds, sizeof(readfds));                  hreadfdsp = &readfds;                }              else                hreadfdsp = NULL;                            twritefdsp  = (fd_set *) arg3;              if (twritefdsp != NULL)                {                  writefds = *((fd_set *) t2h_addr(cb, &s, (unsigned int) twritefdsp));                  translate_endian((void *) &writefds, sizeof(writefds));                  hwritefdsp = &writefds;                }              else                hwritefdsp = NULL;                            texceptfdsp = (fd_set *) arg4;              if (texceptfdsp != NULL)                {                  exceptfds = *((fd_set *) t2h_addr(cb, &s, (unsigned int) texceptfdsp));                  translate_endian((void *) &exceptfds, sizeof(exceptfds));                  hexceptfdsp = &exceptfds;                }              else                hexceptfdsp = NULL;                            ttimeoutp = (struct timeval *) arg5;              timeout = *((struct timeval *) t2h_addr(cb, &s, (unsigned int) ttimeoutp));              translate_endian((void *) &timeout, sizeof(timeout));              result = select(n, hreadfdsp, hwritefdsp, hexceptfdsp, &timeout);              errcode = errno;              if (result != 0)                break;              if (treadfdsp != NULL)                {                  translate_endian((void *) &readfds, sizeof(readfds));                  if ((s.write_mem) (cb, &s, (unsigned long) treadfdsp,                       (char *) &readfds, sizeof(readfds)) != sizeof(readfds))                    {                      result = -1;                      errcode = EINVAL;                    }                }              if (twritefdsp != NULL)                {                  translate_endian((void *) &writefds, sizeof(writefds));                  if ((s.write_mem) (cb, &s, (unsigned long) twritefdsp,                       (char *) &writefds, sizeof(writefds)) != sizeof(writefds))                    {                      result = -1;                      errcode = EINVAL;                    }                }              if (texceptfdsp != NULL)                {                  translate_endian((void *) &exceptfds, sizeof(exceptfds));                  if ((s.write_mem) (cb, &s, (unsigned long) texceptfdsp,                       (char *) &exceptfds, sizeof(exceptfds)) != sizeof(exceptfds))                    {                      result = -1;                      errcode = EINVAL;                    }                }              translate_endian((void *) &timeout, sizeof(timeout));              if ((s.write_mem) (cb, &s, (unsigned long) ttimeoutp,                   (char *) &timeout, sizeof(timeout)) != sizeof(timeout))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_symlink:            result = symlink((char *) t2h_addr(cb, &s, arg1),                             (char *) t2h_addr(cb, &s, arg2));            errcode = errno;            break;          case __NR_readlink:            result = readlink((char *) t2h_addr(cb, &s, arg1),                              (char *) t2h_addr(cb, &s, arg2),                              arg3);            errcode = errno;            break;          case __NR_readdir:            result = (int) readdir((DIR *) t2h_addr(cb, &s, arg1));            errcode = errno;            break;#if 0          case __NR_mmap:            {              result = (int) mmap((void *) t2h_addr(cb, &s, arg1),                                  arg2, arg3, arg4, arg5, arg6);              errcode = errno;              if (errno == 0)                {                  sim_core_attach (sd, NULL,                                   0, access_read_write_exec, 0,                                   result, arg2, 0, NULL, NULL);                }            }            break;#endif          case __NR_mmap:            {              void *addr;              size_t len;              int prot, flags, fildes;              off_t off;                            addr   = *((void **)  t2h_addr(cb, &s, arg1));              len    = *((size_t *) t2h_addr(cb, &s, arg1 + 4));              prot   = *((int *)    t2h_addr(cb, &s, arg1 + 8));              flags  = *((int *)    t2h_addr(cb, &s, arg1 + 12));              fildes = *((int *)    t2h_addr(cb, &s, arg1 + 16));              off    = *((off_t *)  t2h_addr(cb, &s, arg1 + 20));              addr   = (void *) conv_endian((unsigned int) addr);              len    = conv_endian(len);              prot   = conv_endian(prot);              flags  = conv_endian(flags);              fildes = conv_endian(fildes);              off    = conv_endian(off);              //addr   = (void *) t2h_addr(cb, &s, (unsigned int) addr);              result = (int) mmap(addr, len, prot, flags, fildes, off);              errcode = errno;              //if (errno == 0)              if (result != -1)                {                  char c;		  if (sim_core_read_buffer (sd, NULL, read_map, &c, result, 1) == 0)                    sim_core_attach (sd, NULL,                                     0, access_read_write_exec, 0,                                     result, len, 0, NULL, NULL);                }            }            break;          case __NR_munmap:            {            result = munmap((void *)arg1, arg2);            errcode = errno;            if (result != -1)              {                sim_core_detach (sd, NULL, 0, arg2, result);              }            }            break;          case __NR_truncate:            result = truncate((char *) t2h_addr(cb, &s, arg1), arg2);            errcode = errno;            break;          case __NR_ftruncate:            result = ftruncate(arg1, arg2);            errcode = errno;            break;          case __NR_fchmod:            result = fchmod(arg1, arg2);            errcode = errno;            break;          case __NR_fchown:            result = fchown(arg1, arg2, arg3);            errcode = errno;            break;          case __NR_statfs:            {              struct statfs statbuf;              result = statfs((char *) t2h_addr(cb, &s, arg1), &statbuf);              errcode = errno;              if (result != 0)                break;              translate_endian((void *) &statbuf, sizeof(statbuf));              if ((s.write_mem) (cb, &s, arg2, (char *) &statbuf, sizeof(statbuf))                  != sizeof(statbuf))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_fstatfs:            {              struct statfs statbuf;              result = fstatfs(arg1, &statbuf);              errcode = errno;              if (result != 0)                break;              translate_endian((void *) &statbuf, sizeof(statbuf));              if ((s.write_mem) (cb, &s, arg2, (char *) &statbuf, sizeof(statbuf))                  != sizeof(statbuf))                {                  result = -1;                  errcode = EINVAL;                }            }            break;          case __NR_syslog:            result = syslog(arg1, (char *) t2h_addr(cb, &s, arg2));            errcode = errno;            break;          case __NR_setitimer:            {              struct itimerval value, ovalue;              value = *((struct itimerval *) t2h_addr(cb, &s, arg2));              translate_endian((void *) &value, sizeof(value));              if (arg2 == 0)                {                  result = setitimer(arg1, &value, NULL);                  errcode = errno;                }              else                {                  result = setitimer(arg1, &value, &ovalue);                  errcode = errno;                  if (result != 0)                    break;                  translate_endian((void *) &ovalue, sizeof(ovalue));                  if ((s.write_mem) (cb, &s, arg3, (char *) &ovalue, sizeof(ovalue))                      != sizeof(ovalue))                    {                      result = -1;                      errcode = EINVAL;                    }                }            }            break;          case __NR_getitimer:            {              struct itimerval value;              result = getitimer(arg1, &value);              errcode = errno;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -