diff --git a/build.zig b/build.zig index 9f932a3..de72322 100644 --- a/build.zig +++ b/build.zig @@ -20,7 +20,7 @@ pub fn build(b: *std.Build) anyerror!void { kernel.setLinkerScript(b.path("src/linker.lds")); - kernel.addCSourceFiles(.{ + kernel.root_module.addCSourceFiles(.{ .files = &.{"src/boot.S"}, .flags = &.{ "-x", "assembler-with-cpp" }, }); diff --git a/src/kernel.zig b/src/kernel.zig index f52f1ed..0da1f08 100644 --- a/src/kernel.zig +++ b/src/kernel.zig @@ -3,23 +3,22 @@ const uart = @import("uart.zig"); // Here we set up a printf-like writer from the standard library by providing // a way to output via the UART. -pub fn drainUart(w: *std.io.Writer, data: []const []const u8, splat: usize) !usize { - _ = try uartPutStr(w.buffer); +pub fn drainUart(w: *std.Io.Writer, data: []const []const u8, splat: usize) !usize { + _ = try uartPutStr(w.buffer[0..w.end]); w.end = 0; var bytes_written: usize = 0; for (data[0 .. data.len - 1]) |slice| { bytes_written += try uartPutStr(slice); } - if (splat == 0 or data.len < 1) return bytes_written; - const last_data = data[data.len - 1]; for (0..splat) |_| { - bytes_written += try uartPutStr(last_data); + bytes_written += try uartPutStr(data[data.len - 1]); } return bytes_written; } -var uart_writer = std.io.Writer{ - .buffer = &[_]u8{} ** 1024, +var uart_writer_buffer: [1024]u8 = undefined; +var uart_writer = std.Io.Writer{ + .buffer = &uart_writer_buffer, .end = 0, .vtable = &.{ .drain = drainUart }, }; @@ -33,6 +32,7 @@ fn uartPutStr(str: []const u8) !usize { pub fn println(comptime fmt: []const u8, args: anytype) void { uart_writer.print(fmt ++ "\n", args) catch {}; + uart_writer.flush() catch {}; } // This the trap/exception entrypoint, this will be invoked any time