From 201e7191efdee46c4f629d37ef6f5891998a94d3 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Thu, 16 Mar 2023 19:37:49 -0700 Subject: [PATCH] [kernel] Make scheduler run queue's prev be an id, not a pointer This would lead to errors in GDB's j6threads when the previous thread had already exited. --- assets/debugging/jsix.elf-gdb.py | 13 +++++++------ src/kernel/scheduler.cpp | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/assets/debugging/jsix.elf-gdb.py b/assets/debugging/jsix.elf-gdb.py index 382226b..7f56365 100644 --- a/assets/debugging/jsix.elf-gdb.py +++ b/assets/debugging/jsix.elf-gdb.py @@ -237,11 +237,7 @@ class GetThreadsCommand(gdb.Command): self.print_cpudata(cpu) previous = int(gdb.parse_and_eval(f"{runlist}.prev")) - if previous != 0: - tcb = f"((TCB*){previous:#x})" - thread = f"({tcb}->thread)" - koid = int(gdb.parse_and_eval(f"{thread}->m_obj_id")) - print(f" prev: {koid:x}") + print(f" prev: {previous:x}") print() for pri in range(8): @@ -332,8 +328,13 @@ class DumpLogCommand(gdb.Command): end += self.base_addr while addr < end: entry = self.get_entry(addr) + if entry.bytes < 8: + print(f"Bad log header size: {entry.bytes}") + break addr += entry.bytes - area = self.areas[entry.area] + area = "??" + if entry.area < len(self.areas): + area = self.areas[entry.area] level = self.level_names[entry.severity] print(f"{area:>7}:{level:7} {entry.message}") diff --git a/src/kernel/scheduler.cpp b/src/kernel/scheduler.cpp index 8f2cd50..c959a1e 100644 --- a/src/kernel/scheduler.cpp +++ b/src/kernel/scheduler.cpp @@ -28,7 +28,7 @@ scheduler *scheduler::s_instance = nullptr; struct run_queue { tcb_node *current = nullptr; - tcb_node *prev = nullptr; + uint64_t prev = 0; tcb_list ready[scheduler::num_priorities]; tcb_list blocked; @@ -310,7 +310,7 @@ scheduler::schedule() return; } - queue.prev = queue.current; + queue.prev = queue.current->thread->obj_id(); thread *next_thread = next->thread; cpu.thread = next_thread;