13 #define ODIRLEN 116 /* compatibility; used in _stat etc. */
14 #define OERRLEN 64 /* compatibility; used in _stat etc. */
19 #include "/sys/src/libc/9syscall/sys.h"
31 [_FSESSION] "_Fsession",
52 [SEGATTACH] "Segattach",
53 [SEGDETACH] "Segdetach",
55 [SEGFLUSH] "Segflush",
56 [RENDEZVOUS] "Rendezvous",
60 [FVERSION] "Fversion",
72 void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
80 str = getmem_w(reg.r[REGSP]+4);
82 itrace("errstr(0x%lux)", str);
84 memio(tmp, str, OERRLEN, MemRead);
85 memio(errbuf, str, OERRLEN, MemWrite);
86 memmove(errbuf, tmp, OERRLEN);
87 errbuf[OERRLEN-1] = 0;
98 str = getmem_w(reg.r[REGSP]+4);
99 n = getmem_w(reg.r[REGSP]+8);
101 itrace("errstr(0x%lux, 0x%lux)", str, n);
103 if(n > strlen(errbuf)+1)
104 n = strlen(errbuf)+1;
107 memio(tmp, str, n, MemRead);
108 memio(errbuf, str, n, MemWrite);
109 memmove(errbuf, tmp, n);
110 errbuf[ERRMAX-1] = 0;
123 fd = getmem_w(reg.r[REGSP]+4);
124 str = getmem_w(reg.r[REGSP]+8);
125 n = getmem_w(reg.r[REGSP]+12);
127 itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
130 strcpy(errbuf, "buffer too big");
133 n = fd2path(fd, buf, sizeof buf);
135 errstr(buf, sizeof buf);
137 memio(errbuf, str, n, MemWrite);
145 ulong pname, pold, flags;
146 char name[1024], old[1024];
149 pname = getmem_w(reg.r[REGSP]+4);
150 pold = getmem_w(reg.r[REGSP]+8);
151 flags = getmem_w(reg.r[REGSP]+12);
152 memio(name, pname, sizeof(name), MemReadstring);
153 memio(old, pold, sizeof(old), MemReadstring);
155 itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, old, flags);
157 n = bind(name, old, flags);
159 errstr(errbuf, sizeof errbuf);
171 name = getmem_w(reg.r[REGSP]+4);
172 memio(file, name, sizeof(file), MemReadstring);
174 itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
178 errstr(errbuf, sizeof errbuf);
189 fd = getmem_w(reg.r[REGSP]+4);
191 itrace("close(%d)", fd);
195 errstr(errbuf, sizeof errbuf);
205 oldfd = getmem_w(reg.r[REGSP]+4);
206 newfd = getmem_w(reg.r[REGSP]+8);
208 itrace("dup(%d, %d)", oldfd, newfd);
210 n = dup(oldfd, newfd);
212 errstr(errbuf, sizeof errbuf);
222 str = getmem_w(reg.r[REGSP]+4);
224 itrace("exits(0x%lux)", str);
228 memio(buf, str, sizeof buf, MemRead);
230 Bprint(bioout, "exits(%s)\n", buf);
233 Bprint(bioout, "exits(0)\n");
243 name = getmem_w(reg.r[REGSP]+4);
244 mode = getmem_w(reg.r[REGSP]+8);
245 memio(file, name, sizeof(file), MemReadstring);
247 itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);
249 n = open(file, mode);
251 errstr(errbuf, sizeof errbuf);
257 sysread(vlong offset)
264 fd = getmem_w(reg.r[REGSP]+4);
265 a = getmem_w(reg.r[REGSP]+8);
266 size = getmem_w(reg.r[REGSP]+12);
286 n = pread(fd, buf, size, offset);
289 errstr(errbuf, sizeof errbuf);
291 memio(buf, a, n, MemWrite);
294 itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
314 o.u[0] = getmem_w(reg.r[REGSP]+16);
315 o.u[1] = getmem_w(reg.r[REGSP]+20);
330 retp = getmem_w(reg.r[REGSP]+4);
331 fd = getmem_w(reg.r[REGSP]+8);
332 o.u[0] = getmem_w(reg.r[REGSP]+12);
333 o.u[1] = getmem_w(reg.r[REGSP]+16);
334 mode = getmem_w(reg.r[REGSP]+20);
336 itrace("seek(%d, %lld, %d)", fd, o.v, mode);
338 o.v = seek(fd, o.v, mode);
340 errstr(errbuf, sizeof errbuf);
342 memio((char*)o.u, retp, sizeof(vlong), MemWrite);
351 fd = getmem_w(reg.r[REGSP]+4);
352 off = getmem_w(reg.r[REGSP]+8);
353 mode = getmem_w(reg.r[REGSP]+12);
355 itrace("seek(%d, %lud, %d)", fd, off, mode);
357 n = seek(fd, off, mode);
359 errstr(errbuf, sizeof errbuf);
369 flag = getmem_w(reg.r[REGSP]+4);
371 itrace("rfork(%d)", flag);
373 Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);
376 reg.r[REGRET] = rfork(flag);
385 len = getmem_w(reg.r[REGSP]+4);
387 itrace("sleep(%d)", len);
391 errstr(errbuf, sizeof errbuf);
402 extern int _stat(char*, char*); /* old system call */
405 name = getmem_w(reg.r[REGSP]+4);
406 edir = getmem_w(reg.r[REGSP]+8);
407 memio(nambuf, name, sizeof(nambuf), MemReadstring);
409 itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
411 n = _stat(nambuf, buf);
413 errstr(errbuf, sizeof errbuf);
415 memio(buf, edir, ODIRLEN, MemWrite);
428 name = getmem_w(reg.r[REGSP]+4);
429 edir = getmem_w(reg.r[REGSP]+8);
430 n = getmem_w(reg.r[REGSP]+12);
431 memio(nambuf, name, sizeof(nambuf), MemReadstring);
433 itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
435 errstr(errbuf, sizeof errbuf);
437 n = stat(nambuf, buf, n);
439 errstr(errbuf, sizeof errbuf);
441 memio((char*)buf, edir, n, MemWrite);
451 extern int _fstat(int, char*); /* old system call */
454 fd = getmem_w(reg.r[REGSP]+4);
455 edir = getmem_w(reg.r[REGSP]+8);
457 itrace("fstat(%d, 0x%lux)", fd, edir);
461 errstr(errbuf, sizeof errbuf);
463 memio(buf, edir, ODIRLEN, MemWrite);
475 fd = getmem_w(reg.r[REGSP]+4);
476 edir = getmem_w(reg.r[REGSP]+8);
477 n = getmem_w(reg.r[REGSP]+12);
479 itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
483 strcpy(errbuf, "stat buffer too big");
486 n = fstat(fd, buf, n);
488 errstr(errbuf, sizeof errbuf);
490 memio((char*)buf, edir, n, MemWrite);
495 syswrite(vlong offset)
502 fd = getmem_w(reg.r[REGSP]+4);
503 a = getmem_w(reg.r[REGSP]+8);
504 size = getmem_w(reg.r[REGSP]+12);
507 buf = memio(0, a, size, MemRead);
508 n = pwrite(fd, buf, size, offset);
510 errstr(errbuf, sizeof errbuf);
512 itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
532 o.u[0] = getmem_w(reg.r[REGSP]+16);
533 o.u[1] = getmem_w(reg.r[REGSP]+20);
543 fd = getmem_w(reg.r[REGSP]+4);
545 itrace("pipe(%lux)", fd);
549 errstr(errbuf, sizeof errbuf);
552 putmem_w(fd+4, p[1]);
562 ulong mode, name, perm;
564 name = getmem_w(reg.r[REGSP]+4);
565 mode = getmem_w(reg.r[REGSP]+8);
566 perm = getmem_w(reg.r[REGSP]+12);
567 memio(file, name, sizeof(file), MemReadstring);
569 itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
571 n = create(file, mode, perm);
573 errstr(errbuf, sizeof errbuf);
581 ulong addr, osize, nsize;
584 addr = getmem_w(reg.r[REGSP]+4);
586 itrace("brk_(0x%lux)", addr);
589 if(addr < memory.seg[Data].base+datasize) {
590 strcpy(errbuf, "address below segment");
593 if(addr > memory.seg[Stack].base) {
594 strcpy(errbuf, "segment too big");
597 s = &memory.seg[Bss];
599 osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
600 addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
602 nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
603 s->table = erealloc(s->table, osize, nsize);
616 name = getmem_w(reg.r[REGSP]+4);
617 memio(nambuf, name, sizeof(nambuf), MemReadstring);
619 itrace("remove(0x%lux='%s')", name, nambuf);
623 errstr(errbuf, sizeof errbuf);
630 nofunc = getmem_w(reg.r[REGSP]+4);
632 itrace("notify(0x%lux)", nofunc);
642 start = getmem_w(reg.r[REGSP]+4);
643 len = getmem_w(reg.r[REGSP]+8);
645 itrace("segflush(va=0x%lux, n=%lud)", start, len);
649 void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
650 void sysfsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
651 void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
652 void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
653 void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
654 void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
655 void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
656 void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
657 void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
658 void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
659 void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
660 void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
661 void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
662 void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
663 void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
664 void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
665 void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
666 void _sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
667 void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
668 void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
669 void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
670 void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
672 void (*systab[])(void) ={
674 [_ERRSTR] sys_errstr,
682 [_FSESSION] sysfsession,
696 [FD2PATH] sysfd2path,
700 [_FWSTAT] sys_fwstat,
703 [SEGATTACH] syssegattach,
704 [SEGDETACH] syssegdetach,
705 [SEGFREE] syssegfree,
706 [SEGFLUSH] syssegflush,
707 [RENDEZVOUS] sysrendezvous,
708 [UNMOUNT] sysunmount,
711 [FVERSION] sysfversion,
728 if(inst != ((17<<26)|2))
730 call = reg.r[REGRET];
731 if(call < 0 || call > PWRITE || systab[call] == nil) {
732 Bprint(bioout, "Bad system call\n");
736 itrace("sc\t(%s)", sysctab[call]);