syscall.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #pragma once
  2. #include <string>
  3. #include <vector>
  4. #include <bits/alltypes.h>
  5. #include <poll.h>
  6. #include <sys/stat.h>
  7. #include <sys/types.h>
  8. #include <sys/uio.h>
  9. #include <sys/utsname.h>
  10. #include <time.h>
  11. #include <types/types.h>
  12. #include <kernel/interrupt.hpp>
  13. #include <kernel/signal.hpp>
  14. #include <kernel/user/thread_local.hpp>
  15. #define SYSCALL64_ARG1(type, name) type name = (type)((data)->head.s_regs.rdi)
  16. #define SYSCALL64_ARG2(type, name) type name = (type)((data)->head.s_regs.rsi)
  17. #define SYSCALL64_ARG3(type, name) type name = (type)((data)->head.s_regs.rdx)
  18. #define SYSCALL64_ARG4(type, name) type name = (type)((data)->head.s_regs.r10)
  19. #define SYSCALL64_ARG5(type, name) type name = (type)((data)->head.s_regs.r8)
  20. #define SYSCALL64_ARG6(type, name) type name = (type)((data)->head.s_regs.r9)
  21. namespace kernel {
  22. void init_syscall_table();
  23. void handle_syscall32(int no, interrupt_stack* data, mmx_registers* mmxregs);
  24. void handle_syscall64(int no, interrupt_stack* data, mmx_registers* mmxregs);
  25. namespace syscall {
  26. // in fileops.cc
  27. ssize_t do_write(int fd, const char __user* buf, size_t n);
  28. ssize_t do_read(int fd, char __user* buf, size_t n);
  29. int do_close(int fd);
  30. int do_dup(int old_fd);
  31. int do_dup2(int old_fd, int new_fd);
  32. int do_pipe(int __user* pipefd);
  33. ssize_t do_getdents(int fd, char __user* buf, size_t cnt);
  34. ssize_t do_getdents64(int fd, char __user* buf, size_t cnt);
  35. int do_open(const char __user* path, int flags, mode_t mode);
  36. int do_symlink(const char __user* target, const char __user* linkpath);
  37. int do_readlink(const char __user* pathname, char __user* buf,
  38. size_t buf_size);
  39. int do_ioctl(int fd, unsigned long request, uintptr_t arg3);
  40. ssize_t do_readv(int fd, const iovec* iov, int iovcnt);
  41. ssize_t do_writev(int fd, const iovec* iov, int iovcnt);
  42. off_t do_lseek(int fd, off_t offset, int whence);
  43. uintptr_t do_mmap_pgoff(uintptr_t addr, size_t len, int prot, int flags,
  44. int fd, off_t pgoffset);
  45. int do_munmap(uintptr_t addr, size_t len);
  46. ssize_t do_sendfile(int out_fd, int in_fd, off_t __user* offset,
  47. size_t count);
  48. int do_statx(int dirfd, const char __user* path, int flags,
  49. unsigned int mask, statx __user* statxbuf);
  50. int do_fcntl(int fd, int cmd, unsigned long arg);
  51. int do_poll(pollfd __user* fds, nfds_t nfds, int timeout);
  52. int do_mknod(const char __user* pathname, mode_t mode, dev_t dev);
  53. int do_access(const char __user* pathname, int mode);
  54. int do_unlink(const char __user* pathname);
  55. int do_truncate(const char __user* pathname, long length);
  56. int do_mkdir(const char __user* pathname, mode_t mode);
  57. int do_socket(int domain, int type, int protocol);
  58. // in procops.cc
  59. int do_chdir(const char __user* path);
  60. [[noreturn]] int do_exit(int status);
  61. int do_waitpid(pid_t waitpid, int __user* arg1, int options);
  62. pid_t do_getsid(pid_t pid);
  63. pid_t do_setsid();
  64. pid_t do_getpgid(pid_t pid);
  65. int do_setpgid(pid_t pid, pid_t pgid);
  66. int do_set_thread_area(user::user_desc __user* ptr);
  67. pid_t do_set_tid_address(int __user* tidptr);
  68. int do_prctl(int option, uintptr_t arg2);
  69. int do_arch_prctl(int option, uintptr_t arg2);
  70. pid_t do_getpid();
  71. pid_t do_getppid();
  72. uid_t do_getuid();
  73. uid_t do_geteuid();
  74. gid_t do_getgid();
  75. pid_t do_gettid();
  76. int do_getcwd(char __user* buf, size_t buf_size);
  77. uintptr_t do_brk(uintptr_t addr);
  78. int do_umask(mode_t mask);
  79. int do_kill(pid_t pid, int sig);
  80. int do_tkill(pid_t pid, int sig);
  81. int do_rt_sigprocmask(int how, const kernel::sigmask_type __user* set,
  82. kernel::sigmask_type __user* oldset,
  83. size_t sigsetsize);
  84. int do_rt_sigaction(int signum, const sigaction __user* act,
  85. sigaction __user* oldact, size_t sigsetsize);
  86. int do_newuname(new_utsname __user* buf);
  87. struct execve_retval {
  88. uintptr_t ip;
  89. uintptr_t sp;
  90. int status;
  91. };
  92. execve_retval do_execve(const std::string& exec,
  93. const std::vector<std::string>& args,
  94. const std::vector<std::string>& envs);
  95. // in mount.cc
  96. int do_mount(const char __user* source, const char __user* target,
  97. const char __user* fstype, unsigned long flags,
  98. const void __user* _fsdata);
  99. // in infoops.cc
  100. int do_clock_gettime(clockid_t clk_id, timespec __user* tp);
  101. int do_gettimeofday(timeval __user* tv, void __user* tz);
  102. } // namespace syscall
  103. } // namespace kernel