mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
Update zen library
This commit is contained in:
parent
43cdfa275a
commit
b01c5a95c4
@ -7,6 +7,7 @@ pub const Message = struct {
|
||||
receiver: MailboxId,
|
||||
type: usize,
|
||||
payload: usize,
|
||||
buffer: ?[]const u8,
|
||||
|
||||
pub fn from(mailbox_id: &const MailboxId) Message {
|
||||
return Message {
|
||||
@ -14,6 +15,7 @@ pub const Message = struct {
|
||||
.receiver = *mailbox_id,
|
||||
.type = 0,
|
||||
.payload = 0,
|
||||
.buffer = null,
|
||||
};
|
||||
}
|
||||
|
||||
@ -23,16 +25,26 @@ pub const Message = struct {
|
||||
.receiver = *mailbox_id,
|
||||
.type = msg_type,
|
||||
.payload = 0,
|
||||
.buffer = null,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn withData(mailbox_id: &const MailboxId, msg_type: usize, payload: usize) Message {
|
||||
return Message {
|
||||
.sender = MailboxId.This,
|
||||
.receiver = *mailbox_id,
|
||||
.type = msg_type,
|
||||
.payload = payload,
|
||||
};
|
||||
pub fn as(self: &const Message, sender: &const MailboxId) Message {
|
||||
var message = *self;
|
||||
message.sender = *sender;
|
||||
return message;
|
||||
}
|
||||
|
||||
pub fn data(self: &const Message, var_data: var) Message {
|
||||
var message = *self;
|
||||
|
||||
if (@canImplicitCast([]const u8, var_data)) {
|
||||
message.buffer = var_data;
|
||||
} else {
|
||||
message.payload = var_data;
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
};
|
||||
|
||||
@ -91,10 +103,8 @@ pub fn read(fd: i32, buf: &u8, count: usize) usize {
|
||||
pub fn write(fd: i32, buf: &const u8, count: usize) usize {
|
||||
switch (fd) {
|
||||
STDOUT_FILENO, STDERR_FILENO => {
|
||||
var i: usize = 0;
|
||||
while (i < count) : (i += 1) {
|
||||
send(Message.withData(Server.Terminal, 1, buf[i]));
|
||||
}
|
||||
send(Message.to(Server.Terminal, 1)
|
||||
.data(buf[0..count]));
|
||||
},
|
||||
else => unreachable,
|
||||
}
|
||||
@ -108,16 +118,12 @@ pub fn write(fd: i32, buf: &const u8, count: usize) usize {
|
||||
|
||||
pub const Syscall = enum(usize) {
|
||||
exit = 0,
|
||||
createPort = 1,
|
||||
send = 2,
|
||||
receive = 3,
|
||||
subscribeIRQ = 4,
|
||||
inb = 5,
|
||||
map = 6,
|
||||
createThread = 7,
|
||||
createProcess = 8,
|
||||
wait = 9,
|
||||
portReady = 10,
|
||||
send = 1,
|
||||
receive = 2,
|
||||
subscribeIRQ = 3,
|
||||
inb = 4,
|
||||
map = 5,
|
||||
createThread = 6,
|
||||
};
|
||||
|
||||
|
||||
@ -130,13 +136,6 @@ pub fn exit(status: i32) noreturn {
|
||||
unreachable;
|
||||
}
|
||||
|
||||
pub fn createPort(mailbox_id: &const MailboxId) void {
|
||||
_ = switch (*mailbox_id) {
|
||||
MailboxId.Port => |id| syscall1(Syscall.createPort, id),
|
||||
else => unreachable,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn send(message: &const Message) void {
|
||||
_ = syscall1(Syscall.send, @ptrToInt(message));
|
||||
}
|
||||
@ -161,18 +160,6 @@ pub fn createThread(function: fn()void) u16 {
|
||||
return u16(syscall1(Syscall.createThread, @ptrToInt(function)));
|
||||
}
|
||||
|
||||
pub fn createProcess(elf_addr: usize) u16 {
|
||||
return u16(syscall1(Syscall.createProcess, elf_addr));
|
||||
}
|
||||
|
||||
pub fn wait(tid: u16) void {
|
||||
_ = syscall1(Syscall.wait, tid);
|
||||
}
|
||||
|
||||
pub fn portReady(port: u16) bool {
|
||||
return syscall1(Syscall.portReady, port) != 0;
|
||||
}
|
||||
|
||||
/////////////////////////
|
||||
//// Syscall stubs ////
|
||||
/////////////////////////
|
||||
|
||||
@ -13,17 +13,11 @@ comptime {
|
||||
@export("main", main, strong_linkage);
|
||||
} else if (builtin.os == builtin.Os.windows) {
|
||||
@export("WinMainCRTStartup", WinMainCRTStartup, strong_linkage);
|
||||
} else if (builtin.os == builtin.Os.zen) {
|
||||
@export("_start", zen_start, strong_linkage);
|
||||
} else {
|
||||
@export("_start", _start, strong_linkage);
|
||||
}
|
||||
}
|
||||
|
||||
extern fn zen_start() noreturn {
|
||||
std.os.posix.exit(@inlineCall(callMain));
|
||||
}
|
||||
|
||||
nakedcc fn _start() noreturn {
|
||||
switch (builtin.arch) {
|
||||
builtin.Arch.x86_64 => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user