📄 traps-linux.c
字号:
} 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 + -