syscall.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. #include <assert.h>
  2. #include <bits/alltypes.h>
  3. #include <bits/ioctl.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6. #include <poll.h>
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <sys/mman.h>
  11. #include <sys/prctl.h>
  12. #include <sys/stat.h>
  13. #include <sys/types.h>
  14. #include <sys/uio.h>
  15. #include <sys/utsname.h>
  16. #include <sys/wait.h>
  17. #include <termios.h>
  18. #include <time.h>
  19. #include <unistd.h>
  20. #include <types/allocator.hpp>
  21. #include <types/elf.hpp>
  22. #include <types/path.hpp>
  23. #include <types/types.h>
  24. #include <types/user_types.hpp>
  25. #include <kernel/async/lock.hpp>
  26. #include <kernel/hw/timer.hpp>
  27. #include <kernel/interrupt.hpp>
  28. #include <kernel/log.hpp>
  29. #include <kernel/process.hpp>
  30. #include <kernel/signal.hpp>
  31. #include <kernel/syscall.hpp>
  32. #include <kernel/task/readyqueue.hpp>
  33. #include <kernel/task/thread.hpp>
  34. #include <kernel/tty.hpp>
  35. #include <kernel/user/thread_local.hpp>
  36. #include <kernel/utsname.hpp>
  37. #include <kernel/vfs.hpp>
  38. #define SYSCALL_HANDLERS_SIZE (404)
  39. #define NOT_IMPLEMENTED not_implemented(__FILE__, __LINE__)
  40. #define SYSCALL32_ARG1(type, name) type name = (type)((data)->regs.rbx)
  41. #define SYSCALL32_ARG2(type, name) type name = (type)((data)->regs.rcx)
  42. #define SYSCALL32_ARG3(type, name) type name = (type)((data)->regs.rdx)
  43. #define SYSCALL32_ARG4(type, name) type name = (type)((data)->regs.rsi)
  44. #define SYSCALL32_ARG5(type, name) type name = (type)((data)->regs.rdi)
  45. #define SYSCALL32_ARG6(type, name) type name = (type)((data)->regs.rbp)
  46. #define _DEFINE_SYSCALL32_ARGS1(type, name, ...) \
  47. SYSCALL32_ARG1(type, name); \
  48. __VA_OPT__(_DEFINE_SYSCALL32_ARGS2(__VA_ARGS__))
  49. #define _DEFINE_SYSCALL32_ARGS2(type, name, ...) \
  50. SYSCALL32_ARG2(type, name); \
  51. __VA_OPT__(_DEFINE_SYSCALL32_ARGS3(__VA_ARGS__))
  52. #define _DEFINE_SYSCALL32_ARGS3(type, name, ...) \
  53. SYSCALL32_ARG3(type, name); \
  54. __VA_OPT__(_DEFINE_SYSCALL32_ARGS4(__VA_ARGS__))
  55. #define _DEFINE_SYSCALL32_ARGS4(type, name, ...) \
  56. SYSCALL32_ARG4(type, name); \
  57. __VA_OPT__(_DEFINE_SYSCALL32_ARGS5(__VA_ARGS__))
  58. #define _DEFINE_SYSCALL32_ARGS5(type, name, ...) \
  59. SYSCALL32_ARG5(type, name); \
  60. __VA_OPT__(_DEFINE_SYSCALL32_ARGS6(__VA_ARGS__))
  61. #define _DEFINE_SYSCALL32_ARGS6(type, name, ...) SYSCALL32_ARG6(type, name);
  62. #define _DEFINE_SYSCALL32_END_PARAMS1(type, name, ...) \
  63. name __VA_OPT__(, _DEFINE_SYSCALL32_END_PARAMS2(__VA_ARGS__))
  64. #define _DEFINE_SYSCALL32_END_PARAMS2(type, name, ...) \
  65. name __VA_OPT__(, _DEFINE_SYSCALL32_END_PARAMS3(__VA_ARGS__))
  66. #define _DEFINE_SYSCALL32_END_PARAMS3(type, name, ...) \
  67. name __VA_OPT__(, _DEFINE_SYSCALL32_END_PARAMS4(__VA_ARGS__))
  68. #define _DEFINE_SYSCALL32_END_PARAMS4(type, name, ...) \
  69. name __VA_OPT__(, _DEFINE_SYSCALL32_END_PARAMS5(__VA_ARGS__))
  70. #define _DEFINE_SYSCALL32_END_PARAMS5(type, name, ...) \
  71. name __VA_OPT__(, _DEFINE_SYSCALL32_END_PARAMS6(__VA_ARGS__))
  72. #define _DEFINE_SYSCALL32_END_PARAMS6(type, name, ...) name __VA_OPT__(, void)
  73. #define _DEFINE_SYSCALL32_END(name, ...) \
  74. kernel::syscall::do_##name( \
  75. __VA_OPT__(_DEFINE_SYSCALL32_END_PARAMS1(__VA_ARGS__)))
  76. #define DEFINE_SYSCALL32_TO(name, to, ...) \
  77. static uint32_t _syscall32_##name(interrupt_stack* data, \
  78. mmx_registers* mmxregs) { \
  79. (void)data, (void)mmxregs; \
  80. __VA_OPT__(_DEFINE_SYSCALL32_ARGS1(__VA_ARGS__);) \
  81. return (uint32_t)(uintptr_t)_DEFINE_SYSCALL32_END( \
  82. to __VA_OPT__(, __VA_ARGS__)); \
  83. }
  84. #define DEFINE_SYSCALL32(name, ...) \
  85. DEFINE_SYSCALL32_TO(name, name __VA_OPT__(, ) __VA_ARGS__)
  86. #define DEFINE_SYSCALL32_NORETURN(name, ...) \
  87. [[noreturn]] static uint32_t _syscall32_##name(interrupt_stack* data, \
  88. mmx_registers* mmxregs) { \
  89. (void)data, (void)mmxregs; \
  90. __VA_OPT__(_DEFINE_SYSCALL32_ARGS1(__VA_ARGS__);) \
  91. _DEFINE_SYSCALL32_END(name, __VA_ARGS__); \
  92. }
  93. struct syscall_handler_t {
  94. uint32_t (*handler)(interrupt_stack*, mmx_registers*);
  95. const char* name;
  96. };
  97. static syscall_handler_t syscall_handlers[SYSCALL_HANDLERS_SIZE];
  98. static inline void not_implemented(const char* pos, int line) {
  99. kmsgf(
  100. "[kernel] the function at %s:%d is not implemented, killing the "
  101. "pid%d...",
  102. pos, line, current_process->pid);
  103. current_thread->send_signal(SIGSYS);
  104. }
  105. DEFINE_SYSCALL32(write, int, fd, const char __user*, buf, size_t, n)
  106. DEFINE_SYSCALL32(read, int, fd, char __user*, buf, size_t, n)
  107. DEFINE_SYSCALL32(close, int, fd)
  108. DEFINE_SYSCALL32(dup, int, old_fd)
  109. DEFINE_SYSCALL32(dup2, int, old_fd, int, new_fd)
  110. DEFINE_SYSCALL32(pipe, int __user*, pipefd)
  111. DEFINE_SYSCALL32(getdents, int, fd, char __user*, buf, size_t, cnt)
  112. DEFINE_SYSCALL32(getdents64, int, fd, char __user*, buf, size_t, cnt)
  113. DEFINE_SYSCALL32(open, const char __user*, path, int, flags, mode_t, mode)
  114. DEFINE_SYSCALL32(chdir, const char __user*, path)
  115. DEFINE_SYSCALL32(symlink, const char __user*, target, const char __user*,
  116. linkpath)
  117. DEFINE_SYSCALL32(readlink, const char __user*, pathname, char __user*, buf,
  118. size_t, buf_size)
  119. DEFINE_SYSCALL32(ioctl, int, fd, unsigned long, request, uintptr_t, arg3)
  120. DEFINE_SYSCALL32(munmap, uintptr_t, addr, size_t, len)
  121. DEFINE_SYSCALL32(poll, pollfd __user*, fds, nfds_t, nfds, int, timeout)
  122. DEFINE_SYSCALL32(mknod, const char __user*, pathname, mode_t, mode, dev_t, dev)
  123. DEFINE_SYSCALL32(access, const char __user*, pathname, int, mode)
  124. DEFINE_SYSCALL32(unlink, const char __user*, pathname)
  125. DEFINE_SYSCALL32(truncate, const char __user*, pathname, long, length)
  126. DEFINE_SYSCALL32(mkdir, const char __user*, pathname, mode_t, mode)
  127. DEFINE_SYSCALL32(socket, int, domain, int, type, int, protocol)
  128. DEFINE_SYSCALL32_TO(fcntl64, fcntl, int, fd, int, cmd, unsigned long, arg)
  129. DEFINE_SYSCALL32_TO(sendfile64, sendfile, int, out_fd, int, in_fd,
  130. off_t __user*, offset, size_t, count)
  131. DEFINE_SYSCALL32(statx, int, dirfd, const char __user*, path, int, flags,
  132. unsigned int, mask, statx __user*, statxbuf)
  133. DEFINE_SYSCALL32(mmap_pgoff, uintptr_t, addr, size_t, len, int, prot, int,
  134. flags, int, fd, off_t, pgoffset)
  135. DEFINE_SYSCALL32(mount, const char __user*, source, const char __user*, target,
  136. const char __user*, fstype, unsigned long, flags,
  137. const void __user*, _fsdata)
  138. DEFINE_SYSCALL32(waitpid, pid_t, waitpid, int __user*, arg1, int, options)
  139. DEFINE_SYSCALL32(getsid, pid_t, pid)
  140. DEFINE_SYSCALL32(setsid)
  141. DEFINE_SYSCALL32(getpgid, pid_t, pid)
  142. DEFINE_SYSCALL32(setpgid, pid_t, pid, pid_t, pgid)
  143. DEFINE_SYSCALL32(getcwd, char __user*, buf, size_t, buf_size)
  144. DEFINE_SYSCALL32(getpid)
  145. DEFINE_SYSCALL32(getppid)
  146. DEFINE_SYSCALL32(getuid)
  147. DEFINE_SYSCALL32(geteuid)
  148. DEFINE_SYSCALL32_TO(geteuid32, geteuid)
  149. DEFINE_SYSCALL32(getgid)
  150. DEFINE_SYSCALL32_TO(getgid32, getgid)
  151. DEFINE_SYSCALL32(gettid)
  152. DEFINE_SYSCALL32(set_thread_area, kernel::user::user_desc __user*, ptr)
  153. DEFINE_SYSCALL32(set_tid_address, int __user*, tidptr)
  154. DEFINE_SYSCALL32(prctl, int, option, uintptr_t, arg2)
  155. DEFINE_SYSCALL32(arch_prctl, int, option, uintptr_t, arg2)
  156. DEFINE_SYSCALL32(brk, uintptr_t, addr)
  157. DEFINE_SYSCALL32(umask, mode_t, mask)
  158. DEFINE_SYSCALL32(kill, pid_t, pid, int, sig)
  159. DEFINE_SYSCALL32(tkill, pid_t, tid, int, sig)
  160. DEFINE_SYSCALL32(rt_sigprocmask, int, how, const kernel::sigmask_type __user*,
  161. set, kernel::sigmask_type __user*, oldset, size_t, sigsetsize)
  162. DEFINE_SYSCALL32(rt_sigaction, int, signum, const kernel::sigaction __user*,
  163. act, kernel::sigaction __user*, oldact, size_t, sigsetsize)
  164. DEFINE_SYSCALL32(newuname, new_utsname __user*, buf)
  165. DEFINE_SYSCALL32_NORETURN(exit, int, status)
  166. DEFINE_SYSCALL32(gettimeofday, timeval __user*, tv, void __user*, tz)
  167. DEFINE_SYSCALL32_TO(clock_gettime64, clock_gettime, clockid_t, clk_id,
  168. timespec __user*, tp)
  169. extern "C" void NORETURN ISR_stub_restore();
  170. static uint32_t _syscall32_fork(interrupt_stack* data, mmx_registers* mmxregs) {
  171. auto& newproc = procs->copy_from(*current_process);
  172. auto [iter_newthd, inserted] =
  173. newproc.thds.emplace(*current_thread, newproc.pid);
  174. assert(inserted);
  175. auto* newthd = &*iter_newthd;
  176. auto newthd_prev_sp = newthd->kstack.sp;
  177. assert(!(newthd_prev_sp & 0xf));
  178. newthd->kstack.sp -= sizeof(interrupt_stack);
  179. memcpy((void*)(newthd->kstack.sp), data, sizeof(interrupt_stack));
  180. ((interrupt_stack*)(newthd->kstack.sp))->regs.rax = 0; // return value
  181. auto isr_restore_sp = newthd->kstack.sp;
  182. newthd->kstack.sp -= sizeof(mmx_registers);
  183. memcpy((void*)(newthd->kstack.sp), mmxregs, sizeof(mmx_registers));
  184. // asm_ctx_switch stack
  185. // return(start) address
  186. newthd->kstack.pushq((uintptr_t)ISR_stub_restore);
  187. newthd->kstack.pushq(0); // flags
  188. newthd->kstack.pushq(0); // r15
  189. newthd->kstack.pushq(0); // r14
  190. newthd->kstack.pushq(0); // r13
  191. newthd->kstack.pushq(0); // r12
  192. newthd->kstack.pushq(0); // rbp
  193. newthd->kstack.pushq(isr_restore_sp); // rbx
  194. newthd->kstack.pushq(0); // 0 for alignment
  195. newthd->kstack.pushq(newthd_prev_sp); // previous sp
  196. kernel::task::dispatcher::enqueue(newthd);
  197. return newproc.pid;
  198. }
  199. static uint32_t _syscall32_llseek(interrupt_stack* data, mmx_registers*) {
  200. SYSCALL32_ARG1(unsigned int, fd);
  201. SYSCALL32_ARG2(unsigned long, offset_high);
  202. SYSCALL32_ARG3(unsigned long, offset_low);
  203. SYSCALL32_ARG4(off_t __user*, result);
  204. SYSCALL32_ARG5(unsigned int, whence);
  205. if (!result)
  206. return -EFAULT;
  207. off_t offset = offset_low | (offset_high << 32);
  208. auto ret = kernel::syscall::do_lseek(fd, offset, whence);
  209. if (ret < 0)
  210. return ret;
  211. // TODO: copy_to_user
  212. *result = ret;
  213. return 0;
  214. }
  215. static uint32_t _syscall32_readv(interrupt_stack* data, mmx_registers*) {
  216. SYSCALL32_ARG1(int, fd);
  217. SYSCALL32_ARG2(const types::iovec32 __user*, _iov);
  218. SYSCALL32_ARG3(int, iovcnt);
  219. // TODO: use copy_from_user
  220. if (!_iov)
  221. return -EFAULT;
  222. std::vector<iovec> iov(iovcnt);
  223. for (int i = 0; i < iovcnt; ++i) {
  224. // TODO: check access right
  225. uintptr_t base = _iov[i].iov_base;
  226. iov[i].iov_base = (void*)base;
  227. iov[i].iov_len = _iov[i].iov_len;
  228. }
  229. return kernel::syscall::do_readv(fd, iov.data(), iovcnt);
  230. }
  231. static uint32_t _syscall32_writev(interrupt_stack* data, mmx_registers*) {
  232. SYSCALL32_ARG1(int, fd);
  233. SYSCALL32_ARG2(const types::iovec32 __user*, _iov);
  234. SYSCALL32_ARG3(int, iovcnt);
  235. // TODO: use copy_from_user
  236. if (!_iov)
  237. return -EFAULT;
  238. std::vector<iovec> iov(iovcnt);
  239. for (int i = 0; i < iovcnt; ++i) {
  240. // TODO: check access right
  241. uintptr_t base = _iov[i].iov_base;
  242. iov[i].iov_base = (void*)base;
  243. iov[i].iov_len = _iov[i].iov_len;
  244. }
  245. return kernel::syscall::do_writev(fd, iov.data(), iovcnt);
  246. }
  247. [[noreturn]] static uint32_t _syscall32_exit_group(interrupt_stack* data,
  248. mmx_registers* mmxregs) {
  249. // we implement exit_group as exit for now
  250. _syscall32_exit(data, mmxregs);
  251. }
  252. static uint32_t _syscall32_execve(interrupt_stack* data, mmx_registers*) {
  253. SYSCALL32_ARG1(const char __user*, exec);
  254. SYSCALL32_ARG2(const uint32_t __user*, argv);
  255. SYSCALL32_ARG3(const uint32_t __user*, envp);
  256. if (!exec || !argv || !envp)
  257. return -EFAULT;
  258. std::vector<std::string> args, envs;
  259. // TODO: use copy_from_user
  260. while (*argv) {
  261. uintptr_t addr = *(argv++);
  262. args.push_back((char __user*)addr);
  263. }
  264. while (*envp) {
  265. uintptr_t addr = *(envp++);
  266. envs.push_back((char __user*)addr);
  267. }
  268. auto retval = kernel::syscall::do_execve(exec, args, envs);
  269. if (retval.status == 0) {
  270. // TODO: switch cs ans ss
  271. data->v_rip = retval.ip;
  272. data->rsp = retval.sp;
  273. }
  274. return retval.status;
  275. }
  276. static uint32_t _syscall32_wait4(interrupt_stack* data,
  277. mmx_registers* mmxregs) {
  278. SYSCALL32_ARG4(void __user*, rusage);
  279. // TODO: getrusage
  280. if (rusage)
  281. return -EINVAL;
  282. return _syscall32_waitpid(data, mmxregs);
  283. }
  284. void kernel::handle_syscall32(int no, interrupt_stack* data,
  285. mmx_registers* mmxregs) {
  286. if (no >= SYSCALL_HANDLERS_SIZE || !syscall_handlers[no].handler) {
  287. kmsgf("[kernel] syscall %d(%x) isn't implemented", no, no);
  288. NOT_IMPLEMENTED;
  289. if (current_thread->signals.pending_signal())
  290. current_thread->signals.handle(data, mmxregs);
  291. return;
  292. }
  293. // kmsgf_debug("[kernel:debug] (pid\t%d) %s()", current_process->pid,
  294. // syscall_handlers[no].name);
  295. asm volatile("sti");
  296. data->regs.rax = syscall_handlers[no].handler(data, mmxregs);
  297. data->regs.r8 = 0;
  298. data->regs.r9 = 0;
  299. data->regs.r10 = 0;
  300. data->regs.r11 = 0;
  301. data->regs.r12 = 0;
  302. data->regs.r13 = 0;
  303. data->regs.r14 = 0;
  304. data->regs.r15 = 0;
  305. if (current_thread->signals.pending_signal())
  306. current_thread->signals.handle(data, mmxregs);
  307. }
  308. #define REGISTER_SYSCALL_HANDLER(no, _name) \
  309. syscall_handlers[(no)].handler = _syscall32_##_name; \
  310. syscall_handlers[(no)].name = #_name;
  311. SECTION(".text.kinit")
  312. void kernel::init_syscall_table() {
  313. // 32bit syscalls
  314. REGISTER_SYSCALL_HANDLER(0x01, exit);
  315. REGISTER_SYSCALL_HANDLER(0x02, fork);
  316. REGISTER_SYSCALL_HANDLER(0x03, read);
  317. REGISTER_SYSCALL_HANDLER(0x04, write);
  318. REGISTER_SYSCALL_HANDLER(0x05, open);
  319. REGISTER_SYSCALL_HANDLER(0x06, close);
  320. REGISTER_SYSCALL_HANDLER(0x07, waitpid);
  321. REGISTER_SYSCALL_HANDLER(0x0a, unlink);
  322. REGISTER_SYSCALL_HANDLER(0x0b, execve);
  323. REGISTER_SYSCALL_HANDLER(0x0c, chdir);
  324. REGISTER_SYSCALL_HANDLER(0x0e, mknod);
  325. REGISTER_SYSCALL_HANDLER(0x14, getpid);
  326. REGISTER_SYSCALL_HANDLER(0x15, mount);
  327. REGISTER_SYSCALL_HANDLER(0x21, access);
  328. REGISTER_SYSCALL_HANDLER(0x25, kill);
  329. REGISTER_SYSCALL_HANDLER(0x27, mkdir);
  330. REGISTER_SYSCALL_HANDLER(0x29, dup);
  331. REGISTER_SYSCALL_HANDLER(0x2a, pipe);
  332. REGISTER_SYSCALL_HANDLER(0x2d, brk);
  333. REGISTER_SYSCALL_HANDLER(0x2f, getgid);
  334. REGISTER_SYSCALL_HANDLER(0x36, ioctl);
  335. REGISTER_SYSCALL_HANDLER(0x39, setpgid);
  336. REGISTER_SYSCALL_HANDLER(0x3c, umask);
  337. REGISTER_SYSCALL_HANDLER(0x3f, dup2);
  338. REGISTER_SYSCALL_HANDLER(0x40, getppid);
  339. REGISTER_SYSCALL_HANDLER(0x42, setsid);
  340. REGISTER_SYSCALL_HANDLER(0x4e, gettimeofday);
  341. REGISTER_SYSCALL_HANDLER(0x53, symlink);
  342. REGISTER_SYSCALL_HANDLER(0x55, readlink);
  343. REGISTER_SYSCALL_HANDLER(0x5b, munmap);
  344. REGISTER_SYSCALL_HANDLER(0x5c, truncate);
  345. REGISTER_SYSCALL_HANDLER(0x72, wait4);
  346. REGISTER_SYSCALL_HANDLER(0x7a, newuname);
  347. REGISTER_SYSCALL_HANDLER(0x84, getpgid);
  348. REGISTER_SYSCALL_HANDLER(0x8c, llseek);
  349. REGISTER_SYSCALL_HANDLER(0x8d, getdents);
  350. REGISTER_SYSCALL_HANDLER(0x91, readv);
  351. REGISTER_SYSCALL_HANDLER(0x92, writev);
  352. REGISTER_SYSCALL_HANDLER(0x93, getsid);
  353. REGISTER_SYSCALL_HANDLER(0xa8, poll);
  354. REGISTER_SYSCALL_HANDLER(0xac, prctl);
  355. REGISTER_SYSCALL_HANDLER(0xae, rt_sigaction);
  356. REGISTER_SYSCALL_HANDLER(0xaf, rt_sigprocmask);
  357. REGISTER_SYSCALL_HANDLER(0xb7, getcwd);
  358. REGISTER_SYSCALL_HANDLER(0xc0, mmap_pgoff);
  359. REGISTER_SYSCALL_HANDLER(0xc7, getuid);
  360. REGISTER_SYSCALL_HANDLER(0xc8, getgid32);
  361. REGISTER_SYSCALL_HANDLER(0xc9, geteuid);
  362. REGISTER_SYSCALL_HANDLER(0xca, geteuid32);
  363. REGISTER_SYSCALL_HANDLER(0xdc, getdents64);
  364. REGISTER_SYSCALL_HANDLER(0xdd, fcntl64);
  365. REGISTER_SYSCALL_HANDLER(0xe0, gettid);
  366. REGISTER_SYSCALL_HANDLER(0xee, tkill);
  367. REGISTER_SYSCALL_HANDLER(0xef, sendfile64);
  368. REGISTER_SYSCALL_HANDLER(0xf3, set_thread_area);
  369. REGISTER_SYSCALL_HANDLER(0xfc, exit_group);
  370. REGISTER_SYSCALL_HANDLER(0x102, set_tid_address);
  371. REGISTER_SYSCALL_HANDLER(0x167, socket);
  372. REGISTER_SYSCALL_HANDLER(0x17f, statx);
  373. REGISTER_SYSCALL_HANDLER(0x180, arch_prctl);
  374. REGISTER_SYSCALL_HANDLER(0x193, clock_gettime64);
  375. }