Commit 3182857224

Andrea Orru <andrea@orru.io>
2018-01-07 10:43:08
Adding zen support
1 parent ad438cf
src/link.cpp
@@ -334,6 +334,13 @@ static void construct_linker_job_elf(LinkJob *lj) {
     if (!g->is_native_target) {
         lj->args.append("--allow-shlib-undefined");
     }
+
+    if (g->zig_target.os == OsZen) {
+        lj->args.append("-e");
+        lj->args.append("main");
+
+        lj->args.append("--image-base=0x10000000");
+    }
 }
 
 //static bool is_target_cyg_mingw(const ZigTarget *target) {
std/os/index.zig
@@ -7,9 +7,11 @@ const os = this;
 pub const windows = @import("windows/index.zig");
 pub const darwin = @import("darwin.zig");
 pub const linux = @import("linux.zig");
+pub const zen = @import("zen.zig");
 pub const posix = switch(builtin.os) {
     Os.linux => linux,
     Os.macosx, Os.ios => darwin,
+    Os.zen => zen,
     else => @compileError("Unsupported OS"),
 };
 
std/os/zen.zig
@@ -0,0 +1,94 @@
+//////////////////////////////
+////  Reserved mailboxes  ////
+//////////////////////////////
+
+pub const MBOX_TERMINAL = 1;
+
+
+///////////////////////////
+////  Syscall numbers  ////
+///////////////////////////
+
+pub const SYS_createMailbox = 0;
+pub const SYS_send = 1;
+pub const SYS_receive = 2;
+pub const SYS_map = 3;
+
+
+////////////////////
+////  Syscalls  ////
+////////////////////
+
+pub fn createMailbox(id: u16) {
+    _ = syscall1(SYS_createMailbox, id);
+}
+
+pub fn send(mailbox_id: u16, data: usize) {
+    _ = syscall2(SYS_send, mailbox_id, data);
+}
+
+pub fn receive(mailbox_id: u16) -> usize {
+    return syscall1(SYS_receive, mailbox_id);
+}
+
+pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) -> bool {
+    return syscall4(SYS_map, v_addr, p_addr, size, usize(writable)) != 0;
+}
+
+
+/////////////////////////
+////  Syscall stubs  ////
+/////////////////////////
+
+pub inline fn syscall0(number: usize) -> usize {
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number));
+}
+
+pub inline fn syscall1(number: usize, arg1: usize) -> usize {
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number),
+            [arg1] "{ecx}" (arg1));
+}
+
+pub inline fn syscall2(number: usize, arg1: usize, arg2: usize) -> usize {
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number),
+            [arg1] "{ecx}" (arg1),
+            [arg2] "{edx}" (arg2));
+}
+
+pub inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) -> usize {
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number),
+            [arg1] "{ecx}" (arg1),
+            [arg2] "{edx}" (arg2),
+            [arg3] "{ebx}" (arg3));
+}
+
+pub inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) -> usize {
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number),
+            [arg1] "{ecx}" (arg1),
+            [arg2] "{edx}" (arg2),
+            [arg3] "{ebx}" (arg3),
+            [arg4] "{esi}" (arg4));
+}
+
+pub inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,
+    arg4: usize, arg5: usize) -> usize
+{
+    return asm volatile ("int $0x80"
+        : [ret] "={eax}" (-> usize)
+        : [number] "{eax}" (number),
+            [arg1] "{ecx}" (arg1),
+            [arg2] "{edx}" (arg2),
+            [arg3] "{ebx}" (arg3),
+            [arg4] "{esi}" (arg4),
+            [arg5] "{edi}" (arg5));
+}
std/special/bootstrap.zig
@@ -11,6 +11,8 @@ comptime {
     const strong_linkage = builtin.GlobalLinkage.Strong;
     if (builtin.link_libc) {
         @export("main", main, strong_linkage);
+    } else if (builtin.os == builtin.Os.zen) {
+        @export("main", zenMain, strong_linkage);
     } else if (builtin.os == builtin.Os.windows) {
         @export("WinMainCRTStartup", WinMainCRTStartup, strong_linkage);
     } else {
@@ -18,6 +20,12 @@ comptime {
     }
 }
 
+extern fn zenMain() -> noreturn {
+    // TODO: call exit.
+    root.main() %% {};
+    while (true) {}
+}
+
 nakedcc fn _start() -> noreturn {
     switch (builtin.arch) {
         builtin.Arch.x86_64 => {
std/special/panic.zig
@@ -6,9 +6,13 @@
 const builtin = @import("builtin");
 
 pub coldcc fn panic(msg: []const u8) -> noreturn {
-    if (builtin.os == builtin.Os.freestanding) {
-        while (true) {}
-    } else {
-        @import("std").debug.panic("{}", msg);
+    switch (builtin.os) {
+        // TODO: fix panic in zen.
+        builtin.Os.freestanding, builtin.Os.zen => {
+            while (true) {}
+        },
+        else => {
+            @import("std").debug.panic("{}", msg);
+        },
     }
 }
CMakeLists.txt
@@ -440,6 +440,7 @@ set(ZIG_STD_FILES
     "os/windows/error.zig"
     "os/windows/index.zig"
     "os/windows/util.zig"
+    "os/zen.zig"
     "rand.zig"
     "sort.zig"
     "special/bootstrap.zig"