📄 traps.cc
字号:
//--------------------------------------------------------------------- case SIM_TRAP_FSTAT64: // fstat system call Fstat64Handler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_DFSTAT64: // stat system call DFStat64Handler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_LSTAT64: // lstat system call Lstat64Handler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_CHMOD: // chmod system call ChmodHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_FCHMOD: // fchmod system call FchmodHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_CHOWN: // chown system call ChownHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_FCHOWN: // fchown system call FchownHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_LCHOWN: // lchown system call LchownHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_RENAME: // rename system call RenameHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_UTIME: // utime system call UtimeHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_DMKDIR: // mkdir system call DMkdirHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_DRMDIR: // rmdir system call DRmdirHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETDENTS64: // getdents system call Getdents64Handler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_LINK: // link system call LinkHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_SYMLINK: // symlink system call SymlinkHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_FSTATVFS64: // fstatvfs system call Fstatvfs64Handler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETUID: // getuid system call GetUIDHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETGID: // getgid system call GetGIDHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETGROUPS: // getgroups system call GetgroupsHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETSTDIO: // getstdio system call GetStdioHandler(inst, proc); break; //===================================================================== case SIM_TRAP_SOCKET: SocketHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_BIND: BindHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_LISTEN: ListenHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_ACCEPT: AcceptHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_CONNECT: ConnectHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETSOCKOPT: GetSockOptHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_SETSOCKOPT: SetSockOptHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_SHUTDOWN: ShutdownHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_CLOSESOCKET: CloseSocketHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETSOCKNAME: GetSockNameHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETPEERNAME: GetPeerNameHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_SENDMSG: SendMsgHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_RECVMSG: RecvMsgHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETHOSTBYNAME: GetHostByNameHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_GETHOSTBYADDR: GetHostByAddrHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_SYSINFO: SysInfoHandler(inst, proc); break; //--------------------------------------------------------------------- case SIM_TRAP_PATHCONF: PathConfHandler(inst, proc); break; //--------------------------------------------------------------------- default: return(0); } return(1);} /***************************************************************************/ static void UserStatAllocHandler(instance *inst, ProcState *proc){#ifdef COREFILE if (YS__Simtime > DEBUG_TIME) fprintf(corefile, "traps.cc: In UserStatAlloc Handler\n");#endif int pr; char buffer[MAX_USERSTAT_NAME]; int type; int return_value; int lreturn_register; int return_register; char *pa; lreturn_register = arch_to_log(proc, proc->cwp, 8); return_register = proc->intmapper[lreturn_register]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 8)]; type = proc->phy_int_reg_file[pr]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 9)]; inst->addr = proc->phy_int_reg_file[pr]; memset(buffer, 0, sizeof(buffer)); for (int i = 0; i < sizeof(buffer)-1; i++) { pa = (char *)GetMap(inst, proc); buffer[i] = *pa; if (buffer[i] == 0) break; inst->addr++; } return_value = UserStats[proc->proc_id / ARCH_cpus]->alloc(type, buffer); proc->phy_int_reg_file[return_register] = proc->log_int_reg_file[lreturn_register] = return_value; }/***************************************************************************/static void UserStatSampleHandler(instance *inst, ProcState *proc){#ifdef COREFILE if (YS__Simtime > DEBUG_TIME) fprintf(corefile, "traps.cc: In UserStatSample Handler\n");#endif int pr; int id; int val; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 8)]; id = proc->phy_int_reg_file[pr]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 9)]; val = proc->phy_int_reg_file[pr]; UserStats[proc->proc_id / ARCH_cpus]->sample(id, val);}/***************************************************************************//* WritelogHandler : Simulator exception for writing log file *//***************************************************************************/static void WritelogHandler(instance *inst, ProcState *proc){#ifdef COREFILE if (YS__Simtime > DEBUG_TIME) fprintf(corefile,"traps.cc: In Writelog Handler\n");#endif int number_of_items; char *buffer; int pr, fd; int count = 0; int lreturn_register; int return_register; int retval, done; fd = logfile[proc->proc_id / ARCH_cpus]; lreturn_register = arch_to_log(proc, proc->cwp, 8); return_register = proc->intmapper[lreturn_register]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 8)]; inst->addr = proc->phy_int_reg_file[pr]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 9)]; number_of_items = proc->phy_int_reg_file[pr]; int st = inst->addr & (PAGE_SIZE - 1); done = 0; if (number_of_items > PAGE_SIZE - st) { buffer = GetMap(inst, proc); while ((retval = write(fd, buffer, PAGE_SIZE-st)) < 0) { printf("Write to file failed (%s)", YS__strerror(errno)); printf(" Retry in %i secs ...\n", FILEOP_RETRY_PERIOD); fflush(stdout); sleep(FILEOP_RETRY_PERIOD); } count += retval; inst->addr += retval; number_of_items -= retval; if (retval != PAGE_SIZE-st) done = 1; while (number_of_items >= PAGE_SIZE) { buffer = GetMap(inst, proc); while ((retval = write(fd, buffer, PAGE_SIZE)) < 0) { printf("Write to file failed (%s)", YS__strerror(errno)); printf(" Retry in %i secs ...\n", FILEOP_RETRY_PERIOD); fflush(stdout); sleep(FILEOP_RETRY_PERIOD); } if (retval < 0) /* some sort of error other than EOF */ count = retval; else { count += retval; number_of_items -= retval; inst->addr += retval; } if (retval != PAGE_SIZE) { done = 1; break; } } } buffer = GetMap(inst, proc); if (!done) { while ((retval = write(fd, buffer, number_of_items)) < 0) { printf("Write to file failed (%s)", YS__strerror(errno)); printf(" Retry in %i secs ...\n", FILEOP_RETRY_PERIOD); fflush(stdout); sleep(FILEOP_RETRY_PERIOD); } if (retval < 0) /* some sort of error other than EOF */ count = retval; else count += retval; } if (count < 0) count = -1 * errno; fflush(NULL); proc->phy_int_reg_file[return_register] = proc->log_int_reg_file[lreturn_register] = count;} /***************************************************************************/static void DCreatHandler(instance *inst, ProcState *proc){#ifdef COREFILE if (YS__Simtime > DEBUG_TIME) fprintf(corefile,"traps.cc: In Creat Handler\n");#endif int pr; char buffer[PATH_MAX]; int mode, fd; int return_value; int return_register; int lreturn_register; char *pa; lreturn_register = arch_to_log(proc, proc->cwp, 8); return_register = proc->intmapper[lreturn_register]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 8)]; fd = proc->phy_int_reg_file[pr]; pr = proc->intmapper[arch_to_log(proc, proc->cwp, 9)]; inst->addr = proc->phy_int_reg_file[pr]; memset(buffer, 0, sizeof(buffer)); for (int i = 0; i < PATH_MAX-1; i++) { pa = (char *)GetMap(inst, proc); buffer[i] = *pa; if (*pa == '\0') break; inst->addr++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -