aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-03 13:02:32 +0200
committerHimbeer <himbeer@disroot.org>2024-07-03 13:02:32 +0200
commit777842a8c4bae0078243f3bfaa037027b750fbb4 (patch)
treee8bbb93888dfaef0ec4dfc1e9f286b79b2afac50
parent833589444fdead80b285b6d1485ffe63a0f340a9 (diff)
process: Fix compiler errors in threading and driver handler calling infrastructure
-rw-r--r--src/lib/process.zig29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/lib/process.zig b/src/lib/process.zig
index 3f4a906..a11ca15 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -27,6 +27,7 @@ pub const ScheduleError = error{
};
pub const Error = error{
+ TooManyThreads,
TooManyResourceDescriptors,
BadRdHandle,
};
@@ -54,8 +55,8 @@ pub const Info = struct {
id: u16,
thread_id: usize,
trap_frame: trap.Frame,
- pages: []u8,
- stack: *[num_stack_pages * paging.page_size]u8,
+ pages: []align(paging.page_size) u8,
+ stack: []align(paging.page_size) u8,
pc: usize,
terminate_ra: ?usize,
page_table: *paging.Table,
@@ -113,8 +114,10 @@ pub const Info = struct {
.id = self.id,
.thread_id = thread_id,
.trap_frame = trap_frame,
+ .pages = self.pages,
.stack = stack,
.pc = self.pc,
+ .terminate_ra = null,
.page_table = self.page_table,
.state = .suspended,
.rds = self.rds,
@@ -140,8 +143,9 @@ pub const Info = struct {
self.pc = function;
self.terminate_ra = @returnAddress();
- self.trap_frame.general_purpose_registers[1] = &Container.terminate;
- for (args, 0..6) |arg, i| {
+ self.trap_frame.general_purpose_registers[1] = @intFromPtr(&Container.terminate);
+ inline for (args, 0..) |arg, i| {
+ if (i >= 6) break;
self.trap_frame.general_purpose_registers[10 + i] = arg;
}
@@ -380,3 +384,20 @@ fn validateElfHeader(hdr: elf.Header, hdr_buf: *align(@alignOf(elf.Elf64_Ehdr))
if (hdr64.e_type != .EXEC) return ExeError.NotStaticExe;
}
+
+pub fn latestThread(pid: u16) ?*Info {
+ var latest: ?*Info = null;
+
+ var node = list.first;
+ while (node) |proc_node| : (node = proc_node.next) {
+ if (proc_node.data.id == pid) {
+ if (latest) |proc| {
+ if (proc_node.data.thread_id > proc.thread_id) {
+ latest = &proc_node.data;
+ }
+ }
+ }
+ }
+
+ return latest;
+}