pub const arch = @import("arch.zig"); pub const syscall = @import("syscall.zig"); pub const log = @import("log.zig"); const abi = @import("abi"); const Handle = abi.Handle; fn debug_write(handle: Handle, message: []const u8) void { _ = syscall.send(handle, &.{ @intFromPtr(message.ptr), message.len, 0, 0, 0, }); } fn exit_process(handle: Handle, code: u32) noreturn { _ = syscall.send(handle, &.{ @intFromEnum(abi.ProcessObjectAction.ZO_process_exit), code, 0, 0, 0, }); unreachable; } fn allocate_memory(handle: Handle, count: usize) u64 { var output: [5]usize = undefined; // TODO error code _ = syscall.sendrecv( handle, &.{ @intFromEnum(abi.PhysicalMemoryObjectAction.ZO_physical_memory_allocate), count, 0, 0, 0, }, &output, ); return output[0]; } export fn _start(arg: usize) linksection(".text.entry") callconv(.C) noreturn { // TODO make the kernel provide those dynamically somehow const SELF_PROCESS_HANDLE: Handle = @enumFromInt(1); const PHYSICAL_MEMORY_HANDLE: Handle = @enumFromInt(2); const DEBUG_HANDLE: Handle = @enumFromInt(3); _ = arg; const mem = allocate_memory(PHYSICAL_MEMORY_HANDLE, 8); _ = mem; debug_write(DEBUG_HANDLE, "Hello!!!"); exit_process(SELF_PROCESS_HANDLE, 4321); }