738 lines · 14.2 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include <u.h>#include <libc.h>#include <bio.h>#include <mach.h>#define Extern extern#include "sparc.h" #define	REGSP	1#define	REGRET	7  #define	ODIRLEN	116	/* compatibility; used in _stat etc. */#define	OERRLEN	64	/* compatibility; used in _stat etc. */ char 	errbuf[ERRMAX];ulong	nofunc; #include "/sys/src/libc/9syscall/sys.h" char *sysctab[]={	[SYSR1]		"SYSR1",	[_ERRSTR]		"_errstr",	[BIND]		"Bind",	[CHDIR]		"Chdir",	[CLOSE]		"Close",	[DUP]		"Dup",	[ALARM]		"Alarm",	[EXEC]		"Exec",	[EXITS]		"Exits",	[_FSESSION]	"_Fsession",	[FAUTH]		"Fauth",	[_FSTAT]		"_fstat",	[SEGBRK]		"Segbrk",	[MOUNT]		"Mount",	[OPEN]		"Open",	[_READ]		"_Read",	[OSEEK]		"Oseek",	[SLEEP]		"Sleep",	[_STAT]		"_Stat",	[RFORK]		"Rfork",	[_WRITE]		"_Write",	[PIPE]		"Pipe",	[CREATE]		"Create",	[FD2PATH]	"Fd2path",	[BRK_]		"Brk_",	[REMOVE]		"Remove",	[_WSTAT]		"_Wstat",	[_FWSTAT]	"_Fwstat",	[NOTIFY]		"Notify",	[NOTED]		"Noted",	[SEGATTACH]	"Segattach",	[SEGDETACH]	"Segdetach",	[SEGFREE]		"Segfree",	[SEGFLUSH]	"Segflush",	[RENDEZVOUS]	"Rendezvous",	[UNMOUNT]	"Unmount",	[_WAIT]		"_Wait",	[SEEK]		"Seek",	[FVERSION]	"Fversion",	[ERRSTR]		"Errstr",	[STAT]		"Stat",	[FSTAT]		"Fstat",	[WSTAT]		"Wstat",	[FWSTAT]		"Fwstat",	[PREAD]		"Pread",	[PWRITE]		"Pwrite",	[AWAIT]		"Await",}; void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); } voidsys_errstr(void){	ulong str; 	str = getmem_w(reg.r[REGSP]+4);	if(sysdbg)		itrace("errstr(0x%lux)", str); 	memio(errbuf, str, OERRLEN, MemWrite);	strcpy(errbuf, "no error");	reg.r[REGRET] = 0;	} voidsyserrstr(void){	ulong str;	uint n; 	str = getmem_w(reg.r[REGSP]+4);	n = getmem_w(reg.r[REGSP]+8);	if(sysdbg)		itrace("errstr(0x%lux, 0x%lux)", str, n); 	if(n > strlen(errbuf)+1)		n = strlen(errbuf)+1;	memio(errbuf, str, n, MemWrite);	strcpy(errbuf, "no error");	reg.r[REGRET] = n;	} voidsysfd2path(void){	int n;	uint fd;	ulong str;	char buf[1024]; 	fd = getmem_w(reg.r[REGSP]+4);	str = getmem_w(reg.r[REGSP]+8);	n = getmem_w(reg.r[REGSP]+12);	if(sysdbg)		itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);	reg.r[REGRET] = -1;	if(n > sizeof buf){		strcpy(errbuf, "buffer too big");		return;	}	n = fd2path(fd, buf, sizeof buf);	if(n < 0)		errstr(buf, sizeof buf);	else		memio(errbuf, str, n, MemWrite);	reg.r[REGRET] = n;	} voidsysbind(void){	ulong pname, pold, flags;	char name[1024], old[1024];	int n; 	pname = getmem_w(reg.r[REGSP]+4);	pold = getmem_w(reg.r[REGSP]+8);	flags = getmem_w(reg.r[REGSP]+12);	memio(name, pname, sizeof(name), MemReadstring);	memio(old, pold, sizeof(old), MemReadstring);	if(sysdbg)		itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, name, old, old, flags); 	n = bind(name, old, flags);	if(n < 0)		errstr(errbuf, sizeof errbuf); 	reg.r[REGRET] = n;} voidsyschdir(void){ 	char file[1024];	int n;	ulong name; 	name = getmem_w(reg.r[REGSP]+4);	memio(file, name, sizeof(file), MemReadstring);	if(sysdbg)		itrace("chdir(0x%lux='%s', 0x%lux)", name, file);		n = chdir(file);	if(n < 0)		errstr(errbuf, sizeof errbuf); 	reg.r[REGRET] = n;} voidsysclose(void){	int n;	ulong fd; 	fd = getmem_w(reg.r[REGSP]+4);	if(sysdbg)		itrace("close(%d)", fd); 	n = close(fd);	if(n < 0)		errstr(errbuf, sizeof errbuf);	reg.r[REGRET] = n;} voidsysdup(void){	int oldfd, newfd;	int n; 	oldfd = getmem_w(reg.r[REGSP]+4);	newfd = getmem_w(reg.r[REGSP]+8);	if(sysdbg)		itrace("dup(%d, %d)", oldfd, newfd); 	n = dup(oldfd, newfd);	if(n < 0)		errstr(errbuf, sizeof errbuf);	reg.r[REGRET] = n;} voidsysexits(void){	char buf[OERRLEN];	ulong str; 	str = getmem_w(reg.r[REGSP]+4);	if(sysdbg)		itrace("exits(0x%lux)", str); 	count = 1;	if(str != 0) {		memio(buf, str, sizeof buf, MemRead);		Bprint(bioout, "exits(%s)\n", buf);	}	else		Bprint(bioout, "exits(0)\n");} voidsysopen(void){	char file[1024];	int n;	ulong mode, name; 	name = getmem_w(reg.r[REGSP]+4);	mode = getmem_w(reg.r[REGSP]+8);	memio(file, name, sizeof(file), MemReadstring);	if(sysdbg)		itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);		n = open(file, mode);	if(n < 0)		errstr(errbuf, sizeof errbuf); 	reg.r[REGRET] = n;}; voidsysread(vlong offset){	int fd;	ulong size, a;	char *buf, *p;	int n, cnt, c; 	fd = getmem_w(reg.r[REGSP]+4);	a = getmem_w(reg.r[REGSP]+8);	size = getmem_w(reg.r[REGSP]+12); 	buf = emalloc(size);	if(fd == 0) {		print("\nstdin>>");		p = buf;		n = 0;		cnt = size;		while(cnt) {			c = Bgetc(bin);			if(c <= 0)				break;			*p++ = c;			n++;			cnt--;			if(c == '\n')				break;		}	}	else		n = pread(fd, buf, size, offset); 	if(n < 0)		errstr(errbuf, sizeof errbuf);	else		memio(buf, a, n, MemWrite); 	if(sysdbg)		itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n); 	free(buf);	reg.r[REGRET] = n;} voidsys_read(void){	sysread(-1LL);} voidsyspread(void){	union {		vlong v;		ulong u[2];	} o; 	o.u[0] = getmem_w(reg.r[REGSP]+16);	o.u[1] = getmem_w(reg.r[REGSP]+20);	sysread(o.v);} voidsysseek(void){	int fd;	ulong mode;	ulong retp;	union {		vlong v;		ulong u[2];	} o; 	retp = getmem_w(reg.r[REGSP]+4);	fd = getmem_w(reg.r[REGSP]+8);	o.u[0] = getmem_w(reg.r[REGSP]+12);	o.u[1] = getmem_w(reg.r[REGSP]+16);	mode = getmem_w(reg.r[REGSP]+20);	if(sysdbg)		itrace("seek(%d, %lld, %d)", fd, o.v, mode); 	o.v = seek(fd, o.v, mode);	if(o.v < 0)		errstr(errbuf, sizeof errbuf);	 	memio((char*)o.u, retp, sizeof(vlong), MemWrite);} voidsysoseek(void){	int fd, n;	ulong off, mode; 	fd = getmem_w(reg.r[REGSP]+4);	off = getmem_w(reg.r[REGSP]+8);	mode = getmem_w(reg.r[REGSP]+12);	if(sysdbg)		itrace("seek(%d, %lud, %d)", fd, off, mode); 	n = seek(fd, off, mode);	if(n < 0)		errstr(errbuf, sizeof errbuf);	 	reg.r[REGRET] = n;} voidsysrfork(void){	int flag; 	flag = getmem_w(reg.r[REGSP]+4);	if(sysdbg)		itrace("rfork(%d)", flag);	if(flag & RFPROC) {		Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);		exits(0);	}	reg.r[REGRET] = rfork(flag);} voidsyssleep(void){	ulong len;	int n; 	len = getmem_w(reg.r[REGSP]+4);	if(sysdbg)		itrace("sleep(%d)", len); 	n = sleep(len);	if(n < 0)		errstr(errbuf, sizeof errbuf);	 	reg.r[REGRET] = n;} voidsys_stat(void){	char nambuf[1024];	char buf[ODIRLEN];	ulong edir, name;	extern int _stat(char*, char*);	/* old system call */	int n; 	name = getmem_w(reg.r[REGSP]+4);	edir = getmem_w(reg.r[REGSP]+8);	memio(nambuf, name, sizeof(nambuf), MemReadstring);	if(sysdbg)		itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir); 	n = _stat(nambuf, buf);	if(n < 0)		errstr(errbuf, sizeof errbuf);	else		memio(buf, edir, ODIRLEN, MemWrite); 	reg.r[REGRET] = n;} voidsysstat(void){	char nambuf[1024];	uchar buf[STATMAX];	ulong edir, name;	int n; 	name = getmem_w(reg.r[REGSP]+4);	edir = getmem_w(reg.r[REGSP]+8);	n = getmem_w(reg.r[REGSP]+12);	memio(nambuf, name, sizeof(nambuf), MemReadstring);	if(sysdbg)		itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);	if(n > sizeof buf)		errstr(errbuf, sizeof errbuf);	else{			n = stat(nambuf, buf, n);		if(n < 0)			errstr(errbuf, sizeof errbuf);		else			memio((char*)buf, edir, n, MemWrite);	}	reg.r[REGRET] = n;} voidsys_fstat(void){	char buf[ODIRLEN];	ulong edir;	extern int _fstat(int, char*);	/* old system call */	int n, fd; 	fd = getmem_w(reg.r[REGSP]+4);	edir = getmem_w(reg.r[REGSP]+8);	if(sysdbg)		itrace("fstat(%d, 0x%lux)", fd, edir); 	n = _fstat(fd, buf);	if(n < 0)		errstr(errbuf, sizeof errbuf);	else		memio(buf, edir, ODIRLEN, MemWrite); 	reg.r[REGRET] = n;} voidsysfstat(void){	uchar buf[STATMAX];	ulong edir;	int n, fd; 	fd = getmem_w(reg.r[REGSP]+4);	edir = getmem_w(reg.r[REGSP]+8);	n = getmem_w(reg.r[REGSP]+12);	if(sysdbg)		itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n); 	reg.r[REGRET] = -1;	if(n > sizeof buf){		strcpy(errbuf, "stat buffer too big");		return;	}	n = fstat(fd, buf, n);	if(n < 0)		errstr(errbuf, sizeof errbuf);	else		memio((char*)buf, edir, n, MemWrite);	reg.r[REGRET] = n;} voidsyswrite(vlong offset){	int fd;	ulong size, a;	char *buf;	int n; 

Lines 1–500 of 738.