xref: /DragonOS/kernel/src/syscall/syscall.c (revision 4fda81ce81939d83b74c8042d6fb4223deff3685)
12813126eSlogin #include "syscall.h"
22813126eSlogin #include <common/errno.h>
32813126eSlogin #include <common/fcntl.h>
42813126eSlogin #include <common/string.h>
52813126eSlogin #include <exception/gate.h>
62813126eSlogin #include <exception/irq.h>
72224c93eSguanjinquan #include <filesystem/vfs/VFS.h>
82813126eSlogin #include <mm/slab.h>
92813126eSlogin #include <process/process.h>
102813126eSlogin #include <time/sleep.h>
11*4fda81ceSLoGin #include <arch/arch.h>
12*4fda81ceSLoGin 
13*4fda81ceSLoGin #if ARCH(I386) || ARCH(X86_64)
142813126eSlogin // 导出系统调用入口函数,定义在entry.S
152813126eSlogin extern void syscall_int(void);
162813126eSlogin 
172813126eSlogin /**
182813126eSlogin  * @brief 通过中断进入系统调用
192813126eSlogin  *
202813126eSlogin  * @param syscall_id
212813126eSlogin  * @param arg0
222813126eSlogin  * @param arg1
232813126eSlogin  * @param arg2
242813126eSlogin  * @param arg3
252813126eSlogin  * @param arg4
262813126eSlogin  * @param arg5
272813126eSlogin  * @param arg6
282813126eSlogin  * @param arg7
292813126eSlogin  * @return long
302813126eSlogin  */
312813126eSlogin 
322813126eSlogin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3, ul arg4, ul arg5, ul arg6, ul arg7)
332813126eSlogin {
342813126eSlogin     long err_code;
352813126eSlogin     __asm__ __volatile__("movq %2, %%r8 \n\t"
362813126eSlogin                          "movq %3, %%r9 \n\t"
372813126eSlogin                          "movq %4, %%r10 \n\t"
382813126eSlogin                          "movq %5, %%r11 \n\t"
392813126eSlogin                          "movq %6, %%r12 \n\t"
402813126eSlogin                          "movq %7, %%r13 \n\t"
412813126eSlogin                          "movq %8, %%r14 \n\t"
422813126eSlogin                          "movq %9, %%r15 \n\t"
432813126eSlogin                          "int $0x80   \n\t"
442813126eSlogin                          : "=a"(err_code)
452813126eSlogin                          : "a"(syscall_id), "m"(arg0), "m"(arg1), "m"(arg2), "m"(arg3), "m"(arg4), "m"(arg5), "m"(arg6),
462813126eSlogin                            "m"(arg7)
472813126eSlogin                          : "memory", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rcx", "rdx");
482813126eSlogin 
492813126eSlogin     return err_code;
502813126eSlogin }
512813126eSlogin 
52*4fda81ceSLoGin #else
53*4fda81ceSLoGin long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3, ul arg4, ul arg5, ul arg6, ul arg7){
54*4fda81ceSLoGin   while (1)
55*4fda81ceSLoGin   {
56*4fda81ceSLoGin     /* code */
57*4fda81ceSLoGin   }
58*4fda81ceSLoGin 
59*4fda81ceSLoGin }
60*4fda81ceSLoGin 
61*4fda81ceSLoGin #endif
62*4fda81ceSLoGin 
632813126eSlogin /**
642813126eSlogin  * @brief 打印字符串的系统调用
652813126eSlogin  *
662813126eSlogin  * 当arg1和arg2均为0时,打印黑底白字,否则按照指定的前景色和背景色来打印
672813126eSlogin  *
682813126eSlogin  * @param regs 寄存器
692813126eSlogin  * @param arg0 要打印的字符串
702813126eSlogin  * @param arg1 前景色
712813126eSlogin  * @param arg2 背景色
722813126eSlogin  * @return ul 返回值
732813126eSlogin  */
74ab5c8ca4Slogin ul do_put_string(char *s, uint32_t front_color, uint32_t background_color)
752813126eSlogin {
762813126eSlogin 
77ab5c8ca4Slogin     printk_color(front_color, background_color, s);
782813126eSlogin     return 0;
792813126eSlogin }
802813126eSlogin 
812813126eSlogin 
82