Bladeren bron

fix(kthreadd): exec task in child proc

greatbridf 2 jaren geleden
bovenliggende
commit
569a73f635
3 gewijzigde bestanden met toevoegingen van 16 en 13 verwijderingen
  1. 1 1
      include/kernel/hw/ata.hpp
  2. 1 9
      src/kernel/hw/ata.cpp
  3. 14 3
      src/kernel/process.cpp

+ 1 - 1
include/kernel/hw/ata.hpp

@@ -57,5 +57,5 @@ public:
     int write_sector(const char* buf, uint32_t lba_low, uint16_t lba_high) const;
 };
 
-void NORETURN init_ata(void* data);
+void init_ata(void);
 } // namespace hw

+ 1 - 9
src/kernel/hw/ata.cpp

@@ -197,11 +197,8 @@ static inline void mbr_part_probe(fs::inode* drive, uint16_t major, uint16_t min
 }
 
 // data: void (*func_to_call_next)(void)
-void NORETURN hw::init_ata(void* data)
+void hw::init_ata(void)
 {
-    if (!data)
-        syscall(0x03);
-
     ata_pri = types::kernel_allocator_new<ata>(ATA_PRIMARY_BUS_BASE);
     if (ata_pri->identify())
         ata_pri->select(true);
@@ -230,9 +227,4 @@ void NORETURN hw::init_ata(void* data)
 
     auto* hda = fs::vfs_open("/dev/hda");
     mbr_part_probe(hda->ind, 2, 1);
-
-    // noreturn
-    ((void (*)(void))data)();
-    for (;;)
-        syscall(0x03);
 }

+ 14 - 3
src/kernel/process.cpp

@@ -21,7 +21,7 @@
 
 static bool is_scheduler_ready;
 static types::list<process>* processes;
-static types::hash_map<pid_t, types::list<process>::iterator_type, types::linux_hasher<pid_t>>* idx_processes;
+static typename types::hash_map<pid_t, types::list<process>::iterator_type, types::linux_hasher<pid_t>>* idx_processes;
 static types::list<thread*>* ready_thds;
 static pid_t max_pid;
 static void (*volatile kthreadd_new_thd_func)(void*);
@@ -147,7 +147,18 @@ void NORETURN _kernel_init(void)
 void kernel_threadd_main(void)
 {
     tty_print(console, "kernel thread daemon started\n");
-    k_new_thread(hw::init_ata, (void*)_kernel_init);
+
+    // fork
+    int ret = syscall(0x00);
+
+    // pid 1
+    if (ret) {
+        hw::init_ata();
+        _kernel_init();
+        // noreturn
+        syscall(0x03);
+    }
+
     for (;;) {
         if (kthreadd_new_thd_func) {
             spin_lock(&kthreadd_lock);
@@ -163,7 +174,7 @@ void kernel_threadd_main(void)
             // syscall_fork
             return_value = syscall(0x00);
 
-            if (return_value != 0) {
+            if (return_value == 0) {
                 // child process
                 func(data);
                 // the function shouldn't return here