From fd8858ace2d3cd9ac96b0b0d57260650dff44484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Sun, 22 Oct 2023 14:03:12 +0200 Subject: [PATCH] Kernel/riscv64: Add RISC-V Syscall API --- Kernel/API/Syscall.h | 62 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 15547b7a08..b4f4c06a80 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -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 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 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 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 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; }