Browse Source

feat: add freeze() and kill_current()

greatbridf 2 năm trước cách đây
mục cha
commit
8cd5128366

+ 4 - 0
include/kernel/process.hpp

@@ -422,6 +422,7 @@ public:
 
 void NORETURN init_scheduler(void);
 void schedule(void);
+void NORETURN schedule_noreturn(void);
 
 constexpr uint32_t push_stack(uint32_t** stack, uint32_t val)
 {
@@ -438,3 +439,6 @@ constexpr thdlist::~thdlist()
 }
 
 void k_new_thread(void (*func)(void*), void* data);
+
+void NORETURN freeze(void);
+void NORETURN kill_current(int exit_code);

+ 3 - 15
src/kernel/interrupt.cpp

@@ -21,14 +21,6 @@
 
 static struct IDT_entry IDT[256];
 
-static inline void NORETURN _halt_forever(void)
-{
-    asm_cli();
-    asm_hlt();
-    for (;;)
-        ;
-}
-
 void init_idt()
 {
     asm_cli();
@@ -114,8 +106,7 @@ extern "C" void int6_handler(
 
     kmsg("----   HALTING SYSTEM   ----\n");
 
-    asm_cli();
-    asm_hlt();
+    freeze();
 }
 
 // general protection
@@ -144,8 +135,7 @@ extern "C" void int13_handler(
 
     kmsg("----   HALTING SYSTEM   ----\n");
 
-    asm_cli();
-    asm_hlt();
+    freeze();
 }
 
 struct PACKED int14_data {
@@ -172,9 +162,7 @@ static inline void NORETURN _int14_kill_user(void)
     char buf[256] {};
     snprintf(buf, 256, "Segmentation Fault (pid%d killed)\n", current_process->pid);
     kmsg(buf);
-    procs->kill(current_process->pid, -1);
-    schedule();
-    _halt_forever();
+    kill_current(-1);
 }
 
 // page fault

+ 22 - 8
src/kernel/process.cpp

@@ -120,12 +120,6 @@ void proclist::kill(pid_t pid, int exit_code)
     parent->wait_lst.push({ nullptr, (void*)pid, (void*)exit_code, nullptr });
 }
 
-inline void NORETURN _noreturn_crash(void)
-{
-    for (;;)
-        assert(false);
-}
-
 void kernel_threadd_main(void)
 {
     kmsg("kernel thread daemon started\n");
@@ -232,7 +226,7 @@ void NORETURN _kernel_init(void)
         : "c"(d.sp), "d"(d.eip)
         : "eax", "memory");
 
-    _noreturn_crash();
+    freeze();
 }
 
 void k_new_thread(void (*func)(void*), void* data)
@@ -292,7 +286,7 @@ void NORETURN init_scheduler(void)
         : "a"(current_thread->esp), "c"(_kernel_init)
         : "memory");
 
-    _noreturn_crash();
+    freeze();
 }
 
 extern "C" void asm_ctx_switch(uint32_t** curr_esp, uint32_t* next_esp);
@@ -316,3 +310,23 @@ void schedule()
 
     asm_ctx_switch(&curr_thd->esp, thd->esp);
 }
+
+void NORETURN schedule_noreturn(void)
+{
+    schedule();
+    freeze();
+}
+
+void NORETURN freeze(void)
+{
+    asm_cli();
+    asm_hlt();
+    for (;;)
+        ;
+}
+
+void NORETURN kill_current(int exit_code)
+{
+    procs->kill(current_process->pid, exit_code);
+    schedule_noreturn();
+}

+ 1 - 2
src/kernel/syscall.cpp

@@ -125,8 +125,7 @@ void _syscall_sleep(interrupt_stack* data)
 void _syscall_crash(interrupt_stack*)
 {
     kmsg("\nan error occurred while executing command\n");
-    asm_cli();
-    asm_hlt();
+    freeze();
 }
 
 // syscall_exec(const char* exec, const char** argv)

+ 2 - 4
src/types/libstdcpp.cpp

@@ -1,6 +1,7 @@
 #include <asm/port_io.h>
 #include <assert.h>
 #include <kernel/log.hpp>
+#include <kernel/process.hpp>
 #include <stdio.h>
 #include <types/types.h>
 
@@ -30,8 +31,5 @@ __assert_fail(const char* statement, const char* file, int line, const char* fun
     snprintf(buf, sizeof(buf), "Kernel assertion failed: (%s), %s:%d, %s\n",
         statement, file, line, func);
     kmsg(buf);
-    asm_cli();
-    asm_hlt();
-    for (;;)
-        ;
+    freeze();
 }