xref: /DragonOS/kernel/src/syscall/syscall.c (revision 2b7818e80e00fcfe4d03533f587cc125ea5e4bec)
12813126eSlogin #include "syscall.h"
2*c3dc6f2fSLoGin #include <arch/arch.h>
32813126eSlogin #include <common/errno.h>
42813126eSlogin #include <common/fcntl.h>
52813126eSlogin #include <common/string.h>
62813126eSlogin #include <mm/slab.h>
72813126eSlogin #include <process/process.h>
84fda81ceSLoGin 
94fda81ceSLoGin #if ARCH(I386) || ARCH(X86_64)
102813126eSlogin // 导出系统调用入口函数,定义在entry.S
112813126eSlogin extern void syscall_int(void);
122813126eSlogin 
132813126eSlogin /**
142813126eSlogin  * @brief 通过中断进入系统调用
152813126eSlogin  *
162813126eSlogin  * @param syscall_id
172813126eSlogin  * @param arg0
182813126eSlogin  * @param arg1
192813126eSlogin  * @param arg2
202813126eSlogin  * @param arg3
212813126eSlogin  * @param arg4
222813126eSlogin  * @param arg5
232813126eSlogin  * @param arg6
242813126eSlogin  * @param arg7
252813126eSlogin  * @return long
262813126eSlogin  */
272813126eSlogin 
enter_syscall_int(ul syscall_id,ul arg0,ul arg1,ul arg2,ul arg3,ul arg4,ul arg5)28*c3dc6f2fSLoGin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
29*c3dc6f2fSLoGin                        ul arg4, ul arg5) {
302813126eSlogin   long err_code;
31f2022a8aSLoGin   __asm__ __volatile__("movq %2, %%rdi \n\t"
32f2022a8aSLoGin                        "movq %3, %%rsi \n\t"
33f2022a8aSLoGin                        "movq %4, %%rdx \n\t"
34f2022a8aSLoGin                        "movq %5, %%r10 \n\t"
35f2022a8aSLoGin                        "movq %6, %%r8 \n\t"
36f2022a8aSLoGin                        "movq %7, %%r9 \n\t"
372813126eSlogin                        "int $0x80   \n\t"
382813126eSlogin                        : "=a"(err_code)
39*c3dc6f2fSLoGin                        : "a"(syscall_id), "m"(arg0), "m"(arg1), "m"(arg2),
40*c3dc6f2fSLoGin                          "m"(arg3), "m"(arg4), "m"(arg5)
41f2022a8aSLoGin                        : "memory", "r8", "r9", "r10", "rdi", "rsi", "rdx");
422813126eSlogin 
432813126eSlogin   return err_code;
442813126eSlogin }
452813126eSlogin 
464fda81ceSLoGin #else
enter_syscall_int(ul syscall_id,ul arg0,ul arg1,ul arg2,ul arg3,ul arg4,ul arg5)47*c3dc6f2fSLoGin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
48*c3dc6f2fSLoGin                        ul arg4, ul arg5) {
49*c3dc6f2fSLoGin   while (1) {
504fda81ceSLoGin     /* code */
514fda81ceSLoGin   }
524fda81ceSLoGin }
534fda81ceSLoGin 
544fda81ceSLoGin #endif
55