aboutsummaryrefslogtreecommitdiff
path: root/syscall.jai
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.jai')
-rw-r--r--syscall.jai272
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;
}
}
+
+*/