syscall.c

来自「ppc750 system design simulator using sys」· C语言 代码 · 共 1,548 行 · 第 1/4 页

C
1,548
字号
	if(emulate_syscall)		do_syscall();}char *sc_bin2c(ppc_inst_t inst, addr_t pc, char *buf){	buf += sprintf(buf, "\tdo_syscall();\n");	return buf;}char *sc_disasm(ppc_inst_t inst, addr_t pc, char *buf) { buf += sprintf(buf, "sc"); return buf; }void sc_translate(ppc_inst_t inst, struct DecodedInstruction *di){	di->iclass = ICSystemCall;	di->operation.systemRegister.ident = ID_SC;	di->hasImmed = FALSE;}void sc_xml(ppc_inst_t inst, addr_t pc, char *buf) { xmlf(buf, pc, "sc", 0); }#undef READ_GPR#undef WRITE_GPR#undef RESET_CR0SO#undef SET_CR0SO#undef MEM_READ_BYTE#undef MEM_WRITE_BYTE#undef MEM_READ_HALF_WORD#undef MEM_WRITE_HALF_WORD#undef MEM_READ_WORD#undef MEM_WRITE_WORD#undef MEM_READ_DWORD#undef MEM_WRITE_DWORD#undef MEM_SET#undef MEM_READ#undef MEM_WRITE#define READ_GPR(n) cb->read_gpr(cb->instance, n)#define WRITE_GPR(n, v) cb->write_gpr(cb->instance, n, v)#define RESET_CR0SO cb->reset_cr0so(cb->instance)#define SET_CR0SO cb->set_cr0so(cb->instance)#define MEM_READ_BYTE(addr) cb->mem_read_byte(cb->instance, addr)#define MEM_WRITE_BYTE(addr, value) cb->mem_write_byte(cb->instance, addr, value)#define MEM_READ_HALF_WORD(addr) cb->mem_read_half_word(cb->instance, addr)#define MEM_WRITE_HALF_WORD(addr, value) cb->mem_write_half_word(cb->instance, addr, value)#define MEM_READ_WORD(addr) cb->mem_read_word(cb->instance, addr)#define MEM_WRITE_WORD(addr, value) cb->mem_write_word(cb->instance, addr, value)#define MEM_READ_DWORD(addr) cb->mem_read_dword(cb->instance, addr)#define MEM_WRITE_DWORD(addr, value) cb->mem_write_dword(cb->instance, addr, value)#define MEM_SET(addr, value, size) cb->mem_set(cb->instance, addr, value, size)#define MEM_READ(buf, addr, size) cb->mem_read(cb->instance, buf, addr, size)#define MEM_WRITE(addr, buf, size) cb->mem_write(cb->instance, addr, buf, size)#define STRLEN(addr) my_strlen(cb, addr)#define PARM(i) READ_GPR(3+(i))#define RETURN(x) WRITE_GPR(3, (x))#define SYSCALL_NUM READ_GPR(0)static void ppc_swap(void *buf, int count){	if(count > 0)	{		char temp[8];		char *src = (char *) buf + count - 1;		char *dst = temp;				do		{			*dst = *src;		} while(src--, dst++, --count);	}}static int my_strlen(syscall_cb_t *cb, addr_t addr){	int len = 0;	char buffer[32];		while(1)	{		int size = sizeof(buffer);		char *p = buffer;		MEM_READ(buffer, addr, size);		while(size > 0)		{			if(*p == 0) return len;			len++;			size--;			p++;		}		addr += sizeof(buffer);	}}BOOL ppc_syscall_exit(syscall_cb_t *cb){	int ret = PARM(0);	if(verbose)		fprintf(stderr, "exit(%d)\n", ret);	if(debuging)	{		debuging = FALSE;	}	else	{		if(running)			running = FALSE;		else			exit_proc(ret);	}	return TRUE;}BOOL ppc_syscall_fork(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_read(syscall_cb_t *cb){	int fd;	size_t count;	addr_t buf_addr;	void *buf;	size_t ret;		fd = PARM(0);	buf_addr = PARM(1);	count = (size_t) PARM(2);	buf = malloc(count);	if(verbose)		fprintf(stderr, "read(fd=%d, buf=0x%08x, count=%d)\n", fd, buf_addr, count);			if(buf)	{		ret = read(fd, buf, count);		if(ret > 0) MEM_WRITE(buf_addr, buf, ret);		free(buf);	}	else	{		ret = -1;	}	RETURN(ret);	return ret != (size_t) -1;}BOOL ppc_syscall_write(syscall_cb_t *cb){	int fd;	size_t count;	void *buf;	addr_t buf_addr;	size_t ret;		fd = PARM(0);	buf_addr = PARM(1);	count = (size_t) PARM(2);	if(verbose)		fprintf(stderr, "write(fd=%d, buf=0x%08x, count=%d)\n", fd, buf_addr, count);	buf = malloc(count);	if(buf)	{		MEM_READ(buf, buf_addr, count);		ret = write(fd, buf, count);		free(buf);	}	else	{		ret = -1;	}	RETURN(ret);	return ret != (size_t) -1;}BOOL ppc_syscall_open(syscall_cb_t *cb){	addr_t addr;	int pathnamelen;	char *pathname;	int flags;	mode_t mode;	int ret;		addr = PARM(0);	pathnamelen = STRLEN(addr);	pathname = (char *) malloc(pathnamelen + 1);	MEM_READ(pathname, addr, pathnamelen + 1);	flags = PARM(1);	mode = PARM(2);	if(verbose)		fprintf(stderr, "open(pathname=\"%s\", flags=%d, mode=%d)\n", pathname, flags, mode);	ret = open(pathname, flags, mode);	free(pathname);	RETURN(ret);	return ret != -1;}BOOL ppc_syscall_close(syscall_cb_t *cb){	int fd;	int ret;		fd = PARM(0);	if(verbose)		fprintf(stderr, "close(fd=%d)\n", fd);	ret = close(fd);	RETURN(ret);	return ret != -1;}BOOL ppc_syscall_waitpid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_creat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_link(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_unlink(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_execve(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_chdir(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_time(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mknod(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_chmod(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_lchown(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_break(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_oldstat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_lseek(syscall_cb_t *cb){	int fildes;	off_t offset;	int whence;	off_t ret;		fildes = PARM(0);	offset = PARM(1);	whence = PARM(2);	if(verbose)		fprintf(stderr, "lseek(fd=%d, offset=%lu, whence=%d)\n", fildes, offset, whence);	ret = lseek(fildes, offset, whence);	RETURN(ret);	return ret != -1;}BOOL ppc_syscall_getpid(syscall_cb_t *cb){	pid_t pid;		if(verbose)		fprintf(stderr, "getpid()\n");	pid = getpid();	RETURN(pid);	return TRUE;}BOOL ppc_syscall_mount(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_umount(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setuid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getuid(syscall_cb_t *cb){	uid_t uid;		if(verbose)		fprintf(stderr, "getuid()\n");	uid = getuid();	RETURN(uid);	return TRUE;}BOOL ppc_syscall_stime(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ptrace(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_alarm(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_oldfstat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_pause(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_utime(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_stty(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_gtty(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_access(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_nice(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ftime(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sync(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_kill(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rename(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mkdir(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_rmdir(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_dup(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_pipe(syscall_cb_t *cb) { RETURN(-1); return FALSE; }static void ppc_swap_tms(struct tms *buf){	ppc_swap(&buf->tms_utime, sizeof(&buf->tms_utime));	ppc_swap(&buf->tms_stime, sizeof(&buf->tms_stime));	ppc_swap(&buf->tms_cutime, sizeof(&buf->tms_cutime));	ppc_swap(&buf->tms_cstime, sizeof(&buf->tms_cstime));}BOOL ppc_syscall_times(syscall_cb_t *cb){	addr_t buf_addr;	struct tms buf;	clock_t ret;		ret = times(&buf);		if(swap) ppc_swap_tms(&buf);	buf_addr = PARM(0);	MEM_WRITE(buf_addr, &buf, sizeof(struct tms));	RETURN(ret);	return ret != (clock_t) -1;}BOOL ppc_syscall_prof(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_brk(syscall_cb_t *cb){	word_t new_brk_point;	BOOL success;		new_brk_point = PARM(0);	success = TRUE;//FALSE;	if(verbose)		fprintf(stderr, "brk(end=0x%08x)\n", new_brk_point);	if(new_brk_point > brk_point)	{		brk_point = new_brk_point;		success = TRUE;	}		RETURN(brk_point);	return success;}BOOL ppc_syscall_setgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getgid(syscall_cb_t *cb){	gid_t gid;	if(verbose)		fprintf(stderr, "getgid()\n");	gid = getgid();	RETURN(gid);	return TRUE;}BOOL ppc_syscall_signal(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_geteuid(syscall_cb_t *cb){	uid_t uid;		if(verbose)		fprintf(stderr, "geteuid()\n");	uid = geteuid();	RETURN(uid);	return TRUE;}BOOL ppc_syscall_getegid(syscall_cb_t *cb){	gid_t gid;		if(verbose)		fprintf(stderr, "getegid()\n");	gid = getegid();	RETURN(gid);	return TRUE;}BOOL ppc_syscall_acct(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_umount2(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_lock(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ioctl(syscall_cb_t *cb) { 	RETURN(-1); return FALSE; }BOOL ppc_syscall_fcntl(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_mpx(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setpgid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ulimit(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_oldolduname(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_umask(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_chroot(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ustat(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_dup2(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getppid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getpgrp(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setsid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigaction(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sgetmask(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_ssetmask(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setreuid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setregid(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigsuspend(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sigpending(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_sethostname(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_setrlimit(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getrlimit(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_getrusage(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_gettimeofday(syscall_cb_t *cb) { RETURN(-1); return FALSE; }BOOL ppc_syscall_settimeofday(syscall_cb_t *cb) { RETURN(-1); return FALSE; }

⌨️ 快捷键说明

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