aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kernel.zig23
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", .{});