xref: /DragonOS/kernel/src/syscall/syscall.c (revision c3dc6f2ff9169c309d1cbf47dcb9e4528d509b2f)
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>
82813126eSlogin #include <time/sleep.h>
94fda81ceSLoGin 
104fda81ceSLoGin #if ARCH(I386) || ARCH(X86_64)
112813126eSlogin // 导出系统调用入口函数,定义在entry.S
122813126eSlogin extern void syscall_int(void);
132813126eSlogin 
142813126eSlogin /**
152813126eSlogin  * @brief 通过中断进入系统调用
162813126eSlogin  *
172813126eSlogin  * @param syscall_id
182813126eSlogin  * @param arg0
192813126eSlogin  * @param arg1
202813126eSlogin  * @param arg2
212813126eSlogin  * @param arg3
222813126eSlogin  * @param arg4
232813126eSlogin  * @param arg5
242813126eSlogin  * @param arg6
252813126eSlogin  * @param arg7
262813126eSlogin  * @return long
272813126eSlogin  */
282813126eSlogin 
29*c3dc6f2fSLoGin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
30*c3dc6f2fSLoGin                        ul arg4, ul arg5) {
312813126eSlogin   long err_code;
32f2022a8aSLoGin   __asm__ __volatile__("movq %2, %%rdi \n\t"
33f2022a8aSLoGin                        "movq %3, %%rsi \n\t"
34f2022a8aSLoGin                        "movq %4, %%rdx \n\t"
35f2022a8aSLoGin                        "movq %5, %%r10 \n\t"
36f2022a8aSLoGin                        "movq %6, %%r8 \n\t"
37f2022a8aSLoGin                        "movq %7, %%r9 \n\t"
382813126eSlogin                        "int $0x80   \n\t"
392813126eSlogin                        : "=a"(err_code)
40*c3dc6f2fSLoGin                        : "a"(syscall_id), "m"(arg0), "m"(arg1), "m"(arg2),
41*c3dc6f2fSLoGin                          "m"(arg3), "m"(arg4), "m"(arg5)
42f2022a8aSLoGin                        : "memory", "r8", "r9", "r10", "rdi", "rsi", "rdx");
432813126eSlogin 
442813126eSlogin   return err_code;
452813126eSlogin }
462813126eSlogin 
474fda81ceSLoGin #else
48*c3dc6f2fSLoGin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
49*c3dc6f2fSLoGin                        ul arg4, ul arg5) {
50*c3dc6f2fSLoGin   while (1) {
514fda81ceSLoGin     /* code */
524fda81ceSLoGin   }
534fda81ceSLoGin }
544fda81ceSLoGin 
554fda81ceSLoGin #endif
56