authorgravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-01-07 04:43:08-05:00
committergravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-01-07 04:43:08-05:00
log31828572249883f99fad307dc6b27df9d1678a8d
tree6f68110ee33640786e23f117880333240aa25341
parentad438cfd40aba682a0bcd88ed607c2cbd378f647

Adding zen support


6 files changed, 120 insertions(+), 4 deletions(-)

CMakeLists.txt+1
......@@ -440,6 +440,7 @@ set(ZIG_STD_FILES
440440 "os/windows/error.zig"
441441 "os/windows/index.zig"
442442 "os/windows/util.zig"
443 "os/zen.zig"
443444 "rand.zig"
444445 "sort.zig"
445446 "special/bootstrap.zig"
src/link.cpp+7
......@@ -334,6 +334,13 @@ static void construct_linker_job_elf(LinkJob *lj) {
334334 if (!g->is_native_target) {
335335 lj->args.append("--allow-shlib-undefined");
336336 }
337
338 if (g->zig_target.os == OsZen) {
339 lj->args.append("-e");
340 lj->args.append("main");
341
342 lj->args.append("--image-base=0x10000000");
343 }
337344}
338345
339346//static bool is_target_cyg_mingw(const ZigTarget *target) {
std/os/index.zig+2
......@@ -7,9 +7,11 @@ const os = this;
77pub const windows = @import("windows/index.zig");
88pub const darwin = @import("darwin.zig");
99pub const linux = @import("linux.zig");
10pub const zen = @import("zen.zig");
1011pub const posix = switch(builtin.os) {
1112 Os.linux => linux,
1213 Os.macosx, Os.ios => darwin,
14 Os.zen => zen,
1315 else => @compileError("Unsupported OS"),
1416};
1517
std/os/zen.zig created+94
......@@ -0,0 +1,94 @@
1//////////////////////////////
2//// Reserved mailboxes ////
3//////////////////////////////
4
5pub const MBOX_TERMINAL = 1;
6
7
8///////////////////////////
9//// Syscall numbers ////
10///////////////////////////
11
12pub const SYS_createMailbox = 0;
13pub const SYS_send = 1;
14pub const SYS_receive = 2;
15pub const SYS_map = 3;
16
17
18////////////////////
19//// Syscalls ////
20////////////////////
21
22pub fn createMailbox(id: u16) {
23 _ = syscall1(SYS_createMailbox, id);
24}
25
26pub fn send(mailbox_id: u16, data: usize) {
27 _ = syscall2(SYS_send, mailbox_id, data);
28}
29
30pub fn receive(mailbox_id: u16) -> usize {
31 return syscall1(SYS_receive, mailbox_id);
32}
33
34pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) -> bool {
35 return syscall4(SYS_map, v_addr, p_addr, size, usize(writable)) != 0;
36}
37
38
39/////////////////////////
40//// Syscall stubs ////
41/////////////////////////
42
43pub inline fn syscall0(number: usize) -> usize {
44 return asm volatile ("int $0x80"
45 : [ret] "={eax}" (-> usize)
46 : [number] "{eax}" (number));
47}
48
49pub inline fn syscall1(number: usize, arg1: usize) -> usize {
50 return asm volatile ("int $0x80"
51 : [ret] "={eax}" (-> usize)
52 : [number] "{eax}" (number),
53 [arg1] "{ecx}" (arg1));
54}
55
56pub inline fn syscall2(number: usize, arg1: usize, arg2: usize) -> usize {
57 return asm volatile ("int $0x80"
58 : [ret] "={eax}" (-> usize)
59 : [number] "{eax}" (number),
60 [arg1] "{ecx}" (arg1),
61 [arg2] "{edx}" (arg2));
62}
63
64pub inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) -> usize {
65 return asm volatile ("int $0x80"
66 : [ret] "={eax}" (-> usize)
67 : [number] "{eax}" (number),
68 [arg1] "{ecx}" (arg1),
69 [arg2] "{edx}" (arg2),
70 [arg3] "{ebx}" (arg3));
71}
72
73pub inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) -> usize {
74 return asm volatile ("int $0x80"
75 : [ret] "={eax}" (-> usize)
76 : [number] "{eax}" (number),
77 [arg1] "{ecx}" (arg1),
78 [arg2] "{edx}" (arg2),
79 [arg3] "{ebx}" (arg3),
80 [arg4] "{esi}" (arg4));
81}
82
83pub inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,
84 arg4: usize, arg5: usize) -> usize
85{
86 return asm volatile ("int $0x80"
87 : [ret] "={eax}" (-> usize)
88 : [number] "{eax}" (number),
89 [arg1] "{ecx}" (arg1),
90 [arg2] "{edx}" (arg2),
91 [arg3] "{ebx}" (arg3),
92 [arg4] "{esi}" (arg4),
93 [arg5] "{edi}" (arg5));
94}
std/special/bootstrap.zig+8
......@@ -11,6 +11,8 @@ comptime {
1111 const strong_linkage = builtin.GlobalLinkage.Strong;
1212 if (builtin.link_libc) {
1313 @export("main", main, strong_linkage);
14 } else if (builtin.os == builtin.Os.zen) {
15 @export("main", zenMain, strong_linkage);
1416 } else if (builtin.os == builtin.Os.windows) {
1517 @export("WinMainCRTStartup", WinMainCRTStartup, strong_linkage);
1618 } else {
......@@ -18,6 +20,12 @@ comptime {
1820 }
1921}
2022
23extern fn zenMain() -> noreturn {
24 // TODO: call exit.
25 root.main() %% {};
26 while (true) {}
27}
28
2129nakedcc fn _start() -> noreturn {
2230 switch (builtin.arch) {
2331 builtin.Arch.x86_64 => {
std/special/panic.zig+8-4
......@@ -6,9 +6,13 @@
66const builtin = @import("builtin");
77
88pub coldcc fn panic(msg: []const u8) -> noreturn {
9 if (builtin.os == builtin.Os.freestanding) {
10 while (true) {}
11 } else {
12 @import("std").debug.panic("{}", msg);
9 switch (builtin.os) {
10 // TODO: fix panic in zen.
11 builtin.Os.freestanding, builtin.Os.zen => {
12 while (true) {}
13 },
14 else => {
15 @import("std").debug.panic("{}", msg);
16 },
1317 }
1418}