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);
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), &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);
205 exits(vaddrnol(arg(0)));
215 if(v >= P->S[SEGSTACK]->start)
216 sysfatal("bss > stack, wtf?");
217 if(v < P->S[SEGBSS]->start)
218 sysfatal("bss length < 0, wtf?");
221 s->ref = realloc(s->ref, v - s->start + 4);
223 sysfatal("error reallocating");
224 s->data = s->ref + 1;
225 if(s->size < v - s->start)
226 memset((char*)s->data + s->size, 0, v - s->start - s->size);
227 s->size = v - s->start;
235 char buf[ERRMAX], *srct;
241 srct = copyifnec(src, len, &copied);
242 strcpy(buf, P->errbuf);
243 utfecpy(P->errbuf, P->errbuf + ERRMAX, srct);
244 utfecpy(srct, srct + len, buf);
246 copyback(src, len, srct);
258 dirt = copyifnec(dir, -1, &copied);
260 fprint(2, "chdir(%#ux=\"%s\")\n", dir, dirt);
261 P->R[0] = noteerr(chdir(dirt), 0);
280 RFORKPASS = RFENVG | RFCENVG | RFNOTEG | RFNOMNT | RFNAMEG | RFCNAMEG | RFNOWAIT | RFREND | RFFDG | RFCFDG,
281 RFORKHANDLED = RFPROC | RFMEM,
286 fprint(2, "rfork(%#o)\n", flags);
287 if(flags & ~(RFORKPASS | RFORKHANDLED))
288 sysfatal("rfork with unhandled flags %#o", flags & ~(RFORKPASS | RFORKHANDLED));
289 if((flags & RFPROC) == 0) {
292 P->fd = copyfd(P->fd);
300 P->R[0] = noteerr(rfork(flags & RFORKPASS), 0);
303 p = emallocz(sizeof(Process));
304 memcpy(p, P, sizeof(Process));
305 for(i = 0; i < SEGNUM; i++) {
309 if((flags & RFMEM) == 0 && i != SEGTEXT || i == SEGSTACK) {
310 t = emallocz(sizeof(Segment));
314 t->ref = emalloc(sizeof(Ref) + s->size);
315 memset(t->ref, 0, sizeof(Ref));
317 t->data = t->ref + 1;
318 memcpy(t->data, s->data, s->size);
327 p->fd = copyfd(P->fd);
328 else if(flags & RFCFDG)
333 rc = rfork(RFPROC | RFMEM | (flags & RFORKPASS));
335 sysfatal("rfork: %r");
347 u32int name, argv, *argvt;
348 char *namet, **argvv;
350 Segment *seg1, *seg2;
354 namet = strdup(vaddr(name, &seg1));
356 argvt = vaddr(argv, &seg1);
358 fprint(2, "exec(%#ux=\"%s\", %#ux)\n", name, namet, argv);
359 for(argc = 0; argvt[argc]; argc++)
361 argvv = emalloc(sizeof(char *) * argc);
362 for(i = 0; i < argc; i++) {
363 argvv[i] = strdup(vaddr(argvt[i], &seg2));
367 rc = loadtext(namet, argc, argvv);
368 for(i = 0; i < argc; i++)
372 P->R[0] = noteerr(rc, 0);
385 st = bufifnec(s, n, &buffered);
387 fprint(2, "await(%#ux, %d)\n", s, n);
388 P->R[0] = noteerr(await(st, n), 0);
390 copyback(s, P->R[0], st);
401 fprint(2, "pipe(%#ux)\n", fd);
402 fdt = bufifnec(fd, 8, &buffered);
403 P->R[0] = noteerr(pipe((int *) fdt), 0);
405 copyback(fd, 8, fdt);
416 fprint(2, "dup(%d, %d)\n", oldfd, newfd);
417 P->R[0] = noteerr(dup(oldfd, newfd), 0);
427 fprint(2, "sleep(%d)\n", n);
428 P->R[0] = noteerr(sleep(n), 0);
439 fprint(2, "rendezvous(%#ux, %#ux)\n", tag, value);
440 P->R[0] = (u32int) rendezvous((void *) tag, (void *) value);
448 u32int fd, afd, old, flag, aname;
450 int copiedold, copiedaname;
457 oldt = copyifnec(old, -1, &copiedold);
459 anamet = copyifnec(aname, -1, &copiedaname);
461 fprint(2, "mount(%d, %d, %#x=\"%s\", %#o, %#x=\"%s\")\n", fd, afd, old, oldt, flag, aname, anamet);
466 fprint(2, "mount(%d, %d, %#x=\"%s\", %#o, nil)\n", fd, afd, old, oldt, flag);
468 P->R[0] = noteerr(mount(fd, afd, oldt, flag, anamet), 0);
478 u32int name, old, flags;
480 int copiedname, copiedold;
485 namet = copyifnec(name, -1, &copiedname);
486 oldt = copyifnec(old, -1, &copiedold);
488 fprint(2, "bind(%#ux=\"%s\", %#ux=\"%s\", %#o)\n", name, namet, old, oldt, flags);
489 P->R[0] = noteerr(bind(namet, oldt, flags), 0);
501 int copiedname, copiedold;
505 oldt = copyifnec(old, -1, &copiedold);
510 fprint(2, "unmount(nil, %#ux=\"%s\")\n", old, oldt);
511 P->R[0] = noteerr(unmount(nil, oldt), 0);
513 namet = copyifnec(name, -1, &copiedname);
515 fprint(2, "unmount(%#ux=\"%s\", %#ux=\"%s\")\n", name, namet, old, oldt);
516 P->R[0] = noteerr(unmount(namet, oldt), 0);
532 filet = copyifnec(file, -1, &copied);
534 fprint(2, "remove(%#ux=\"%s\")\n", file, filet);
535 P->R[0] = noteerr(remove(filet), 0);
544 static void (*calls[])(void) = {
557 [FD2PATH] sysfd2path,
564 [RENDEZVOUS] sysrendezvous,
566 [UNMOUNT] sysunmount,
573 if(n >= nelem(calls) || calls[n] == nil)
574 sysfatal("no such syscall %d @ %#ux", n, P->R[15] - 4);