const console = @import("console.zig"); const ALIGN = 1 << 0; const MEMINFO = 1 << 1; const MAGIC = 0x1BADB002; const FLAGS = ALIGN | MEMINFO; const MultibootHeader = extern struct { magic: i32, flags: i32, checksum: i32, }; export const multiboot align(4) linksection(".multiboot") = MultibootHeader{ .magic = MAGIC, .flags = FLAGS, .checksum = -(MAGIC + FLAGS), }; export var stack: [16 * 1024]u8 align(16) linksection(".bss") = undefined; const stack_bytes_slice = stack[0..]; inline fn inb(port: u16) u8 { return asm volatile ("inb %[port], %[result]" : [result] "={al}" (-> u8), : [port] "N{dx}" (port), ); } inline fn outb(port: u16, data: u8) void { asm volatile ("outb %[data], %[port]" : : [data] "{al}" (data), [port] "N{dx}" (port), ); } fn write(data: []const u8) void { const len: u8 = @intCast(data.len & 0xFF); outb(0xe9, 0x30 + len); for (0..len) |i| { outb(0xe9, 0x30); outb(0xe9, data[i]); } } export fn _start() callconv(.C) noreturn { write("test\n"); outb(0xe9, 'H'); outb(0xe9, 'i'); outb(0xe9, '!'); outb(0xe9, '\n'); asm volatile ( \\ mov %[stk], %rsp \\ mov %rsp, %rbp : : [stk] "{rcx}" (@intFromPtr(&stack) + @sizeOf(@TypeOf(stack))), ); asm volatile ("call kmain"); while (true) {} } export fn kmain() void { outb(0xe9, '^'); console.initialize(); console.puts("Hello world!"); outb(0xe9, '$'); outb(0xe9, '\n'); }