diff options
| -rw-r--r-- | syscall.jai | 272 |
1 files changed, 123 insertions, 149 deletions
diff --git a/syscall.jai b/syscall.jai index 5348ab6..34cdcf2 100644 --- a/syscall.jai +++ b/syscall.jai @@ -58,182 +58,156 @@ main :: () { print("$ close(456) returned error %\n", error); } +/* +#import "Basic"; sys_stat :: (path: string) -> result: stat_t, error: s64{ - 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"); // TODO - path_p: *s8 = xx path.data; - stats_p := *stats; - #asm SYSCALL_SYSRET { - mov rax: gpr === a, SYS_STAT; - mov rdi: gpr === di, path_p; - mov rsi: gpr === si, stats_p; - syscall - rcx: gpr === c, // Implicitly used by syscall to store RIP - r11: gpr === 11, // Implicitly used by syscall to store RFLAGS - rax, rdi, rsi; - mov result, rax; - } - if result < 0 - return .{}, -result; // Error. - else - return stats, 0; // OK. - } else { - print("\r# LINUX:LIBC\n"); // TODO - path_p: *s8 = xx path.data; - error := syscall(SYS_STAT, path_p, *stats); - if error < 0 - return .{}, errno(); // Error. - else - return stats, 0; // OK. + #assert(OS != .MACOS); // Not yet tested on MACOS. Remove assert to proceed. + stats: stat_t = ---; + result: s64 = ---; + #if CPU == .X64 { + print("\r# LINUX:ASM:STAT\n"); // TODO + path_p: *s8 = xx path.data; + stats_p := *stats; + #asm SYSCALL_SYSRET { + mov rax: gpr === a, SYS_stat; + mov rdi: gpr === di, path_p; + mov rsi: gpr === si, stats_p; + syscall + rcx: gpr === c, // Implicitly used by syscall to store RIP + r11: gpr === 11, // Implicitly used by syscall to store RFLAGS + rax, rdi, rsi; + mov result, rax; } + if result < 0 + return .{}, -result; // Error. + else + return stats, 0; // OK. } else { - print("NOT IMPLEMENTED\n", to_standard_error = true); - return .{}, -1; + print("\r# LINUX:LIBC:STAT\n"); // TODO + path_p: *s8 = xx path.data; + error := syscall(SYS_stat, path_p, *stats); + if error < 0 + return .{}, errno(); // Error. + else + return stats, 0; // OK. } } sys_fstat :: (file_descriptor: s64) -> result: stat_t, error: s64{ - 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"); // TODO - #asm SYSCALL_SYSRET { - mov rax: gpr === a, SYS_FSTAT; - mov rdi: gpr === di, file_descriptor; - mov rsi: gpr === si, stats_p; - syscall - rcx: gpr === c, // Implicitly used by syscall to store RIP - r11: gpr === 11, // Implicitly used by syscall to store RFLAGS - rax, rdi, rsi; - mov result, rax; - } - if result < 0 - return .{}, -result; // Error. - else - return stats, 0; // OK. - } else { - print("\r# LINUX:LIBC\n"); // TODO - error := syscall(SYS_FSTAT, file_descriptor, *result); - if error < 0 - return .{}, errno(); // Error. - else - return stats, 0; // OK. + #assert(OS != .MACOS); // Not yet tested on MACOS. Remove assert to proceed. + stats: stat_t = ---; + stats_p := *stats; + result: s64 = ---; + #if CPU == .X64 { + print("\r# LINUX:ASM:FSTAT\n"); // TODO + #asm SYSCALL_SYSRET { + mov rax: gpr === a, SYS_fstat; + mov rdi: gpr === di, file_descriptor; + mov rsi: gpr === si, stats_p; + syscall + rcx: gpr === c, // Implicitly used by syscall to store RIP + r11: gpr === 11, // Implicitly used by syscall to store RFLAGS + rax, rdi, rsi; + mov result, rax; } + if result < 0 + return .{}, -result; // Error. + else + return stats, 0; // OK. } else { - print("NOT IMPLEMENTED\n", to_standard_error = true); - return .{}, -1; + print("\r# LINUX:LIBC:FSTAT\n"); // TODO + error := syscall(SYS_fstat, file_descriptor, *result); + if error < 0 + return .{}, errno(); // Error. + else + return stats, 0; // OK. } } sys_lseek :: (file_descriptor: s64, offset: s64, whence: s64) -> offset_location: s64, error: s64 { - print("\r# sys_lseek\n"); // TODO - #if OS == .LINUX { - SYS_LSEEK :: 8; - result: s64 = ---; - #if CPU == .X64 { - print("\r# LINUX:ASM\n"); // TODO - #asm SYSCALL_SYSRET { - mov rax: gpr === a, SYS_LSEEK; - mov rdi: gpr === di, file_descriptor; - mov rsi: gpr === si, offset; - mov rdx: gpr === d, whence; - //syscall rcx, r11, rax, rdi, rsi, rdx; // TODO Cleanup? - syscall - rcx: gpr === c, // Implicitly used by syscall to store RIP - r11: gpr === 11, // Implicitly used by syscall to store RFLAGS - rax, rdi, rsi, rdx; - mov result, rax; - } - if result < 0 - return -1, -result; // Error. - else - return result, 0; // OK. - } else { - print("\r# LINUX:LIBC\n"); // TODO - result = syscall(SYS_LSEEK, file_descriptor, offset, whence); - if result < 0 - return -1, errno(); // Error. - else - return result, 0; // OK. + #assert(OS != .MACOS); // Not yet tested on MACOS. Remove assert to proceed. + result: s64 = ---; + #if CPU == .X64 { + print("\r# LINUX:ASM:LSEEK\n"); // TODO + #asm SYSCALL_SYSRET { + mov rax: gpr === a, SYS_lseek; + mov rdi: gpr === di, file_descriptor; + mov rsi: gpr === si, offset; + mov rdx: gpr === d, whence; + //syscall rcx, r11, rax, rdi, rsi, rdx; // TODO Cleanup? + syscall + rcx: gpr === c, // Implicitly used by syscall to store RIP + r11: gpr === 11, // Implicitly used by syscall to store RFLAGS + rax, rdi, rsi, rdx; + mov result, rax; } + if result < 0 + return -1, -result; // Error. + else + return result, 0; // OK. } else { - print("NOT IMPLEMENTED\n", to_standard_error = true); - return -1, -1; + print("\r# LINUX:LIBC:LSEEK\n"); // TODO + result = syscall(SYS_lseek, file_descriptor, offset, whence); + if result < 0 + return -1, errno(); // Error. + else + return result, 0; // OK. } } sys_open :: (path: string, flags: s64, mode: s64) -> file_descriptor: s64, error: s64 { - 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"); // TODO - #asm SYSCALL_SYSRET { - mov rax: gpr === a, SYS_OPEN; - mov rdi: gpr === di, data; - mov rsi: gpr === si, flags; - mov rdx: gpr === d, mode; // TODO Is this really used? - //syscall rcx, r11, rax, rdi, rsi, rdx; // TODO Cleanup? - syscall - rcx: gpr === c, // Implicitly used by syscall to store RIP - r11: gpr === 11, // Implicitly used by syscall to store RFLAGS - rax, rdi, rsi, rdx; - mov result, rax; - } - if result < 0 - return -1, -result; // Error. - else - return result, 0; // OK. - } else { - print("\r# LINUX:LIBC\n"); // TODO - result = syscall(SYS_OPEN, data, flags, mode); - if result < 0 - return -1, errno(); // Error. - else - return result, 0; // OK. + #assert(OS != .MACOS); // Not yet tested on MACOS. Remove assert to proceed. + data: *s8 = xx path.data; + result: s64 = ---; + #if CPU == .X64 { + print("\r# LINUX:ASM:OPEN\n"); // TODO + #asm SYSCALL_SYSRET { + mov rax: gpr === a, SYS_open; + mov rdi: gpr === di, data; + mov rsi: gpr === si, flags; + mov rdx: gpr === d, mode; // TODO Is this really used? + //syscall rcx, r11, rax, rdi, rsi, rdx; // TODO Cleanup? + syscall + rcx: gpr === c, // Implicitly used by syscall to store RIP + r11: gpr === 11, // Implicitly used by syscall to store RFLAGS + rax, rdi, rsi, rdx; + mov result, rax; } + if result < 0 + return -1, -result; // Error. + else + return result, 0; // OK. } else { - print("NOT IMPLEMENTED\n", to_standard_error = true); - return -1, -1; + print("\r# LINUX:LIBC:OPEN\n"); // TODO + result = syscall(SYS_open, data, flags, mode); + if result < 0 + return -1, errno(); // Error. + else + return result, 0; // OK. } } sys_close :: (file_descriptor: s64) -> error: s64 { - print("\r# sys_close\n"); // TODO - #if OS == .LINUX { - SYS_CLOSE :: 3; - result: s64 = ---; - #if CPU == .X64 { - print("\r# LINUX:ASM\n"); // TODO - #asm SYSCALL_SYSRET { - mov rax: gpr === a, SYS_CLOSE; - mov rdi: gpr === di, file_descriptor; - syscall - rcx: gpr === c, // Implicitly used by syscall to store RIP - r11: gpr === 11, // Implicitly used by syscall to store RFLAGS - rax, rdi; - mov result, rax; - } - return ifx result < 0 then -result else 0; - } else { - print("\r# LINUX:LIBC\n"); // TODO - result = syscall(SYS_CLOSE, file_descriptor); - return ifx result < 0 then errno() else 0; + #assert(OS != .MACOS); // Not yet tested on MACOS. Remove assert to proceed. + result: s64 = ---; + #if CPU == .X64 { + print("\r# LINUX:ASM:CLOSE\n"); // TODO + #asm SYSCALL_SYSRET { + mov rax: gpr === a, SYS_close; + mov rdi: gpr === di, file_descriptor; + syscall + rcx: gpr === c, // Implicitly used by syscall to store RIP + r11: gpr === 11, // Implicitly used by syscall to store RFLAGS + rax, rdi; + mov result, rax; } + return ifx result < 0 then -result else 0; } else { - print("NOT IMPLEMENTED\n", to_standard_error = true); - return -1; + print("\r# LINUX:LIBC:CLOSE\n"); // TODO + result = syscall(SYS_close, file_descriptor); + return ifx result < 0 then errno() else 0; } } + +*/ |
