2020301918-os/lib/user/syscall.c
2022-11-04 13:57:40 +08:00

127 lines
2.6 KiB
C

#include <user/syscall.h>
// 第一个冒号区间:汇编命令
// 第二个冒号区间:输出操作符扩展
// "=a" 这条命令结束后将eax寄存器的值赋给ret变量
// 第三个冒号区间:输入操作符扩展
// "a" 将变量赋给eax寄存器
// "b" 将变量赋给ebx寄存器
// "c" 将变量赋给ecx寄存器
// "d" 将变量赋给edx寄存器
// "S" 将变量赋给esi寄存器
// "D" 将变量赋给edi寄存器
// 第四个冒号区间:指令约束,当汇编指令会修改相关操作时需要修改
// 最主要是防被gcc编译器优化
// "a/b/c/d/S/D" 提醒编译器这些寄存器的值会在汇编指令执行中被修改
// "cc" 提醒编译器eflags寄存器的值在汇编指令执行中会被修改
// "memory" 提醒编译器内存中的数据在汇编指令执行中会被修改
ssize_t
syscall0(size_t NR_syscall)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall)
: "cc", "memory");
return ret;
}
ssize_t
syscall1(size_t NR_syscall, size_t p1)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall),
"b" (p1)
: "cc", "memory");
return ret;
}
ssize_t syscall2(size_t NR_syscall, size_t p1, size_t p2)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall),
"b" (p1),
"c" (p2)
: "cc", "memory");
return ret;
}
ssize_t syscall3(size_t NR_syscall, size_t p1, size_t p2, size_t p3)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall),
"b" (p1),
"c" (p2),
"d" (p3)
: "cc", "memory");
return ret;
}
ssize_t syscall4(size_t NR_syscall, size_t p1, size_t p2,
size_t p3, size_t p4)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall),
"b" (p1),
"c" (p2),
"d" (p3),
"S" (p4)
: "cc", "memory");
return ret;
}
ssize_t syscall5(size_t NR_syscall, size_t p1, size_t p2,
size_t p3, size_t p4, size_t p5)
{
ssize_t ret;
asm volatile("int $0x80"
: "=a"(ret)
: "a" (NR_syscall),
"b" (p1),
"c" (p2),
"d" (p3),
"S" (p4),
"D" (p5)
: "cc", "memory");
return ret;
}
ssize_t
get_ticks()
{
return syscall0(_NR_get_ticks);
}
ssize_t
get_pid()
{
return syscall0(_NR_get_pid);
}
ssize_t
read(int fd, void *buf, size_t count)
{
return syscall3(_NR_read, fd, (size_t)buf, count);
}
ssize_t
write(int fd, const void *buf, size_t count)
{
return syscall3(_NR_write, fd, (size_t)buf, count);
}
ssize_t
delay_ticks(u32 ticks)
{
return syscall1(_NR_delay_ticks, ticks);
}
ssize_t lml_mmap(int pid, void* src, void* dst, size_t length)
{
return syscall4(_NR_mmap, pid, (size_t)src, (size_t)dst, length);
}