diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kernel.zig | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/src/kernel.zig b/src/kernel.zig index ea64a43..e31ba7b 100644 --- a/src/kernel.zig +++ b/src/kernel.zig @@ -18,23 +18,16 @@ const Error = error{ HartIdOutOfRange, }; -const HartData = packed struct(usize) { +const BootArgs = packed struct(usize) { hart_id: u16, reserved: u48, - pub inline fn loadSScratch() HartData { - return asm volatile ( - \\ csrr %[hart_data], sscratch - : [hart_data] "=r" (-> HartData), - ); + pub inline fn loadScratch() BootArgs { + return @bitCast(instructions.sscratch.read()); } - pub inline fn storeSScratch(self: HartData) void { - asm volatile ( - \\ csrw sscratch, %[hart_data] - : - : [hart_data] "r" (self), - ); + pub inline fn storeScratch(self: BootArgs) void { + instructions.sscratch.write(@bitCast(self)); } }; @@ -95,11 +88,11 @@ fn kmain(hart_id: usize, _: usize) noreturn { fn run(hart_id: usize) !noreturn { if (hart_id > ~@as(u16, 0)) return Error.HartIdOutOfRange; - const hart_data = HartData{ + const hart_data = BootArgs{ .hart_id = @intCast(hart_id), .reserved = 0, }; - hart_data.storeSScratch(); + hart_data.storeScratch(); try paging.init(); @@ -136,7 +129,7 @@ fn pagedRun() !noreturn { try w.print("Console init\r\n", .{}); try w.print("\r\n", .{}); - const hart_data = HartData.loadSScratch(); + const hart_data = BootArgs.loadScratch(); try w.print("Hart : {d}\r\n", .{hart_data.hart_id}); try w.print("Paging : Sv39\r\n", .{}); |