aboutsummaryrefslogtreecommitdiff
path: root/core/sys/linux
diff options
context:
space:
mode:
authorLaytan <laytanlaats@hotmail.com>2024-07-22 13:58:17 +0200
committerGitHub <noreply@github.com>2024-07-22 13:58:17 +0200
commit73a9a97413e31a2a976f3068a6887cdcfcdbb20b (patch)
tree794b433551e977d067346e2a4075b9d8bf902813 /core/sys/linux
parent68550cf9156934f1748fc96af21cfbc30f853e6c (diff)
parent1873f7215dd42e4ee628fcd0947579bf42557dbe (diff)
Merge pull request #3476 from PucklaJ/syscall-fix
[sys/linux] Fix fork and execve syscalls on arm64
Diffstat (limited to 'core/sys/linux')
-rw-r--r--core/sys/linux/bits.odin8
-rw-r--r--core/sys/linux/sys.odin12
-rw-r--r--core/sys/linux/types.odin5
3 files changed, 17 insertions, 8 deletions
diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin
index 96c3de18d..e10edf558 100644
--- a/core/sys/linux/bits.odin
+++ b/core/sys/linux/bits.odin
@@ -1815,3 +1815,11 @@ EPoll_Ctl_Opcode :: enum i32 {
DEL = 2,
MOD = 3,
}
+
+/*
+ Bits for execveat(2) flags.
+*/
+Execveat_Flags_Bits :: enum {
+ AT_SYMLINK_NOFOLLOW = 8,
+ AT_EMPTY_PATH = 12,
+}
diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin
index 90db862e2..f7cacc544 100644
--- a/core/sys/linux/sys.odin
+++ b/core/sys/linux/sys.odin
@@ -749,17 +749,13 @@ getsockopt :: proc {
getsockopt_base,
}
-// TODO(flysand): clone (probably not in this PR, maybe not ever)
-
/*
Creates a copy of the running process.
Available since Linux 1.0.
*/
fork :: proc "contextless" () -> (Pid, Errno) {
when ODIN_ARCH == .arm64 {
- // Note(flysand): this syscall is not documented, but the bottom 8 bits of flags
- // are for exit signal
- ret := syscall(SYS_clone, Signal.SIGCHLD)
+ ret := syscall(SYS_clone, u64(Signal.SIGCHLD), cast(rawptr) nil, cast(rawptr) nil, cast(rawptr) nil, u64(0))
return errno_unwrap(ret, Pid)
} else {
ret := syscall(SYS_fork)
@@ -789,8 +785,8 @@ execve :: proc "contextless" (name: cstring, argv: [^]cstring, envp: [^]cstring)
ret := syscall(SYS_execve, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp)
return Errno(-ret)
} else {
- ret := syscall(SYS_execveat, AT_FDCWD, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp)
- return Errno(-ret)
+ ret := syscall(SYS_execveat, AT_FDCWD, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, i32(0))
+ return Errno(-ret)
}
}
@@ -2818,7 +2814,7 @@ getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Er
Execute program relative to a directory file descriptor.
Available since Linux 3.19.
*/
-execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring, flags: FD_Flags = {}) -> (Errno) {
+execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring, flags: Execveat_Flags = {}) -> (Errno) {
ret := syscall(SYS_execveat, dirfd, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, transmute(i32) flags)
return Errno(-ret)
}
diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin
index d373f96f2..288edf879 100644
--- a/core/sys/linux/types.odin
+++ b/core/sys/linux/types.odin
@@ -1303,3 +1303,8 @@ EPoll_Event :: struct #packed {
events: EPoll_Event_Kind,
data: EPoll_Data,
}
+
+/*
+ Flags for execveat(2) syscall.
+*/
+Execveat_Flags :: bit_set[Execveat_Flags_Bits; i32]