6 #include </sys/src/libc/9syscall/sys.h>
11 /* no locking necessary, since we're on the stack */
12 return *(u32int*) vaddrnol(P->R[13] + 4 + 4 * n, 4);
18 return arg(n) | ((u64int)arg(n+1) << 32);
30 namet = copyifnec(name, -1, &copied);
32 fprint(2, "open(%#ux=\"%s\", %#o)\n", name, namet, flags);
33 fd = open(namet, flags);
41 setcexec(P->fd, fd, flags & OCEXEC);
48 u32int name, flags, perm;
55 namet = copyifnec(name, -1, &copied);
57 fprint(2, "create(%#ux=\"%s\", %#o, %o)\n", name, namet, flags, perm);
58 fd = create(namet, flags, perm);
66 setcexec(P->fd, fd, flags & OCEXEC);
77 fprint(2, "close(%d)\n", fd);
78 P->R[0] = noteerr(close(fd), 0);
79 if((fd & (1<<31)) == 0)
80 setcexec(P->fd, fd, 0);
96 fprint(2, "pread(%d, %#ux, %ud, %#ullx)\n", fd, buf, size, off);
97 targ = bufifnec(buf, size, &buffered);
98 P->R[0] = noteerr(pread(fd, targ, size, off), size);
100 copyback(buf, P->R[0], targ);
106 u32int fd, size, buf;
115 buft = copyifnec(buf, size, &copied);
117 fprint(2, "pwrite(%d, %#ux, %ud, %#ullx)\n", fd, buf, size, off);
118 P->R[0] = noteerr(pwrite(fd, buft, size, off), size);
130 ret = vaddr(arg(0), 8, &seg);
135 fprint(2, "seek(%d, %lld, %d)\n", fd, n, type);
136 *ret = seek(fd, n, type);
137 if(*ret < 0) noteerr(0, 1);
144 u32int fd, buf, nbuf;
151 buft = bufifnec(buf, nbuf, &buffered);
153 fprint(2, "fd2path(%d, %#ux, %d)\n", fd, buf, nbuf);
154 P->R[0] = noteerr(fd2path(fd, buft, nbuf), 0);
156 copyback(buf, nbuf, buft);
162 u32int name, edir, nedir;
165 int copied, buffered;
168 namet = copyifnec(name, -1, &copied);
171 edirt = bufifnec(edir, nedir, &buffered);
173 fprint(2, "stat(%#ux=\"%s\", %#ux, %ud)\n", name, namet, edir, nedir);
174 P->R[0] = noteerr(stat(namet, edirt, nedir), nedir);
178 copyback(edir, P->R[0], edirt);
184 u32int fd, edir, nedir;
191 edirt = bufifnec(edir, nedir, &buffered);
193 fprint(2, "fstat(%d, %#ux, %d)\n", fd, edir, nedir);
194 P->R[0] = noteerr(fstat(fd, edirt, nedir), nedir);
196 copyback(edir, P->R[0], edirt);
202 u32int name, edir, nedir;
208 namet = copyifnec(name, -1, &copied);
211 edirt = copyifnec(edir, nedir, &copied2);
213 fprint(2, "wstat(%#ux=\"%s\", %#ux, %ud)\n", name, namet, edir, nedir);
214 P->R[0] = noteerr(wstat(namet, edirt, nedir), nedir);
224 u32int fd, edir, nedir;
231 edirt = copyifnec(edir, nedir, &copied);
233 fprint(2, "fwstat(%d, %#ux, %d)\n", fd, edir, nedir);
234 P->R[0] = noteerr(fwstat(fd, edirt, nedir), nedir);
245 exits(vaddrnol(arg(0), 0));
256 fprint(2, "brk(%#lux)\n", v);
257 if(v >= P->S[SEGSTACK]->start)
258 sysfatal("bss > stack, wtf?");
259 if(v < P->S[SEGBSS]->start)
260 sysfatal("bss length < 0, wtf?");
263 s->dref = realloc(s->dref, v - s->start + sizeof(Ref));
265 sysfatal("error reallocating");
266 s->data = s->dref + 1;
267 if(s->size < v - s->start)
268 memset((char*)s->data + s->size, 0, v - s->start - s->size);
269 s->size = v - s->start;
277 char buf[ERRMAX], *srct;
283 srct = copyifnec(src, len, &copied);
284 strcpy(buf, P->errbuf);
285 utfecpy(P->errbuf, P->errbuf + ERRMAX, srct);
286 utfecpy(srct, srct + len, buf);
288 copyback(src, len, srct);
300 dirt = copyifnec(dir, -1, &copied);
302 fprint(2, "chdir(%#ux=\"%s\")\n", dir, dirt);
303 P->R[0] = noteerr(chdir(dirt), 0);
315 fprint(2, "notify(%#ux)\n", handler);
316 P->notehandler = handler;
327 fprint(2, "noted(%d)\n", v);
329 longjmp(P->notejmp, v + 1);
330 cherrstr("the front fell off");
345 fprint(2, "rfork(%#o)\n", flags);
346 if((flags & (RFFDG | RFCFDG)) == (RFFDG | RFCFDG) ||
347 (flags & (RFNAMEG | RFCNAMEG)) == (RFNAMEG | RFCNAMEG) ||
348 (flags & (RFENVG | RFCENVG)) == (RFENVG | RFCENVG)) {
350 cherrstr("bad arg in syscall");
353 if((flags & RFPROC) == 0) {
356 P->fd = copyfd(P->fd);
364 P->R[0] = noteerr(rfork(flags), 0);
368 p = emallocz(sizeof(Process));
369 memcpy(p, P, sizeof(Process));
370 for(i = 0; i < SEGNUM; i++) {
374 if((flags & RFMEM) == 0 && i != SEGTEXT || i == SEGSTACK) {
375 t = emallocz(sizeof(Segment));
379 t->dref = emalloc(sizeof(Ref) + s->size);
380 memset(t->dref, 0, sizeof(Ref));
382 t->data = t->dref + 1;
383 memcpy(t->data, s->data, s->size);
392 p->fd = copyfd(P->fd);
393 else if(flags & RFCFDG)
399 rc = rfork(RFMEM | flags);
400 if(rc < 0) /* this should NEVER happen */
401 sysfatal("rfork failed wtf: %r");
415 u32int name, argv, *argvt;
416 char *namet, **argvv;
418 Segment *seg1, *seg2;
422 namet = strdup(vaddr(name, 0, &seg1));
424 argvt = vaddr(argv, 0, &seg1);
426 fprint(2, "exec(%#ux=\"%s\", %#ux)\n", name, namet, argv);
427 for(argc = 0; argvt[argc]; argc++)
429 argvv = emalloc(sizeof(char *) * argc);
430 for(i = 0; i < argc; i++) {
431 argvv[i] = strdup(vaddr(argvt[i], 0, &seg2));
435 rc = loadtext(namet, argc, argvv);
436 for(i = 0; i < argc; i++)
440 P->R[0] = noteerr(rc, 0);
453 st = bufifnec(s, n, &buffered);
455 fprint(2, "await(%#ux, %d)\n", s, n);
456 P->R[0] = noteerr(await(st, n), 0);
458 copyback(s, P->R[0], st);
469 fprint(2, "pipe(%#ux)\n", fd);
470 fdt = bufifnec(fd, 8, &buffered);
471 P->R[0] = noteerr(pipe((int *) fdt), 0);
473 copyback(fd, 8, fdt);
484 fprint(2, "dup(%d, %d)\n", oldfd, newfd);
485 P->R[0] = noteerr(dup(oldfd, newfd), 0);
495 fprint(2, "sleep(%d)\n", n);
496 P->R[0] = noteerr(sleep(n), 0);
507 fprint(2, "rendezvous(%#ux, %#ux)\n", tag, value);
508 P->R[0] = (u32int) (uintptr)rendezvous((void *) tag, (void *) value);
516 u32int fd, afd, old, flag, aname;
518 int copiedold, copiedaname;
525 oldt = copyifnec(old, -1, &copiedold);
527 anamet = copyifnec(aname, -1, &copiedaname);
529 fprint(2, "mount(%d, %d, %#x=\"%s\", %#o, %#x=\"%s\")\n", fd, afd, old, oldt, flag, aname, anamet);
534 fprint(2, "mount(%d, %d, %#x=\"%s\", %#o, nil)\n", fd, afd, old, oldt, flag);
536 P->R[0] = noteerr(mount(fd, afd, oldt, flag, anamet), 0);
546 u32int name, old, flags;
548 int copiedname, copiedold;
553 namet = copyifnec(name, -1, &copiedname);
554 oldt = copyifnec(old, -1, &copiedold);
556 fprint(2, "bind(%#ux=\"%s\", %#ux=\"%s\", %#o)\n", name, namet, old, oldt, flags);
557 P->R[0] = noteerr(bind(namet, oldt, flags), 0);
569 int copiedname, copiedold;
573 oldt = copyifnec(old, -1, &copiedold);
578 fprint(2, "unmount(nil, %#ux=\"%s\")\n", old, oldt);
579 P->R[0] = noteerr(unmount(nil, oldt), 0);
581 namet = copyifnec(name, -1, &copiedname);
583 fprint(2, "unmount(%#ux=\"%s\", %#ux=\"%s\")\n", name, namet, old, oldt);
584 P->R[0] = noteerr(unmount(namet, oldt), 0);
600 filet = copyifnec(file, -1, &copied);
602 fprint(2, "remove(%#ux=\"%s\")\n", file, filet);
603 P->R[0] = noteerr(remove(filet), 0);
615 fprint(2, "alarm(%d)\n", msec);
616 P->R[0] = alarm(msec);
628 fprint(2, "semacquire(%#ux, %ud)\n", addr, block);
629 addrt = vaddrnol(addr, 4);
630 P->R[0] = noteerr(semacquire(addrt, block), 0);
643 fprint(2, "semrelease(%#ux, %ud)\n", addr, count);
644 addrt = vaddr(addr, 4, &seg);
645 P->R[0] = noteerr(semrelease(addrt, count), 0);
653 static void (*calls[])(void) = {
668 [FD2PATH] sysfd2path,
676 [RENDEZVOUS] sysrendezvous,
678 [UNMOUNT] sysunmount,
683 [SEMACQUIRE] syssemacquire,
684 [SEMRELEASE] syssemrelease,
688 if(n >= nelem(calls) || calls[n] == nil)
689 sysfatal("no such syscall %d @ %#ux", n, P->R[15] - 4);