syscall.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <mach.h>
  5. #define Extern extern
  6. #include "mips.h"
  7. #define REGSP 29
  8. #define REGRET 1
  9. #define ODIRLEN 116 /* compatibility; used in _stat etc. */
  10. #define OERRLEN 64 /* compatibility; used in _stat etc. */
  11. char errbuf[ERRMAX];
  12. ulong nofunc;
  13. #include "/sys/src/libc/9syscall/sys.h"
  14. char *sysctab[]={
  15. [SYSR1] "SYSR1",
  16. [_ERRSTR] "_errstr",
  17. [BIND] "Bind",
  18. [CHDIR] "Chdir",
  19. [CLOSE] "Close",
  20. [DUP] "Dup",
  21. [ALARM] "Alarm",
  22. [EXEC] "Exec",
  23. [EXITS] "Exits",
  24. [_FSESSION] "_Fsession",
  25. [FAUTH] "Fauth",
  26. [_FSTAT] "_fstat",
  27. [SEGBRK] "Segbrk",
  28. [_MOUNT] "_Mount",
  29. [OPEN] "Open",
  30. [_READ] "_Read",
  31. [OSEEK] "Oseek",
  32. [SLEEP] "Sleep",
  33. [_STAT] "_Stat",
  34. [RFORK] "Rfork",
  35. [_WRITE] "_Write",
  36. [PIPE] "Pipe",
  37. [CREATE] "Create",
  38. [FD2PATH] "Fd2path",
  39. [BRK_] "Brk_",
  40. [REMOVE] "Remove",
  41. [_WSTAT] "_Wstat",
  42. [_FWSTAT] "_Fwstat",
  43. [NOTIFY] "Notify",
  44. [NOTED] "Noted",
  45. [SEGATTACH] "Segattach",
  46. [SEGDETACH] "Segdetach",
  47. [SEGFREE] "Segfree",
  48. [SEGFLUSH] "Segflush",
  49. [RENDEZVOUS] "Rendezvous",
  50. [UNMOUNT] "Unmount",
  51. [_WAIT] "Wait",
  52. [SEEK] "Seek",
  53. [FVERSION] "Fversion",
  54. [ERRSTR] "Errstr",
  55. [STAT] "Stat",
  56. [FSTAT] "Fstat",
  57. [WSTAT] "Wstat",
  58. [FWSTAT] "Fwstat",
  59. [MOUNT] "Mount",
  60. [AWAIT] "Await",
  61. [PREAD] "Pread",
  62. [PWRITE] "Pwrite",
  63. };
  64. void sys1(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
  65. void
  66. sys_errstr(void)
  67. {
  68. ulong str;
  69. str = getmem_w(reg.r[REGSP]+4);
  70. if(sysdbg)
  71. itrace("errstr(0x%lux)", str);
  72. memio(errbuf, str, OERRLEN, MemWrite);
  73. strcpy(errbuf, "no error");
  74. reg.r[REGRET] = 0;
  75. }
  76. void
  77. syserrstr(void)
  78. {
  79. ulong str;
  80. uint n;
  81. str = getmem_w(reg.r[REGSP]+4);
  82. n = getmem_w(reg.r[REGSP]+8);
  83. if(sysdbg)
  84. itrace("errstr(0x%lux, 0x%lux)", str, n);
  85. if(n > strlen(errbuf)+1)
  86. n = strlen(errbuf)+1;
  87. memio(errbuf, str, n, MemWrite);
  88. strcpy(errbuf, "no error");
  89. reg.r[REGRET] = n;
  90. }
  91. void
  92. sysfd2path(void)
  93. {
  94. ulong str;
  95. uint fd, n;
  96. char buf[1024];
  97. fd = getmem_w(reg.r[REGSP]+4);
  98. str = getmem_w(reg.r[REGSP]+8);
  99. n = getmem_w(reg.r[REGSP]+12);
  100. if(sysdbg)
  101. itrace("fd2path(0x%lux, 0x%lux, 0x%lux)", fd, str, n);
  102. reg.r[REGRET] = -1;
  103. if(n > sizeof buf){
  104. strcpy(errbuf, "buffer too big");
  105. return;
  106. }
  107. n = fd2path(fd, buf, sizeof buf);
  108. if(n < 0)
  109. errstr(buf, sizeof buf);
  110. else
  111. memio(errbuf, str, n, MemWrite);
  112. reg.r[REGRET] = n;
  113. }
  114. void
  115. sysbind(void)
  116. {
  117. ulong pname, pold, flags;
  118. char name[1024], old[1024];
  119. int n;
  120. pname = getmem_w(reg.r[REGSP]+4);
  121. pold = getmem_w(reg.r[REGSP]+8);
  122. flags = getmem_w(reg.r[REGSP]+12);
  123. memio(name, pname, sizeof(name), MemReadstring);
  124. memio(old, pold, sizeof(old), MemReadstring);
  125. if(sysdbg)
  126. itrace("bind(0x%lux='%s', 0x%lux='%s', 0x%lux)", name, name, old, old, flags);
  127. n = bind(name, old, flags);
  128. if(n < 0)
  129. errstr(errbuf, sizeof errbuf);
  130. reg.r[REGRET] = n;
  131. }
  132. void
  133. syschdir(void)
  134. {
  135. char file[1024];
  136. int n;
  137. ulong name;
  138. name = getmem_w(reg.r[REGSP]+4);
  139. memio(file, name, sizeof(file), MemReadstring);
  140. if(sysdbg)
  141. itrace("chdir(0x%lux='%s', 0x%lux)", name, file);
  142. n = chdir(file);
  143. if(n < 0)
  144. errstr(errbuf, sizeof errbuf);
  145. reg.r[REGRET] = n;
  146. }
  147. void
  148. sysclose(void)
  149. {
  150. int n;
  151. ulong fd;
  152. fd = getmem_w(reg.r[REGSP]+4);
  153. if(sysdbg)
  154. itrace("close(%d)", fd);
  155. n = close(fd);
  156. if(n < 0)
  157. errstr(errbuf, sizeof errbuf);
  158. reg.r[REGRET] = n;
  159. }
  160. void
  161. sysdup(void)
  162. {
  163. int oldfd, newfd;
  164. int n;
  165. oldfd = getmem_w(reg.r[REGSP]+4);
  166. newfd = getmem_w(reg.r[REGSP]+8);
  167. if(sysdbg)
  168. itrace("dup(%d, %d)", oldfd, newfd);
  169. n = dup(oldfd, newfd);
  170. if(n < 0)
  171. errstr(errbuf, sizeof errbuf);
  172. reg.r[REGRET] = n;
  173. }
  174. void
  175. sysexits(void)
  176. {
  177. char buf[OERRLEN];
  178. ulong str;
  179. str = getmem_w(reg.r[REGSP]+4);
  180. if(sysdbg)
  181. itrace("exits(0x%lux)", str);
  182. count = 1;
  183. if(str != 0) {
  184. memio(buf, str, sizeof buf, MemRead);
  185. Bprint(bioout, "exits(%s)\n", buf);
  186. }
  187. else
  188. Bprint(bioout, "exits(0)\n");
  189. }
  190. void
  191. sysopen(void)
  192. {
  193. char file[1024];
  194. int n;
  195. ulong mode, name;
  196. name = getmem_w(reg.r[REGSP]+4);
  197. mode = getmem_w(reg.r[REGSP]+8);
  198. memio(file, name, sizeof(file), MemReadstring);
  199. if(sysdbg)
  200. itrace("open(0x%lux='%s', 0x%lux)", name, file, mode);
  201. n = open(file, mode);
  202. if(n < 0)
  203. errstr(errbuf, sizeof errbuf);
  204. reg.r[REGRET] = n;
  205. };
  206. void
  207. sysread(vlong offset)
  208. {
  209. int fd;
  210. ulong size, a;
  211. char *buf, *p;
  212. int n, cnt, c;
  213. fd = getmem_w(reg.r[REGSP]+4);
  214. a = getmem_w(reg.r[REGSP]+8);
  215. size = getmem_w(reg.r[REGSP]+12);
  216. buf = emalloc(size);
  217. if(fd == 0) {
  218. print("\nstdin>>");
  219. p = buf;
  220. n = 0;
  221. cnt = size;
  222. while(cnt) {
  223. c = Bgetc(bin);
  224. if(c <= 0)
  225. break;
  226. *p++ = c;
  227. n++;
  228. cnt--;
  229. if(c == '\n')
  230. break;
  231. }
  232. }
  233. else
  234. n = pread(fd, buf, size, offset);
  235. if(n < 0)
  236. errstr(errbuf, sizeof errbuf);
  237. else
  238. memio(buf, a, n, MemWrite);
  239. if(sysdbg)
  240. itrace("read(%d, 0x%lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
  241. free(buf);
  242. reg.r[REGRET] = n;
  243. }
  244. void
  245. sys_read(void)
  246. {
  247. sysread(-1LL);
  248. }
  249. void
  250. syspread(void)
  251. {
  252. union {
  253. vlong v;
  254. ulong u[2];
  255. } o;
  256. o.u[0] = getmem_w(reg.r[REGSP]+16);
  257. o.u[1] = getmem_w(reg.r[REGSP]+20);
  258. sysread(o.v);
  259. }
  260. void
  261. sysseek(void)
  262. {
  263. int fd;
  264. ulong mode;
  265. ulong retp;
  266. union {
  267. vlong v;
  268. ulong u[2];
  269. } o;
  270. retp = getmem_w(reg.r[REGSP]+4);
  271. fd = getmem_w(reg.r[REGSP]+8);
  272. o.u[0] = getmem_w(reg.r[REGSP]+12);
  273. o.u[1] = getmem_w(reg.r[REGSP]+16);
  274. mode = getmem_w(reg.r[REGSP]+20);
  275. if(sysdbg)
  276. itrace("seek(%d, %lld, %d)", fd, o.v, mode);
  277. o.v = seek(fd, o.v, mode);
  278. if(o.v < 0)
  279. errstr(errbuf, sizeof errbuf);
  280. memio((char*)o.u, retp, sizeof(vlong), MemWrite);
  281. }
  282. void
  283. sysoseek(void)
  284. {
  285. int fd, n;
  286. ulong off, mode;
  287. fd = getmem_w(reg.r[REGSP]+4);
  288. off = getmem_w(reg.r[REGSP]+8);
  289. mode = getmem_w(reg.r[REGSP]+12);
  290. if(sysdbg)
  291. itrace("seek(%d, %lud, %d)", fd, off, mode);
  292. n = seek(fd, off, mode);
  293. if(n < 0)
  294. errstr(errbuf, sizeof errbuf);
  295. reg.r[REGRET] = n;
  296. }
  297. void
  298. sysrfork(void)
  299. {
  300. int flag;
  301. flag = getmem_w(reg.r[REGSP]+4);
  302. if(sysdbg)
  303. itrace("rfork(%d)", flag);
  304. if(flag & RFPROC) {
  305. Bprint(bioout, "rfork: cannot create process, rfork(0x%.8ux)\n", flag);
  306. exits(0);
  307. }
  308. reg.r[REGRET] = rfork(flag);
  309. }
  310. void
  311. syssleep(void)
  312. {
  313. ulong len;
  314. int n;
  315. len = getmem_w(reg.r[REGSP]+4);
  316. if(sysdbg)
  317. itrace("sleep(%d)", len);
  318. n = sleep(len);
  319. if(n < 0)
  320. errstr(errbuf, sizeof errbuf);
  321. reg.r[REGRET] = n;
  322. }
  323. void
  324. sys_stat(void)
  325. {
  326. char nambuf[1024];
  327. char buf[ODIRLEN];
  328. ulong edir, name;
  329. extern int _stat(char*, char*); /* old system call */
  330. int n;
  331. name = getmem_w(reg.r[REGSP]+4);
  332. edir = getmem_w(reg.r[REGSP]+8);
  333. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  334. if(sysdbg)
  335. itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
  336. n = _stat(nambuf, buf);
  337. if(n < 0)
  338. errstr(errbuf, sizeof errbuf);
  339. else
  340. memio(buf, edir, ODIRLEN, MemWrite);
  341. reg.r[REGRET] = n;
  342. }
  343. void
  344. sysstat(void)
  345. {
  346. char nambuf[1024];
  347. uchar buf[STATMAX];
  348. ulong edir, name;
  349. int n;
  350. name = getmem_w(reg.r[REGSP]+4);
  351. edir = getmem_w(reg.r[REGSP]+8);
  352. n = getmem_w(reg.r[REGSP]+12);
  353. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  354. if(sysdbg)
  355. itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
  356. if(n > sizeof buf)
  357. errstr(errbuf, sizeof errbuf);
  358. else{
  359. n = stat(nambuf, buf, n);
  360. if(n < 0)
  361. errstr(errbuf, sizeof errbuf);
  362. else
  363. memio((char*)buf, edir, n, MemWrite);
  364. }
  365. reg.r[REGRET] = n;
  366. }
  367. void
  368. sys_fstat(void)
  369. {
  370. char buf[ODIRLEN];
  371. ulong edir;
  372. extern int _fstat(int, char*); /* old system call */
  373. int n, fd;
  374. fd = getmem_w(reg.r[REGSP]+4);
  375. edir = getmem_w(reg.r[REGSP]+8);
  376. if(sysdbg)
  377. itrace("fstat(%d, 0x%lux)", fd, edir);
  378. n = _fstat(fd, buf);
  379. if(n < 0)
  380. errstr(errbuf, sizeof errbuf);
  381. else
  382. memio(buf, edir, ODIRLEN, MemWrite);
  383. reg.r[REGRET] = n;
  384. }
  385. void
  386. sysfstat(void)
  387. {
  388. uchar buf[STATMAX];
  389. ulong edir;
  390. int n, fd;
  391. fd = getmem_w(reg.r[REGSP]+4);
  392. edir = getmem_w(reg.r[REGSP]+8);
  393. n = getmem_w(reg.r[REGSP]+12);
  394. if(sysdbg)
  395. itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
  396. reg.r[REGRET] = -1;
  397. if(n > sizeof buf){
  398. strcpy(errbuf, "stat buffer too big");
  399. return;
  400. }
  401. n = fstat(fd, buf, n);
  402. if(n < 0)
  403. errstr(errbuf, sizeof errbuf);
  404. else
  405. memio((char*)buf, edir, n, MemWrite);
  406. reg.r[REGRET] = n;
  407. }
  408. void
  409. syswrite(vlong offset)
  410. {
  411. int fd;
  412. ulong size, a;
  413. char *buf;
  414. int n;
  415. fd = getmem_w(reg.r[REGSP]+4);
  416. a = getmem_w(reg.r[REGSP]+8);
  417. size = getmem_w(reg.r[REGSP]+12);
  418. Bflush(bioout);
  419. buf = memio(0, a, size, MemRead);
  420. n = pwrite(fd, buf, size, offset);
  421. if(n < 0)
  422. errstr(errbuf, sizeof errbuf);
  423. if(sysdbg)
  424. itrace("write(%d, %lux, %d, 0xllx) = %d", fd, a, size, offset, n);
  425. free(buf);
  426. reg.r[REGRET] = n;
  427. }
  428. void
  429. sys_write(void)
  430. {
  431. syswrite(-1LL);
  432. }
  433. void
  434. syspwrite(void)
  435. {
  436. union {
  437. vlong v;
  438. ulong u[2];
  439. } o;
  440. o.u[0] = getmem_w(reg.r[REGSP]+16);
  441. o.u[1] = getmem_w(reg.r[REGSP]+20);
  442. syswrite(o.v);
  443. }
  444. void
  445. syspipe(void)
  446. {
  447. int n, p[2];
  448. ulong fd;
  449. fd = getmem_w(reg.r[REGSP]+4);
  450. if(sysdbg)
  451. itrace("pipe(%lux)", fd);
  452. n = pipe(p);
  453. if(n < 0)
  454. errstr(errbuf, sizeof errbuf);
  455. else {
  456. putmem_w(fd, p[0]);
  457. putmem_w(fd+4, p[1]);
  458. }
  459. reg.r[REGRET] = n;
  460. }
  461. void
  462. syscreate(void)
  463. {
  464. char file[1024];
  465. int n;
  466. ulong mode, name, perm;
  467. name = getmem_w(reg.r[REGSP]+4);
  468. mode = getmem_w(reg.r[REGSP]+8);
  469. perm = getmem_w(reg.r[REGSP]+12);
  470. memio(file, name, sizeof(file), MemReadstring);
  471. if(sysdbg)
  472. itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
  473. n = create(file, mode, perm);
  474. if(n < 0)
  475. errstr(errbuf, sizeof errbuf);
  476. reg.r[REGRET] = n;
  477. }
  478. void
  479. sysbrk_(void)
  480. {
  481. ulong addr, osize, nsize;
  482. Segment *s;
  483. addr = getmem_w(reg.r[REGSP]+4);
  484. if(sysdbg)
  485. itrace("brk_(0x%lux)", addr);
  486. reg.r[REGRET] = -1;
  487. if(addr < memory.seg[Data].base+datasize) {
  488. strcpy(errbuf, "address below segment");
  489. return;
  490. }
  491. if(addr > memory.seg[Stack].base) {
  492. strcpy(errbuf, "segment too big");
  493. return;
  494. }
  495. s = &memory.seg[Bss];
  496. if(addr > s->end) {
  497. osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
  498. addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
  499. s->end = addr;
  500. nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
  501. s->table = erealloc(s->table, osize, nsize);
  502. }
  503. reg.r[REGRET] = 0;
  504. }
  505. void
  506. sysremove(void)
  507. {
  508. char nambuf[1024];
  509. ulong name;
  510. int n;
  511. name = getmem_w(reg.r[REGSP]+4);
  512. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  513. if(sysdbg)
  514. itrace("remove(0x%lux='%s')", name, nambuf);
  515. n = remove(nambuf);
  516. if(n < 0)
  517. errstr(errbuf, sizeof errbuf);
  518. reg.r[REGRET] = n;
  519. }
  520. void
  521. sysnotify(void)
  522. {
  523. nofunc = getmem_w(reg.r[REGSP]+4);
  524. if(sysdbg)
  525. itrace("notify(0x%lux)\n", nofunc);
  526. reg.r[REGRET] = 0;
  527. }
  528. void
  529. syssegflush(void)
  530. {
  531. int n;
  532. ulong va;
  533. va = getmem_w(reg.r[REGSP]+4);
  534. n = getmem_w(reg.r[REGSP]+8);
  535. if(sysdbg)
  536. itrace("segflush(va=0x%lux, n=%d)\n", va, n);
  537. reg.r[REGRET] = 0;
  538. }
  539. void sysfversion(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
  540. void sysfsession(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
  541. void sysfauth(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
  542. void syswait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0); }
  543. void syswstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  544. void sys_wstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  545. void sysfwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  546. void sys_fwstat(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  547. void sysnoted(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  548. void syssegattach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  549. void syssegdetach(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  550. void syssegfree(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  551. void sysrendezvous(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  552. void sysunmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  553. void sysfork(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  554. void sysforkpgrp(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  555. void syssegbrk(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  556. void _sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  557. void sysalarm(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  558. void sysexec(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  559. void sysmount(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  560. void sysawait(void) { Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGRET]]); exits(0);}
  561. void (*systab[])(void) ={
  562. [SYSR1] sys1,
  563. [_ERRSTR] sys_errstr,
  564. [BIND] sysbind,
  565. [CHDIR] syschdir,
  566. [CLOSE] sysclose,
  567. [DUP] sysdup,
  568. [ALARM] sysalarm,
  569. [EXEC] sysexec,
  570. [EXITS] sysexits,
  571. [_FSESSION] sysfsession,
  572. [FAUTH] sysfauth,
  573. [_FSTAT] sys_fstat,
  574. [SEGBRK] syssegbrk,
  575. [_MOUNT] _sysmount,
  576. [OPEN] sysopen,
  577. [_READ] sys_read,
  578. [OSEEK] sysoseek,
  579. [SLEEP] syssleep,
  580. [_STAT] sys_stat,
  581. [RFORK] sysrfork,
  582. [_WRITE] sys_write,
  583. [PIPE] syspipe,
  584. [CREATE] syscreate,
  585. [FD2PATH] sysfd2path,
  586. [BRK_] sysbrk_,
  587. [REMOVE] sysremove,
  588. [_WSTAT] sys_wstat,
  589. [_FWSTAT] sys_fwstat,
  590. [NOTIFY] sysnotify,
  591. [NOTED] sysnoted,
  592. [SEGATTACH] syssegattach,
  593. [SEGDETACH] syssegdetach,
  594. [SEGFREE] syssegfree,
  595. [SEGFLUSH] syssegflush,
  596. [RENDEZVOUS] sysrendezvous,
  597. [UNMOUNT] sysunmount,
  598. [_WAIT] syswait,
  599. [SEEK] sysseek,
  600. [FVERSION] sysfversion,
  601. [ERRSTR] syserrstr,
  602. [STAT] sysstat,
  603. [FSTAT] sysfstat,
  604. [WSTAT] syswstat,
  605. [FWSTAT] sysfwstat,
  606. [MOUNT] sysmount,
  607. [AWAIT] sysawait,
  608. [PREAD] syspread,
  609. [PWRITE] syspwrite,
  610. };
  611. void
  612. Ssyscall(ulong inst)
  613. {
  614. int call;
  615. USED(inst);
  616. call = reg.r[REGRET];
  617. if(call < 0 || call > PWRITE || systab[call] == nil) {
  618. Bprint(bioout, "Bad system call\n");
  619. dumpreg();
  620. }
  621. if(trace)
  622. itrace("sysc\t%s", sysctab[call]);
  623. (*systab[call])();
  624. Bflush(bioout);
  625. }