mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-30 03:10:06 +00:00
add support for linux_riscv64 and freestanding_riscv64
This commit is contained in:
+27
-27
@@ -39,7 +39,7 @@ write :: proc "contextless" (fd: Fd, buf: []u8) -> (int, Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
open :: proc "contextless" (name: cstring, flags: Open_Flags, mode: Mode = {}) -> (Fd, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_openat, AT_FDCWD, transmute(uintptr) name, transmute(u32) flags, transmute(u32) mode)
|
||||
return errno_unwrap(ret, Fd)
|
||||
} else {
|
||||
@@ -68,7 +68,7 @@ close :: proc "contextless" (fd: Fd) -> (Errno) {
|
||||
*/
|
||||
stat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
|
||||
when size_of(int) == 8 {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_fstatat, AT_FDCWD, cast(rawptr) filename, stat, 0)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -111,7 +111,7 @@ fstat :: proc "contextless" (fd: Fd, stat: ^Stat) -> (Errno) {
|
||||
*/
|
||||
lstat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
|
||||
when size_of(int) == 8 {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
return fstatat(AT_FDCWD, filename, stat, {.SYMLINK_NOFOLLOW})
|
||||
} else {
|
||||
ret := syscall(SYS_lstat, cast(rawptr) filename, stat)
|
||||
@@ -128,7 +128,7 @@ lstat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
|
||||
Available since Linux 2.2.
|
||||
*/
|
||||
poll :: proc "contextless" (fds: []Poll_Fd, timeout: i32) -> (i32, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
seconds := cast(uint) timeout / 1000
|
||||
nanoseconds := cast(uint) (timeout % 1000) * 1_000_000
|
||||
timeout_spec := Time_Spec{seconds, nanoseconds}
|
||||
@@ -291,7 +291,7 @@ writev :: proc "contextless" (fd: Fd, iov: []IO_Vec) -> (int, Errno) {
|
||||
For ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
access :: proc "contextless" (name: cstring, mode: Mode = F_OK) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_faccessat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -407,7 +407,7 @@ dup :: proc "contextless" (fd: Fd) -> (Fd, Errno) {
|
||||
On ARM64 available since Linux 2.6.27.
|
||||
*/
|
||||
dup2 :: proc "contextless" (old: Fd, new: Fd) -> (Fd, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_dup3, old, new, 0)
|
||||
return errno_unwrap(ret, Fd)
|
||||
} else {
|
||||
@@ -422,7 +422,7 @@ dup2 :: proc "contextless" (old: Fd, new: Fd) -> (Fd, Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
pause :: proc "contextless" () {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
syscall(SYS_ppoll, 0, 0, 0, 0)
|
||||
} else {
|
||||
syscall(SYS_pause)
|
||||
@@ -452,7 +452,7 @@ getitimer :: proc "contextless" (which: ITimer_Which, cur: ^ITimer_Val) -> (Errn
|
||||
Available since Linux 1.0.
|
||||
*/
|
||||
alarm :: proc "contextless" (seconds: u32) -> u32 {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
new := ITimer_Val { value = { seconds = cast(int) seconds } }
|
||||
old := ITimer_Val {}
|
||||
syscall(SYS_setitimer, ITimer_Which.REAL, &new, &old)
|
||||
@@ -765,7 +765,7 @@ getsockopt :: proc {
|
||||
Available since Linux 1.0.
|
||||
*/
|
||||
fork :: proc "contextless" () -> (Pid, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_clone, u64(Signal.SIGCHLD), cast(rawptr) nil, cast(rawptr) nil, cast(rawptr) nil, u64(0))
|
||||
return errno_unwrap(ret, Pid)
|
||||
} else {
|
||||
@@ -779,7 +779,7 @@ fork :: proc "contextless" () -> (Pid, Errno) {
|
||||
Available since Linux 2.2.
|
||||
*/
|
||||
vfork :: proc "contextless" () -> Pid {
|
||||
when ODIN_ARCH != .arm64 {
|
||||
when ODIN_ARCH != .arm64 && ODIN_ARCH != .riscv64 {
|
||||
return Pid(syscall(SYS_vfork))
|
||||
} else {
|
||||
return Pid(syscall(SYS_clone, Signal.SIGCHLD))
|
||||
@@ -792,7 +792,7 @@ vfork :: proc "contextless" () -> Pid {
|
||||
On ARM64 available since Linux 3.19.
|
||||
*/
|
||||
execve :: proc "contextless" (name: cstring, argv: [^]cstring, envp: [^]cstring) -> (Errno) {
|
||||
when ODIN_ARCH != .arm64 {
|
||||
when ODIN_ARCH != .arm64 && ODIN_ARCH != .riscv64 {
|
||||
ret := syscall(SYS_execve, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1193,7 +1193,7 @@ fchdir :: proc "contextless" (fd: Fd) -> (Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
rename :: proc "contextless" (old: cstring, new: cstring) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_renameat, AT_FDCWD, cast(rawptr) old, AT_FDCWD, cast(rawptr) new)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1208,7 +1208,7 @@ rename :: proc "contextless" (old: cstring, new: cstring) -> (Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
mkdir :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_mkdirat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1223,7 +1223,7 @@ mkdir :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
rmdir :: proc "contextless" (name: cstring) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, transmute(i32) FD_Flags{.REMOVEDIR})
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1238,7 +1238,7 @@ rmdir :: proc "contextless" (name: cstring) -> (Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
creat :: proc "contextless" (name: cstring, mode: Mode) -> (Fd, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
return openat(AT_FDCWD, name, {.CREAT, .WRONLY,.TRUNC}, mode)
|
||||
} else {
|
||||
ret := syscall(SYS_creat, cast(rawptr) name, transmute(u32) mode)
|
||||
@@ -1252,7 +1252,7 @@ creat :: proc "contextless" (name: cstring, mode: Mode) -> (Fd, Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
link :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_linkat, AT_FDCWD, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath, 0)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1267,7 +1267,7 @@ link :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
unlink :: proc "contextless" (name: cstring) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_unlinkat, AT_FDCWD, cast(rawptr) name, 0)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1282,7 +1282,7 @@ unlink :: proc "contextless" (name: cstring) -> (Errno) {
|
||||
On arm64 available since Linux 2.6.16.
|
||||
*/
|
||||
symlink :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_symlinkat, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1297,7 +1297,7 @@ symlink :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
||||
On arm64 available since Linux 2.6.16.
|
||||
*/
|
||||
readlink :: proc "contextless" (name: cstring, buf: []u8) -> (int, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_readlinkat, AT_FDCWD, cast(rawptr) name, raw_data(buf), len(buf))
|
||||
return errno_unwrap(ret, int)
|
||||
} else {
|
||||
@@ -1312,7 +1312,7 @@ readlink :: proc "contextless" (name: cstring, buf: []u8) -> (int, Errno) {
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
chmod :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_fchmodat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1340,7 +1340,7 @@ chown :: proc "contextless" (name: cstring, uid: Uid, gid: Gid) -> (Errno) {
|
||||
when size_of(int) == 4 {
|
||||
ret := syscall(SYS_chown32, cast(rawptr) name, uid, gid)
|
||||
return Errno(-ret)
|
||||
} else when ODIN_ARCH == .arm64 {
|
||||
} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, 0)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1374,7 +1374,7 @@ lchown :: proc "contextless" (name: cstring, uid: Uid, gid: Gid) -> (Errno) {
|
||||
when size_of(int) == 4 {
|
||||
ret := syscall(SYS_lchown32, cast(rawptr) name, uid, gid)
|
||||
return Errno(-ret)
|
||||
} else when ODIN_ARCH == .arm64 {
|
||||
} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_fchownat, AT_FDCWD, cast(rawptr) name, uid, gid, transmute(i32) FD_Flags{.SYMLINK_NOFOLLOW})
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -1727,7 +1727,7 @@ getppid :: proc "contextless" () -> Pid {
|
||||
Available since Linux 1.0.
|
||||
*/
|
||||
getpgrp :: proc "contextless" () -> (Pid, Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_getpgid, 0)
|
||||
return errno_unwrap(ret, Pid)
|
||||
} else {
|
||||
@@ -1950,7 +1950,7 @@ sigaltstack :: proc "contextless" (stack: ^Sig_Stack, old_stack: ^Sig_Stack) ->
|
||||
On ARM64 available since Linux 2.6.16.
|
||||
*/
|
||||
mknod :: proc "contextless" (name: cstring, mode: Mode, dev: Dev) -> (Errno) {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when ODIN_ARCH == .arm64 || ODIN_ARCH == .riscv64 {
|
||||
ret := syscall(SYS_mknodat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode, dev)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -2207,7 +2207,7 @@ gettid :: proc "contextless" () -> Pid {
|
||||
Available since Linux 1.0.
|
||||
*/
|
||||
time :: proc "contextless" (tloc: ^uint) -> (Errno) {
|
||||
when ODIN_ARCH != .arm64 {
|
||||
when ODIN_ARCH != .arm64 && ODIN_ARCH != .riscv64 {
|
||||
ret := syscall(SYS_time, tloc)
|
||||
return Errno(-ret)
|
||||
} else {
|
||||
@@ -2335,7 +2335,7 @@ futex :: proc{
|
||||
Available since Linux 2.6.
|
||||
*/
|
||||
epoll_create :: proc(size: i32 = 1) -> (Fd, Errno) {
|
||||
when ODIN_ARCH != .arm64 {
|
||||
when ODIN_ARCH != .arm64 && ODIN_ARCH != .riscv64 {
|
||||
ret := syscall(SYS_epoll_create, i32(1))
|
||||
return errno_unwrap(ret, Fd)
|
||||
} else {
|
||||
@@ -2433,7 +2433,7 @@ exit_group :: proc "contextless" (code: i32) -> ! {
|
||||
Available since Linux 2.6.
|
||||
*/
|
||||
epoll_wait :: proc(epfd: Fd, events: [^]EPoll_Event, count: i32, timeout: i32) -> (i32, Errno) {
|
||||
when ODIN_ARCH != .arm64 {
|
||||
when ODIN_ARCH != .arm64 && ODIN_ARCH != .riscv64 {
|
||||
ret := syscall(SYS_epoll_wait, epfd, events, count, timeout)
|
||||
return errno_unwrap(ret, i32)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user