syscall.c 14 KB

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