diff options
| -rw-r--r-- | syscall.jai | 58 |
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; } } |
