123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include <mach.h>
- #define Extern extern
- #include "mips.h"
- #define REGSP 29
- #define REGRET 1
- #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",
- [MOUNT] "Mount",
- [AWAIT] "Await",
- [PREAD] "Pread",
- [PWRITE] "Pwrite",
- };
- void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
- void
- sys_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;
-
- }
- void
- syserrstr(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;
-
- }
- void
- sysfd2path(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;
-
- }
- void
- sysbind(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;
- }
- void
- syschdir(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;
- }
- void
- sysclose(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;
- }
- void
- sysdup(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;
- }
- void
- sysexits(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");
- }
- void
- sysopen(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;
- };
- void
- sysread(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;
- }
- void
- sys_read(void)
- {
- sysread(-1LL);
- }
- void
- syspread(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);
- }
- void
- sysseek(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);
- }
- void
- sysoseek(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;
- }
- void
- sysrfork(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);
- }
- void
- syssleep(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;
- }
- void
- sys_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;
- }
- void
- sysstat(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;
- }
- void
- sys_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;
- }
- void
- sysfstat(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;
- }
- void
- syswrite(vlong offset)
- {
- int fd;
- ulong size, a;
- char *buf;
- int n;
- fd = getmem_w(reg.r[REGSP]+4);
- a = getmem_w(reg.r[REGSP]+8);
- size = getmem_w(reg.r[REGSP]+12);
- Bflush(bioout);
- buf = memio(0, a, size, MemRead);
- n = pwrite(fd, buf, size, offset);
- if(n < 0)
- errstr(errbuf, sizeof errbuf);
- if(sysdbg)
- itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
- free(buf);
- reg.r[REGRET] = n;
- }
- void
- sys_write(void)
- {
- syswrite(-1LL);
- }
- void
- syspwrite(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);
- syswrite(o.v);
- }
- void
- syspipe(void)
- {
- int n, p[2];
- ulong fd;
- fd = getmem_w(reg.r[REGSP]+4);
- if(sysdbg)
- itrace("pipe(%lux)", fd);
- n = pipe(p);
- if(n < 0)
- errstr(errbuf, sizeof errbuf);
- else {
- putmem_w(fd, p[0]);
- putmem_w(fd+4, p[1]);
- }
- reg.r[REGRET] = n;
- }
- void
- syscreate(void)
- {
- char file[1024];
- int n;
- ulong mode, name, perm;
- name = getmem_w(reg.r[REGSP]+4);
- mode = getmem_w(reg.r[REGSP]+8);
- perm = getmem_w(reg.r[REGSP]+12);
- memio(file, name, sizeof(file), MemReadstring);
- if(sysdbg)
- itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
-
- n = create(file, mode, perm);
- if(n < 0)
- errstr(errbuf, sizeof errbuf);
- reg.r[REGRET] = n;
- }
- void
- sysbrk_(void)
- {
- ulong addr, osize, nsize;
- Segment *s;
- addr = getmem_w(reg.r[REGSP]+4);
- if(sysdbg)
- itrace("brk_(0x%lux)", addr);
- reg.r[REGRET] = -1;
- if(addr < memory.seg[Data].base+datasize) {
- strcpy(errbuf, "address below segment");
- return;
- }
- if(addr > memory.seg[Stack].base) {
- strcpy(errbuf, "segment too big");
- return;
- }
- s = &memory.seg[Bss];
- if(addr > s->end) {
- osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
- addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
- s->end = addr;
- nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
- s->table = erealloc(s->table, osize, nsize);
- }
- reg.r[REGRET] = 0;
- }
- void
- sysremove(void)
- {
- char nambuf[1024];
- ulong name;
- int n;
- name = getmem_w(reg.r[REGSP]+4);
- memio(nambuf, name, sizeof(nambuf), MemReadstring);
- if(sysdbg)
- itrace("remove(0x%lux='%s')", name, nambuf);
- n = remove(nambuf);
- if(n < 0)
- errstr(errbuf, sizeof errbuf);
- reg.r[REGRET] = n;
- }
- void
- sysnotify(void)
- {
- nofunc = getmem_w(reg.r[REGSP]+4);
- if(sysdbg)
- itrace("notify(0x%lux)\n", nofunc);
- reg.r[REGRET] = 0;
- }
- void
- syssegflush(void)
- {
- int n;
- ulong va;
- va = getmem_w(reg.r[REGSP]+4);
- n = getmem_w(reg.r[REGSP]+8);
- if(sysdbg)
- itrace("segflush(va=0x%lux, n=%d)\n", va, n);
- reg.r[REGRET] = 0;
- }
- void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
- void sysfsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
- void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
- void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
- void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void _sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
- void (*systab[])(void) ={
- [SYSR1] sys1,
- [_ERRSTR] sys_errstr,
- [BIND] sysbind,
- [CHDIR] syschdir,
- [CLOSE] sysclose,
- [DUP] sysdup,
- [ALARM] sysalarm,
- [EXEC] sysexec,
- [EXITS] sysexits,
- [_FSESSION] sysfsession,
- [FAUTH] sysfauth,
- [_FSTAT] sys_fstat,
- [SEGBRK] syssegbrk,
- [_MOUNT] _sysmount,
- [OPEN] sysopen,
- [_READ] sys_read,
- [OSEEK] sysoseek,
- [SLEEP] syssleep,
- [_STAT] sys_stat,
- [RFORK] sysrfork,
- [_WRITE] sys_write,
- [PIPE] syspipe,
- [CREATE] syscreate,
- [FD2PATH] sysfd2path,
- [BRK_] sysbrk_,
- [REMOVE] sysremove,
- [_WSTAT] sys_wstat,
- [_FWSTAT] sys_fwstat,
- [NOTIFY] sysnotify,
- [NOTED] sysnoted,
- [SEGATTACH] syssegattach,
- [SEGDETACH] syssegdetach,
- [SEGFREE] syssegfree,
- [SEGFLUSH] syssegflush,
- [RENDEZVOUS] sysrendezvous,
- [UNMOUNT] sysunmount,
- [_WAIT] syswait,
- [SEEK] sysseek,
- [FVERSION] sysfversion,
- [ERRSTR] syserrstr,
- [STAT] sysstat,
- [FSTAT] sysfstat,
- [WSTAT] syswstat,
- [FWSTAT] sysfwstat,
- [MOUNT] sysmount,
- [AWAIT] sysawait,
- [PREAD] syspread,
- [PWRITE] syspwrite,
- };
- void
- Ssyscall(ulong inst)
- {
- int call;
- USED(inst);
- call = reg.r[REGRET];
- if(call < 0 || call > PWRITE || systab[call] == nil) {
- Bprint(bioout, "Bad system call\n");
- dumpreg();
- }
- if(trace)
- itrace("sysc\t%s", sysctab[call]);
- (*systab[call])();
- Bflush(bioout);
- }
|