Răsfoiți Sursa

fix(process): stacks of kthds are not mirrored

greatbridf 2 ani în urmă
părinte
comite
ffdfb9c093
1 a modificat fișierele cu 13 adăugiri și 19 ștergeri
  1. 13 19
      src/kernel/process.cpp

+ 13 - 19
src/kernel/process.cpp

@@ -57,12 +57,20 @@ process::process(const process& val, const thread& main_thd)
     auto iter_thd = thds.emplace_back(main_thd);
     iter_thd->owner = this;
 
-    if (!val.attr.system) {
-        // TODO: allocate low mem
-        k_esp = (void*)to_pp(alloc_n_raw_pages(2));
-        memset((char*)k_esp, 0x00, THREAD_KERNEL_STACK_SIZE);
-        k_esp = (char*)k_esp + THREAD_KERNEL_STACK_SIZE;
+    // TODO: allocate low mem
+    k_esp = (void*)to_pp(alloc_n_raw_pages(2));
+    memcpy(k_esp, (char*)main_thd.owner->k_esp - THREAD_KERNEL_STACK_SIZE, THREAD_KERNEL_STACK_SIZE);
+    k_esp = (char*)k_esp + THREAD_KERNEL_STACK_SIZE;
 
+    if (val.attr.system) {
+        auto orig_k_esp = (uint32_t)main_thd.owner->k_esp;
+
+        iter_thd->regs.ebp -= orig_k_esp;
+        iter_thd->regs.ebp += (uint32_t)k_esp;
+
+        iter_thd->regs.esp -= orig_k_esp;
+        iter_thd->regs.esp += (uint32_t)k_esp;
+    } else {
         pd_t pd = alloc_pd();
         memcpy(pd, mms_get_pd(kernel_mms), PAGE_SIZE);
 
@@ -71,20 +79,6 @@ process::process(const process& val, const thread& main_thd)
         // skip kernel heap since it's already copied above
         for (auto iter_src = ++val.mms.cbegin(); iter_src != val.mms.cend(); ++iter_src)
             mm::mirror_mm_area(&mms, iter_src.ptr(), pd);
-
-    } else {
-        // TODO: allocate low mem
-        k_esp = (void*)to_pp(alloc_n_raw_pages(2));
-        memcpy(k_esp, main_thd.owner->k_esp, THREAD_KERNEL_STACK_SIZE);
-        k_esp = (char*)k_esp + THREAD_KERNEL_STACK_SIZE;
-
-        auto orig_k_esp = (uint32_t)main_thd.owner->k_esp;
-
-        iter_thd->regs.ebp -= orig_k_esp;
-        iter_thd->regs.ebp += (uint32_t)k_esp;
-
-        iter_thd->regs.esp -= orig_k_esp;
-        iter_thd->regs.esp += (uint32_t)k_esp;
     }
 }