mirror of
https://github.com/SerenityOS/serenity
synced 2024-10-04 15:09:40 +00:00
Kernel/riscv64: Add RISC-V Syscall API
This commit is contained in:
parent
6824d2a788
commit
fd8858ace2
|
@ -544,16 +544,17 @@ struct SC_faccessat_params {
|
|||
void initialize();
|
||||
int sync();
|
||||
|
||||
# if ARCH(X86_64) || ARCH(AARCH64)
|
||||
# if ARCH(X86_64) || ARCH(AARCH64) || ARCH(RISCV64)
|
||||
inline uintptr_t invoke(Function function)
|
||||
{
|
||||
uintptr_t result;
|
||||
# if ARCH(X86_64)
|
||||
uintptr_t result;
|
||||
asm volatile("syscall"
|
||||
: "=a"(result)
|
||||
: "a"(function)
|
||||
: "rcx", "r11", "memory");
|
||||
# elif ARCH(AARCH64)
|
||||
uintptr_t result;
|
||||
register uintptr_t x0 asm("x0");
|
||||
register uintptr_t x8 asm("x8") = function;
|
||||
asm volatile("svc #0"
|
||||
|
@ -561,6 +562,13 @@ inline uintptr_t invoke(Function function)
|
|||
: "r"(x8)
|
||||
: "memory");
|
||||
result = x0;
|
||||
# elif ARCH(RISCV64)
|
||||
register uintptr_t a7 asm("a7") = function;
|
||||
register uintptr_t result asm("a0");
|
||||
asm volatile("ecall"
|
||||
: "=r"(result)
|
||||
: "r"(a7)
|
||||
: "memory");
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
|
@ -568,13 +576,14 @@ inline uintptr_t invoke(Function function)
|
|||
template<typename T1>
|
||||
inline uintptr_t invoke(Function function, T1 arg1)
|
||||
{
|
||||
uintptr_t result;
|
||||
# if ARCH(X86_64)
|
||||
uintptr_t result;
|
||||
asm volatile("syscall"
|
||||
: "=a"(result)
|
||||
: "a"(function), "d"((uintptr_t)arg1)
|
||||
: "rcx", "r11", "memory");
|
||||
# elif ARCH(AARCH64)
|
||||
uintptr_t result;
|
||||
register uintptr_t x0 asm("x0");
|
||||
register uintptr_t x1 asm("x1") = arg1;
|
||||
register uintptr_t x8 asm("x8") = function;
|
||||
|
@ -583,6 +592,14 @@ inline uintptr_t invoke(Function function, T1 arg1)
|
|||
: "r"(x1), "r"(x8)
|
||||
: "memory");
|
||||
result = x0;
|
||||
# elif ARCH(RISCV64)
|
||||
register uintptr_t a0 asm("a0") = arg1;
|
||||
register uintptr_t a7 asm("a7") = function;
|
||||
register uintptr_t result asm("a0");
|
||||
asm volatile("ecall"
|
||||
: "=r"(result)
|
||||
: "0"(a0), "r"(a7)
|
||||
: "memory");
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
|
@ -590,13 +607,14 @@ inline uintptr_t invoke(Function function, T1 arg1)
|
|||
template<typename T1, typename T2>
|
||||
inline uintptr_t invoke(Function function, T1 arg1, T2 arg2)
|
||||
{
|
||||
uintptr_t result;
|
||||
# if ARCH(X86_64)
|
||||
uintptr_t result;
|
||||
asm volatile("syscall"
|
||||
: "=a"(result)
|
||||
: "a"(function), "d"((uintptr_t)arg1), "D"((uintptr_t)arg2)
|
||||
: "rcx", "r11", "memory");
|
||||
# elif ARCH(AARCH64)
|
||||
uintptr_t result;
|
||||
register uintptr_t x0 asm("x0");
|
||||
register uintptr_t x1 asm("x1") = arg1;
|
||||
register uintptr_t x2 asm("x2") = arg2;
|
||||
|
@ -606,6 +624,15 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2)
|
|||
: "r"(x1), "r"(x2), "r"(x8)
|
||||
: "memory");
|
||||
result = x0;
|
||||
# elif ARCH(RISCV64)
|
||||
register uintptr_t a0 asm("a0") = arg1;
|
||||
register uintptr_t a1 asm("a1") = arg2;
|
||||
register uintptr_t a7 asm("a7") = function;
|
||||
register uintptr_t result asm("a0");
|
||||
asm volatile("ecall"
|
||||
: "=r"(result)
|
||||
: "0"(a0), "r"(a1), "r"(a7)
|
||||
: "memory");
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
|
@ -613,13 +640,14 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2)
|
|||
template<typename T1, typename T2, typename T3>
|
||||
inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
|
||||
{
|
||||
uintptr_t result;
|
||||
# if ARCH(X86_64)
|
||||
uintptr_t result;
|
||||
asm volatile("syscall"
|
||||
: "=a"(result)
|
||||
: "a"(function), "d"((uintptr_t)arg1), "D"((uintptr_t)arg2), "b"((uintptr_t)arg3)
|
||||
: "rcx", "r11", "memory");
|
||||
# elif ARCH(AARCH64)
|
||||
uintptr_t result;
|
||||
register uintptr_t x0 asm("x0");
|
||||
register uintptr_t x1 asm("x1") = arg1;
|
||||
register uintptr_t x2 asm("x2") = arg2;
|
||||
|
@ -630,6 +658,16 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
|
|||
: "r"(x1), "r"(x2), "r"(x3), "r"(x8)
|
||||
: "memory");
|
||||
result = x0;
|
||||
# elif ARCH(RISCV64)
|
||||
register uintptr_t a0 asm("a0") = arg1;
|
||||
register uintptr_t a1 asm("a1") = arg2;
|
||||
register uintptr_t a2 asm("a2") = arg3;
|
||||
register uintptr_t a7 asm("a7") = function;
|
||||
register uintptr_t result asm("a0");
|
||||
asm volatile("ecall"
|
||||
: "=r"(result)
|
||||
: "0"(a0), "r"(a1), "r"(a2), "r"(a7)
|
||||
: "memory");
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
|
@ -637,13 +675,14 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
|
|||
template<typename T1, typename T2, typename T3, typename T4>
|
||||
inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
|
||||
{
|
||||
uintptr_t result;
|
||||
# if ARCH(X86_64)
|
||||
uintptr_t result;
|
||||
asm volatile("syscall"
|
||||
: "=a"(result)
|
||||
: "a"(function), "d"((uintptr_t)arg1), "D"((uintptr_t)arg2), "b"((uintptr_t)arg3), "S"((uintptr_t)arg4)
|
||||
: "memory");
|
||||
# elif ARCH(AARCH64)
|
||||
uintptr_t result;
|
||||
register uintptr_t x0 asm("x0");
|
||||
register uintptr_t x1 asm("x1") = arg1;
|
||||
register uintptr_t x2 asm("x2") = arg2;
|
||||
|
@ -655,6 +694,17 @@ inline uintptr_t invoke(Function function, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
|
|||
: "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x8)
|
||||
: "memory");
|
||||
result = x0;
|
||||
# elif ARCH(RISCV64)
|
||||
register uintptr_t a0 asm("a0") = arg1;
|
||||
register uintptr_t a1 asm("a1") = arg2;
|
||||
register uintptr_t a2 asm("a2") = arg3;
|
||||
register uintptr_t a3 asm("a3") = arg4;
|
||||
register uintptr_t a7 asm("a7") = function;
|
||||
register uintptr_t result asm("a0");
|
||||
asm volatile("ecall"
|
||||
: "=r"(result)
|
||||
: "0"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a7)
|
||||
: "memory");
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue