diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-03 13:02:32 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-03 13:02:32 +0200 |
commit | 777842a8c4bae0078243f3bfaa037027b750fbb4 (patch) | |
tree | e8bbb93888dfaef0ec4dfc1e9f286b79b2afac50 /src/lib | |
parent | 833589444fdead80b285b6d1485ffe63a0f340a9 (diff) |
process: Fix compiler errors in threading and driver handler calling infrastructure
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/process.zig | 29 |
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; +} |