syscall.c 13 KB

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