syscall.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  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. union {
  257. vlong v;
  258. ulong u[2];
  259. } o;
  260. o.u[0] = getmem_w(reg.r[13]+16);
  261. o.u[1] = getmem_w(reg.r[13]+20);
  262. sysread(o.v);
  263. }
  264. void
  265. sysseek(void)
  266. {
  267. int fd;
  268. ulong mode;
  269. ulong retp;
  270. union {
  271. vlong v;
  272. ulong u[2];
  273. } o;
  274. retp = getmem_w(reg.r[13]+4);
  275. fd = getmem_w(reg.r[13]+8);
  276. o.u[0] = getmem_w(reg.r[13]+12);
  277. o.u[1] = getmem_w(reg.r[13]+16);
  278. mode = getmem_w(reg.r[13]+20);
  279. if(sysdbg)
  280. itrace("seek(%d, %lld, %d)", fd, o.v, mode);
  281. o.v = seek(fd, o.v, mode);
  282. if(o.v < 0)
  283. errstr(errbuf, sizeof errbuf);
  284. memio((char*)o.u, retp, sizeof(vlong), MemWrite);
  285. }
  286. void
  287. sysoseek(void)
  288. {
  289. int fd, n;
  290. ulong off, mode;
  291. fd = getmem_w(reg.r[13]+4);
  292. off = getmem_w(reg.r[13]+8);
  293. mode = getmem_w(reg.r[13]+12);
  294. if(sysdbg)
  295. itrace("seek(%d, %lud, %d)", fd, off, mode);
  296. n = seek(fd, off, mode);
  297. if(n < 0)
  298. errstr(errbuf, sizeof errbuf);
  299. reg.r[REGRET] = n;
  300. }
  301. void
  302. syssleep(void)
  303. {
  304. ulong len;
  305. int n;
  306. len = getmem_w(reg.r[13]+4);
  307. if(sysdbg)
  308. itrace("sleep(%d)", len);
  309. n = sleep(len);
  310. if(n < 0)
  311. errstr(errbuf, sizeof errbuf);
  312. reg.r[REGRET] = n;
  313. }
  314. void
  315. sys_stat(void)
  316. {
  317. char nambuf[1024];
  318. char buf[ODIRLEN];
  319. ulong edir, name;
  320. extern int _stat(char*, char*); /* old system call */
  321. int n;
  322. name = getmem_w(reg.r[13]+4);
  323. edir = getmem_w(reg.r[13]+8);
  324. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  325. if(sysdbg)
  326. itrace("stat(0x%lux='%s', 0x%lux)", name, nambuf, edir);
  327. n = _stat(nambuf, buf);
  328. if(n < 0)
  329. errstr(errbuf, sizeof errbuf);
  330. else
  331. memio(buf, edir, ODIRLEN, MemWrite);
  332. reg.r[REGRET] = n;
  333. }
  334. void
  335. sysstat(void)
  336. {
  337. char nambuf[1024];
  338. uchar buf[STATMAX];
  339. ulong edir, name;
  340. int n;
  341. name = getmem_w(reg.r[13]+4);
  342. edir = getmem_w(reg.r[13]+8);
  343. n = getmem_w(reg.r[13]+12);
  344. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  345. if(sysdbg)
  346. itrace("stat(0x%lux='%s', 0x%lux, 0x%lux)", name, nambuf, edir, n);
  347. if(n > sizeof buf)
  348. errstr(errbuf, sizeof errbuf);
  349. else{
  350. n = stat(nambuf, buf, n);
  351. if(n < 0)
  352. errstr(errbuf, sizeof errbuf);
  353. else
  354. memio((char*)buf, edir, n, MemWrite);
  355. }
  356. reg.r[REGRET] = n;
  357. }
  358. void
  359. sys_fstat(void)
  360. {
  361. char buf[ODIRLEN];
  362. extern int _fstat(int, char*); /* old system call */
  363. ulong edir;
  364. int n, fd;
  365. fd = getmem_w(reg.r[13]+4);
  366. edir = getmem_w(reg.r[13]+8);
  367. if(sysdbg)
  368. itrace("fstat(%d, 0x%lux)", fd, edir);
  369. n = _fstat(fd, buf);
  370. if(n < 0)
  371. errstr(errbuf, sizeof errbuf);
  372. else
  373. memio(buf, edir, ODIRLEN, MemWrite);
  374. reg.r[REGRET] = n;
  375. }
  376. void
  377. sysfstat(void)
  378. {
  379. uchar buf[STATMAX];
  380. ulong edir;
  381. int n, fd;
  382. fd = getmem_w(reg.r[13]+4);
  383. edir = getmem_w(reg.r[13]+8);
  384. n = getmem_w(reg.r[13]+12);
  385. if(sysdbg)
  386. itrace("fstat(%d, 0x%lux, 0x%lux)", fd, edir, n);
  387. reg.r[REGRET] = -1;
  388. if(n > sizeof buf){
  389. strcpy(errbuf, "stat buffer too big");
  390. return;
  391. }
  392. n = fstat(fd, buf, n);
  393. if(n < 0)
  394. errstr(errbuf, sizeof errbuf);
  395. else
  396. memio((char*)buf, edir, n, MemWrite);
  397. reg.r[REGRET] = n;
  398. }
  399. void
  400. syswrite(vlong offset)
  401. {
  402. int fd;
  403. ulong size, a;
  404. char *buf;
  405. int n;
  406. fd = getmem_w(reg.r[13]+4);
  407. a = getmem_w(reg.r[13]+8);
  408. size = getmem_w(reg.r[13]+12);
  409. Bflush(bioout);
  410. buf = memio(0, a, size, MemRead);
  411. n = pwrite(fd, buf, size, offset);
  412. if(n < 0)
  413. errstr(errbuf, sizeof errbuf);
  414. if(sysdbg)
  415. itrace("write(%d, %lux, %d, 0x%llx) = %d", fd, a, size, offset, n);
  416. free(buf);
  417. reg.r[REGRET] = n;
  418. }
  419. void
  420. sys_write(void)
  421. {
  422. syswrite(-1LL);
  423. }
  424. void
  425. syspwrite(void)
  426. {
  427. union {
  428. vlong v;
  429. ulong u[2];
  430. } o;
  431. o.u[0] = getmem_w(reg.r[13]+16);
  432. o.u[1] = getmem_w(reg.r[13]+20);
  433. syswrite(o.v);
  434. }
  435. void
  436. syspipe(void)
  437. {
  438. int n, p[2];
  439. ulong fd;
  440. fd = getmem_w(reg.r[13]+4);
  441. if(sysdbg)
  442. itrace("pipe(%lux)", fd);
  443. n = pipe(p);
  444. if(n < 0)
  445. errstr(errbuf, sizeof errbuf);
  446. else {
  447. putmem_w(fd, p[0]);
  448. putmem_w(fd+4, p[1]);
  449. }
  450. reg.r[REGRET] = n;
  451. }
  452. void
  453. syscreate(void)
  454. {
  455. char file[1024];
  456. int n;
  457. ulong mode, name, perm;
  458. name = getmem_w(reg.r[13]+4);
  459. mode = getmem_w(reg.r[13]+8);
  460. perm = getmem_w(reg.r[13]+12);
  461. memio(file, name, sizeof(file), MemReadstring);
  462. if(sysdbg)
  463. itrace("create(0x%lux='%s', 0x%lux, 0x%lux)", name, file, mode, perm);
  464. n = create(file, mode, perm);
  465. if(n < 0)
  466. errstr(errbuf, sizeof errbuf);
  467. reg.r[REGRET] = n;
  468. }
  469. void
  470. sysbrk_(void)
  471. {
  472. ulong addr, osize, nsize;
  473. Segment *s;
  474. addr = getmem_w(reg.r[13]+4);
  475. if(sysdbg)
  476. itrace("brk_(0x%lux)", addr);
  477. reg.r[REGRET] = -1;
  478. if(addr < memory.seg[Data].base+datasize) {
  479. strcpy(errbuf, "address below segment");
  480. return;
  481. }
  482. if(addr > memory.seg[Stack].base) {
  483. strcpy(errbuf, "segment too big");
  484. return;
  485. }
  486. s = &memory.seg[Bss];
  487. if(addr > s->end) {
  488. osize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
  489. addr = ((addr)+(BY2PG-1))&~(BY2PG-1);
  490. s->end = addr;
  491. nsize = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
  492. s->table = erealloc(s->table, osize, nsize);
  493. }
  494. reg.r[REGRET] = 0;
  495. }
  496. void
  497. sysremove(void)
  498. {
  499. char nambuf[1024];
  500. ulong name;
  501. int n;
  502. name = getmem_w(reg.r[13]+4);
  503. memio(nambuf, name, sizeof(nambuf), MemReadstring);
  504. if(sysdbg)
  505. itrace("remove(0x%lux='%s')", name, nambuf);
  506. n = remove(nambuf);
  507. if(n < 0)
  508. errstr(errbuf, sizeof errbuf);
  509. reg.r[REGRET] = n;
  510. }
  511. void
  512. sysnotify(void)
  513. {
  514. nofunc = getmem_w(reg.r[13]+4);
  515. if(sysdbg)
  516. itrace("notify(0x%lux)\n", nofunc);
  517. reg.r[REGRET] = 0;
  518. }
  519. void
  520. sys_wait(void)
  521. {
  522. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  523. exits(0);
  524. }
  525. void
  526. sysawait(void)
  527. {
  528. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  529. exits(0);
  530. }
  531. void
  532. sysrfork(void)
  533. {
  534. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  535. exits(0);
  536. }
  537. void
  538. syswstat(void)
  539. {
  540. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  541. exits(0);
  542. }
  543. void
  544. sys_wstat(void)
  545. {
  546. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  547. exits(0);
  548. }
  549. void
  550. sysfwstat(void)
  551. {
  552. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  553. exits(0);
  554. }
  555. void
  556. sys_fwstat(void)
  557. {
  558. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  559. exits(0);
  560. }
  561. void
  562. sysnoted(void)
  563. {
  564. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  565. exits(0);
  566. }
  567. void
  568. syssegattach(void)
  569. {
  570. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  571. exits(0);
  572. }
  573. void
  574. syssegdetach(void)
  575. {
  576. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  577. exits(0);
  578. }
  579. void
  580. syssegfree(void)
  581. {
  582. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  583. exits(0);
  584. }
  585. void
  586. syssegflush(void)
  587. {
  588. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  589. exits(0);
  590. }
  591. void
  592. sysrendezvous(void)
  593. {
  594. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  595. exits(0);
  596. }
  597. void
  598. sysunmount(void)
  599. {
  600. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  601. exits(0);
  602. }
  603. void
  604. sysfork(void)
  605. {
  606. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  607. exits(0);
  608. }
  609. void
  610. sysforkpgrp(void)
  611. {
  612. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  613. exits(0);
  614. }
  615. void
  616. syssegbrk(void)
  617. {
  618. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  619. exits(0);
  620. }
  621. void
  622. sysmount(void)
  623. {
  624. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  625. exits(0);
  626. }
  627. void
  628. sysalarm(void)
  629. {
  630. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  631. exits(0);
  632. }
  633. void
  634. sysexec(void)
  635. {
  636. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  637. exits(0);
  638. }
  639. void
  640. sys_fsession(void)
  641. {
  642. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  643. exits(0);
  644. }
  645. void
  646. sysfauth(void)
  647. {
  648. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  649. exits(0);
  650. }
  651. void
  652. sysfversion(void)
  653. {
  654. Bprint(bioout, "No system call %s\n", sysctab[reg.r[REGARG]]);
  655. exits(0);
  656. }
  657. void (*systab[])(void) =
  658. {
  659. [SYSR1] sys1,
  660. [_ERRSTR] sys_errstr,
  661. [BIND] sysbind,
  662. [CHDIR] syschdir,
  663. [CLOSE] sysclose,
  664. [DUP] sysdup,
  665. [ALARM] sysalarm,
  666. [EXEC] sysexec,
  667. [EXITS] sysexits,
  668. [_FSESSION] sys_fsession,
  669. [FAUTH] sysfauth,
  670. [_FSTAT] sys_fstat,
  671. [SEGBRK] syssegbrk,
  672. [MOUNT] sysmount,
  673. [OPEN] sysopen,
  674. [_READ] sys_read,
  675. [OSEEK] sysoseek,
  676. [SLEEP] syssleep,
  677. [_STAT] sys_stat,
  678. [RFORK] sysrfork,
  679. [_WRITE] sys_write,
  680. [PIPE] syspipe,
  681. [CREATE] syscreate,
  682. [FD2PATH] sysfd2path,
  683. [BRK_] sysbrk_,
  684. [REMOVE] sysremove,
  685. [_WSTAT] sys_wstat,
  686. [_FWSTAT] sys_fwstat,
  687. [NOTIFY] sysnotify,
  688. [NOTED] sysnoted,
  689. [SEGATTACH] syssegattach,
  690. [SEGDETACH] syssegdetach,
  691. [SEGFREE] syssegfree,
  692. [SEGFLUSH] syssegflush,
  693. [RENDEZVOUS] sysrendezvous,
  694. [UNMOUNT] sysunmount,
  695. [_WAIT] sys_wait,
  696. [SEEK] sysseek,
  697. [FVERSION] sysfversion,
  698. [ERRSTR] syserrstr,
  699. [STAT] sysstat,
  700. [FSTAT] sysfstat,
  701. [WSTAT] syswstat,
  702. [FWSTAT] sysfwstat,
  703. [PREAD] syspread,
  704. [PWRITE] syspwrite,
  705. [AWAIT] sysawait,
  706. };
  707. void
  708. Ssyscall(ulong)
  709. {
  710. int call;
  711. call = reg.r[REGARG];
  712. if(call < 0 || call > PWRITE || systab[call] == nil) {
  713. Bprint(bioout, "bad system call\n");
  714. dumpreg();
  715. }
  716. if(trace)
  717. itrace("SWI\t%s", sysctab[call]);
  718. (*systab[call])();
  719. Bflush(bioout);
  720. }