aboutsummaryrefslogtreecommitdiff
path: root/syscall.jai
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.jai')
-rw-r--r--syscall.jai58
1 files changed, 37 insertions, 21 deletions
diff --git a/syscall.jai b/syscall.jai
index d04897c..5348ab6 100644
--- a/syscall.jai
+++ b/syscall.jai
@@ -7,6 +7,17 @@
//
// Syscall info: https://filippo.io/linux-syscall-table/
+// TODO
+// - On mmap_file and munmap_file use get_error_string as in the windows version. This is defined in ./modules/System.jai.
+// - Check if the strings being passed to these syscalls require any processing to be a C_string.
+// - Check what's the best return type for syscalls... is it OS dependent?
+// - File structure
+// modules/POSIX - where a lot of POSIX stuff (constants and structs) is defined, e.g.: `SYS_open :: 5;`
+// modules/System - where "Windows" or "POSIX" or "Objective -> macos" modules are imported... I suspect we import "System" if trying to target all OSes.
+// modules/Linux - defines some unix stuff (constants and structs) and then imports "POSIX".
+//
+// Seems that, each functionality may directly implement for all OSes, instead of using a OS independent layer.
+
main :: () {
//sys_exit(-1);
@@ -49,13 +60,13 @@ main :: () {
sys_stat :: (path: string) -> result: stat_t, error: s64{
- print("\r# sys_stat\n");
+ print("\r# sys_stat\n"); // TODO
#if OS == .LINUX {
SYS_STAT :: 4;
stats: stat_t = ---;
result: s64 = ---;
#if CPU == .X64 {
- print("\r# LINUX:ASM\n");
+ print("\r# LINUX:ASM\n"); // TODO
path_p: *s8 = xx path.data;
stats_p := *stats;
#asm SYSCALL_SYSRET {
@@ -73,7 +84,7 @@ sys_stat :: (path: string) -> result: stat_t, error: s64{
else
return stats, 0; // OK.
} else {
- print("\r# LINUX:LIBC\n");
+ print("\r# LINUX:LIBC\n"); // TODO
path_p: *s8 = xx path.data;
error := syscall(SYS_STAT, path_p, *stats);
if error < 0
@@ -82,19 +93,20 @@ sys_stat :: (path: string) -> result: stat_t, error: s64{
return stats, 0; // OK.
}
} else {
- print("TODO Implement this\n"); // TODO Implement this.
+ print("NOT IMPLEMENTED\n", to_standard_error = true);
+ return .{}, -1;
}
}
sys_fstat :: (file_descriptor: s64) -> result: stat_t, error: s64{
- print("\r# sys_fstat\n");
+ print("\r# sys_fstat\n"); // TODO
#if OS == .LINUX {
SYS_FSTAT :: 5;
stats: stat_t = ---;
stats_p := *stats;
result: s64 = ---;
#if CPU == .X64 {
- print("\r# LINUX:ASM\n");
+ print("\r# LINUX:ASM\n"); // TODO
#asm SYSCALL_SYSRET {
mov rax: gpr === a, SYS_FSTAT;
mov rdi: gpr === di, file_descriptor;
@@ -110,7 +122,7 @@ sys_fstat :: (file_descriptor: s64) -> result: stat_t, error: s64{
else
return stats, 0; // OK.
} else {
- print("\r# LINUX:LIBC\n");
+ print("\r# LINUX:LIBC\n"); // TODO
error := syscall(SYS_FSTAT, file_descriptor, *result);
if error < 0
return .{}, errno(); // Error.
@@ -118,17 +130,18 @@ sys_fstat :: (file_descriptor: s64) -> result: stat_t, error: s64{
return stats, 0; // OK.
}
} else {
- print("TODO Implement this\n"); // TODO Implement this.
+ print("NOT IMPLEMENTED\n", to_standard_error = true);
+ return .{}, -1;
}
}
sys_lseek :: (file_descriptor: s64, offset: s64, whence: s64) -> offset_location: s64, error: s64 {
- print("\r# sys_lseek\n");
+ print("\r# sys_lseek\n"); // TODO
#if OS == .LINUX {
SYS_LSEEK :: 8;
result: s64 = ---;
#if CPU == .X64 {
- print("\r# LINUX:ASM\n");
+ print("\r# LINUX:ASM\n"); // TODO
#asm SYSCALL_SYSRET {
mov rax: gpr === a, SYS_LSEEK;
mov rdi: gpr === di, file_descriptor;
@@ -146,7 +159,7 @@ sys_lseek :: (file_descriptor: s64, offset: s64, whence: s64) -> offset_location
else
return result, 0; // OK.
} else {
- print("\r# LINUX:LIBC\n");
+ print("\r# LINUX:LIBC\n"); // TODO
result = syscall(SYS_LSEEK, file_descriptor, offset, whence);
if result < 0
return -1, errno(); // Error.
@@ -154,18 +167,19 @@ sys_lseek :: (file_descriptor: s64, offset: s64, whence: s64) -> offset_location
return result, 0; // OK.
}
} else {
- print("TODO Implement this\n"); // TODO Implement this.
+ print("NOT IMPLEMENTED\n", to_standard_error = true);
+ return -1, -1;
}
}
sys_open :: (path: string, flags: s64, mode: s64) -> file_descriptor: s64, error: s64 {
- print("\r# sys_open\n");
+ print("\r# sys_open\n"); // TODO
#if OS == .LINUX {
SYS_OPEN :: 2;
data: *s8 = xx path.data;
result: s64 = ---;
#if CPU == .X64 {
- print("\r# LINUX:ASM\n");
+ print("\r# LINUX:ASM\n"); // TODO
#asm SYSCALL_SYSRET {
mov rax: gpr === a, SYS_OPEN;
mov rdi: gpr === di, data;
@@ -183,7 +197,7 @@ sys_open :: (path: string, flags: s64, mode: s64) -> file_descriptor: s64, error
else
return result, 0; // OK.
} else {
- print("\r# LINUX:LIBC\n");
+ print("\r# LINUX:LIBC\n"); // TODO
result = syscall(SYS_OPEN, data, flags, mode);
if result < 0
return -1, errno(); // Error.
@@ -191,19 +205,20 @@ sys_open :: (path: string, flags: s64, mode: s64) -> file_descriptor: s64, error
return result, 0; // OK.
}
} else {
- print("TODO Implement this\n"); // TODO Implement this.
+ print("NOT IMPLEMENTED\n", to_standard_error = true);
+ return -1, -1;
}
}
sys_close :: (file_descriptor: s64) -> error: s64 {
- print("\r# sys_close\n");
+ print("\r# sys_close\n"); // TODO
#if OS == .LINUX {
SYS_CLOSE :: 3;
result: s64 = ---;
#if CPU == .X64 {
- print("\r# LINUX:ASM\n");
+ print("\r# LINUX:ASM\n"); // TODO
#asm SYSCALL_SYSRET {
- mov rax: gpr === a, SYS_CLOSE;
+ mov rax: gpr === a, SYS_CLOSE;
mov rdi: gpr === di, file_descriptor;
syscall
rcx: gpr === c, // Implicitly used by syscall to store RIP
@@ -213,11 +228,12 @@ sys_close :: (file_descriptor: s64) -> error: s64 {
}
return ifx result < 0 then -result else 0;
} else {
- print("\r# LINUX:LIBC\n");
+ print("\r# LINUX:LIBC\n"); // TODO
result = syscall(SYS_CLOSE, file_descriptor);
return ifx result < 0 then errno() else 0;
}
} else {
- print("TODO Implement this\n"); // TODO Implement this.
+ print("NOT IMPLEMENTED\n", to_standard_error = true);
+ return -1;
}
}