diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-15 00:07:51 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-15 00:07:51 -0700 |
| commit | 66ca916805efee6b35b8dd6104fb1da50dd1dc8b (patch) | |
| tree | 7adacd400232e2df30b63a191c56f905bb217941 /std/std.zig | |
| parent | 4dc2b8250638efda3a9990182f46ad57c403b28b (diff) | |
| download | zig-66ca916805efee6b35b8dd6104fb1da50dd1dc8b.tar.gz zig-66ca916805efee6b35b8dd6104fb1da50dd1dc8b.zip | |
std: expose exit syscall
Diffstat (limited to 'std/std.zig')
| -rw-r--r-- | std/std.zig | 19 |
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 { |
