12 #define ODIRLEN 116 /* compatibility; used in _stat etc. */
13 #define OERRLEN 64 /* compatibility; used in _stat etc. */
18 #include "/sys/src/libc/9syscall/sys.h"
30 [_FSESSION] "_Fsession",
51 [SEGATTACH] "Segattach",
52 [SEGDETACH] "Segdetach",
54 [SEGFLUSH] "Segflush",
55 [RENDEZVOUS] "Rendezvous",
59 [FVERSION] "Fversion",
70 void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
77 str = getmem_w(reg.r[REGSP]+4);
79 itrace("errstr(0x%lux)", str);
81 memio(errbuf, str, OERRLEN, MemWrite);
82 strcpy(errbuf, "no error");
93 str = getmem_w(reg.r[REGSP]+4);
94 n = getmem_w(reg.r[REGSP]+8);
96 itrace("errstr(0x%lux, 0x%lux)", str, n);
98 if(n > strlen(errbuf)+1)
100 memio(errbuf, str, n, MemWrite);
101 strcpy(errbuf, "no error");
114 fd = getmem_w(reg.r[REGSP]+4);
115 str = getmem_w(reg.r[REGSP]+8);
116 n = getmem_w(reg.r[REGSP]+12);
118 itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
121 strcpy(errbuf, "buffer too big");
124 n = fd2path(fd, buf, sizeof buf);
126 errstr(buf, sizeof buf);
128 memio(errbuf, str, n, MemWrite);
136 ulong pname, pold, flags;
137 char name[1024], old[1024];
140 pname = getmem_w(reg.r[REGSP]+4);
141 pold = getmem_w(reg.r[REGSP]+8);
142 flags = getmem_w(reg.r[REGSP]+12);
143 memio(name, pname, sizeof(name), MemReadstring);
144 memio(old, pold, sizeof(old), MemReadstring);
146 itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, name, old, old, flags);
148 n = bind(name, old, flags);
150 errstr(errbuf, sizeof errbuf);
162 name = getmem_w(reg.r[REGSP]+4);
163 memio(file, name, sizeof(file), MemReadstring);
165 itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
169 errstr(errbuf, sizeof errbuf);
180 fd = getmem_w(reg.r[REGSP]+4);
182 itrace("close(%d)", fd);
186 errstr(errbuf, sizeof errbuf);
196 oldfd = getmem_w(reg.r[REGSP]+4);
197 newfd = getmem_w(reg.r[REGSP]+8);
199 itrace("dup(%d, %d)", oldfd, newfd);
201 n = dup(oldfd, newfd);
203 errstr(errbuf, sizeof errbuf);
213 str = getmem_w(reg.r[REGSP]+4);
215 itrace("exits(0x%lux)", str);
219 memio(buf, str, sizeof buf, MemRead);
220 Bprint(bioout, "exits(%s)\n", buf);
223 Bprint(bioout, "exits(0)\n");
233 name = getmem_w(reg.r[REGSP]+4);
234 mode = getmem_w(reg.r[REGSP]+8);
235 memio(file, name, sizeof(file), MemReadstring);
237 itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);
239 n = open(file, mode);
241 errstr(errbuf, sizeof errbuf);
247 sysread(vlong offset)
254 fd = getmem_w(reg.r[REGSP]+4);
255 a = getmem_w(reg.r[REGSP]+8);
256 size = getmem_w(reg.r[REGSP]+12);
276 n = pread(fd, buf, size, offset);
279 errstr(errbuf, sizeof errbuf);
281 memio(buf, a, n, MemWrite);
284 itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
304 o.u[0] = getmem_w(reg.r[REGSP]+16);
305 o.u[1] = getmem_w(reg.r[REGSP]+20);
320 retp = getmem_w(reg.r[REGSP]+4);
321 fd = getmem_w(reg.r[REGSP]+8);
322 o.u[0] = getmem_w(reg.r[REGSP]+12);
323 o.u[1] = getmem_w(reg.r[REGSP]+16);
324 mode = getmem_w(reg.r[REGSP]+20);
326 itrace("seek(%d, %lld, %d)", fd, o.v, mode);
328 o.v = seek(fd, o.v, mode);
330 errstr(errbuf, sizeof errbuf);
332 memio((char*)o.u, retp, sizeof(vlong), MemWrite);
341 fd = getmem_w(reg.r[REGSP]+4);
342 off = getmem_w(reg.r[REGSP]+8);
343 mode = getmem_w(reg.r[REGSP]+12);
345 itrace("seek(%d, %lud, %d)", fd, off, mode);
347 n = seek(fd, off, mode);
349 errstr(errbuf, sizeof errbuf);
359 flag = getmem_w(reg.r[REGSP]+4);
361 itrace("rfork(%d)", flag);
363 Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);
366 reg.r[REGRET] = rfork(flag);
375 len = getmem_w(reg.r[REGSP]+4);
377 itrace("sleep(%d)", len);
381 errstr(errbuf, sizeof errbuf);
392 extern int _stat(char*, char*); /* old system call */
395 name = getmem_w(reg.r[REGSP]+4);
396 edir = getmem_w(reg.r[REGSP]+8);
397 memio(nambuf, name, sizeof(nambuf), MemReadstring);
399 itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
401 n = _stat(nambuf, buf);
403 errstr(errbuf, sizeof errbuf);
405 memio(buf, edir, ODIRLEN, MemWrite);
418 name = getmem_w(reg.r[REGSP]+4);
419 edir = getmem_w(reg.r[REGSP]+8);
420 n = getmem_w(reg.r[REGSP]+12);
421 memio(nambuf, name, sizeof(nambuf), MemReadstring);
423 itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
425 errstr(errbuf, sizeof errbuf);
427 n = stat(nambuf, buf, n);
429 errstr(errbuf, sizeof errbuf);
431 memio((char*)buf, edir, n, MemWrite);
441 extern int _fstat(int, char*); /* old system call */
444 fd = getmem_w(reg.r[REGSP]+4);
445 edir = getmem_w(reg.r[REGSP]+8);
447 itrace("fstat(%d, 0x%lux)", fd, edir);
451 errstr(errbuf, sizeof errbuf);
453 memio(buf, edir, ODIRLEN, MemWrite);
465 fd = getmem_w(reg.r[REGSP]+4);
466 edir = getmem_w(reg.r[REGSP]+8);
467 n = getmem_w(reg.r[REGSP]+12);
469 itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
473 strcpy(errbuf, "stat buffer too big");
476 n = fstat(fd, buf, n);
478 errstr(errbuf, sizeof errbuf);
480 memio((char*)buf, edir, n, MemWrite);
485 syswrite(vlong offset)
492 fd = getmem_w(reg.r[REGSP]+4);
493 a = getmem_w(reg.r[REGSP]+8);
494 size = getmem_w(reg.r[REGSP]+12);
497 buf = memio(0, a, size, MemRead);
498 n = pwrite(fd, buf, size, offset);
500 errstr(errbuf, sizeof errbuf);
502 itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
522 o.u[0] = getmem_w(reg.r[REGSP]+16);
523 o.u[1] = getmem_w(reg.r[REGSP]+20);
533 fd = getmem_w(reg.r[REGSP]+4);
535 itrace("pipe(%lux)", fd);
539 errstr(errbuf, sizeof errbuf);
542 putmem_w(fd+4, p[1]);
552 ulong mode, name, perm;
554 name = getmem_w(reg.r[REGSP]+4);
555 mode = getmem_w(reg.r[REGSP]+8);
556 perm = getmem_w(reg.r[REGSP]+12);
557 memio(file, name, sizeof(file), MemReadstring);
559 itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
561 n = create(file, mode, perm);
563 errstr(errbuf, sizeof errbuf);
571 ulong addr, osize, nsize;
574 addr = getmem_w(reg.r[REGSP]+4);
576 itrace("brk_(0x%lux)", addr);
579 if(addr < memory.seg[Data].base+datasize) {
580 strcpy(errbuf, "address below segment");
583 if(addr > memory.seg[Stack].base) {
584 strcpy(errbuf, "segment too big");
587 s = &memory.seg[Bss];
589 osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
590 addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
592 nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
593 s->table = erealloc(s->table, osize, nsize);
606 name = getmem_w(reg.r[REGSP]+4);
607 memio(nambuf, name, sizeof(nambuf), MemReadstring);
609 itrace("remove(0x%lux='%s')", name, nambuf);
613 errstr(errbuf, sizeof errbuf);
620 nofunc = getmem_w(reg.r[REGSP]+4);
622 itrace("notify(0x%lux)\n", nofunc);
633 va = getmem_w(reg.r[REGSP]+4);
634 n = getmem_w(reg.r[REGSP]+8);
636 itrace("segflush(va=0x%lux, n=%d)\n", va, n);
641 void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
642 void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
643 void sys_fsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
644 void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
645 void sys_wait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
646 void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
647 void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
648 void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
649 void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
650 void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
651 void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
652 void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
653 void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
654 void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
655 void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
656 void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
657 void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
658 void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
659 void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
660 void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
661 void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
663 void (*systab[])(void) ={
665 [_ERRSTR] sys_errstr,
673 [_FSESSION] sys_fsession,
687 [FD2PATH] sysfd2path,
691 [_FWSTAT] sys_fwstat,
694 [SEGATTACH] syssegattach,
695 [SEGDETACH] syssegdetach,
696 [SEGFREE] syssegfree,
697 [SEGFLUSH] syssegflush,
698 [RENDEZVOUS] sysrendezvous,
699 [UNMOUNT] sysunmount,
702 [FVERSION] sysfversion,
719 call = reg.r[REGRET];
720 if(call < 0 || call > PWRITE || systab[call] == nil) {
721 Bprint(bioout, "Bad system call\n");
725 itrace("ta\t$0+R0\t%s", sysctab[call]);