aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2015-12-15 00:07:51 -0700
committerAndrew Kelley <superjoe30@gmail.com>2015-12-15 00:07:51 -0700
commit66ca916805efee6b35b8dd6104fb1da50dd1dc8b (patch)
tree7adacd400232e2df30b63a191c56f905bb217941 /std
parent4dc2b8250638efda3a9990182f46ad57c403b28b (diff)
downloadzig-66ca916805efee6b35b8dd6104fb1da50dd1dc8b.tar.gz
zig-66ca916805efee6b35b8dd6104fb1da50dd1dc8b.zip
std: expose exit syscall
Diffstat (limited to 'std')
-rw-r--r--std/std.zig19
1 files changed, 19 insertions, 0 deletions
diff --git a/std/std.zig b/std/std.zig
index 8b19628441..ea3b0d20f6 100644
--- a/std/std.zig
+++ b/std/std.zig
@@ -1,6 +1,20 @@
const SYS_write : isize = 1;
+const SYS_exit : isize = 60;
const stdout_fileno : isize = 1;
+fn syscall1(number: isize, arg1: isize) -> isize {
+ var result : isize;
+ asm volatile ("
+ mov %[number], %%rax
+ mov %[arg1], %%rdi
+ syscall
+ mov %%rax, %[ret]"
+ : [ret] "=m" (result)
+ : [number] "r" (number), [arg1] "r" (arg1)
+ : "rcx", "r11", "rax", "rdi");
+ return result;
+}
+
fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize {
var result : isize;
asm volatile ("
@@ -20,6 +34,11 @@ pub fn write(fd: isize, buf: &const u8, count: usize) -> isize {
return syscall3(SYS_write, fd, buf as isize, count as isize);
}
+pub fn exit(status: i32) -> unreachable {
+ syscall1(SYS_exit, status as isize);
+ unreachable;
+}
+
// TODO error handling
// TODO handle buffering and flushing
pub fn print_str(str : string) -> isize {