diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-31 14:44:14 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-31 14:44:14 +0200 |
commit | 846736deea196786386cf1c0ac9a54c667102386 (patch) | |
tree | d7a313813efdc3d83ff05fb3e5645e042ee77314 | |
parent | 15a7f9f2ff67f79ee334c88259ce20fcd69b4e2d (diff) |
root: Add devicesByKind syscall
-rw-r--r-- | src/hwinfo.zig | 27 | ||||
-rw-r--r-- | src/root.zig | 7 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/hwinfo.zig b/src/hwinfo.zig new file mode 100644 index 0000000..0a6909e --- /dev/null +++ b/src/hwinfo.zig @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org> +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +pub const DevKind = enum(u32) { + cpus, + plic, + pcie, + pci, + _, +}; + +pub const Dev = extern struct { + kind: DevKind, + reg: Reg, + value: u64, +}; + +pub const Reg = extern struct { + addr: u64, + len: u64, + + pub fn slice(self: Reg, comptime T: type) []volatile T { + const ptr: [*]volatile T = @ptrFromInt(self.addr); + return ptr[0 .. self.len / @sizeOf(T)]; + } +}; diff --git a/src/root.zig b/src/root.zig index 43be54b..a8cc12c 100644 --- a/src/root.zig +++ b/src/root.zig @@ -3,6 +3,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later const std = @import("std"); +pub const hwinfo = @import("hwinfo.zig"); pub const max_args = 6; @@ -85,3 +86,9 @@ pub fn rawUserinit() []const u8 { const result = ecall(100007, .{&ptr}); return ptr[0..result.value]; } + +pub fn devicesByKind(kind: hwinfo.DevKind, devices: []hwinfo.Dev) !usize { + const result = ecall(100008, .{ kind, devices.ptr, devices.len }); + if (result.error_code != 0) return SyscallError.Kernel; + return result.value; +} |