Decoupling Architectural-specific Code (#35)
[lunaix-os.git] / lunaix-os / kernel / process / thread.c
index e74718e89f5312c9b4d79d4a9a4bbc7b936a68ae..9d93566a476c876428192186a268918aa991c797 100644 (file)
@@ -3,8 +3,7 @@
 #include <lunaix/syscall.h>
 #include <lunaix/syscall_utils.h>
 #include <lunaix/mm/mmap.h>
-#include <lunaix/mm/vmm.h>
-#include <lunaix/mm/pmm.h>
+#include <lunaix/mm/page.h>
 #include <lunaix/syslog.h>
 
 #include <usr/lunaix/threads.h>
@@ -15,7 +14,8 @@
 LOG_MODULE("THREAD")
 
 static ptr_t
-__alloc_user_thread_stack(struct proc_info* proc, struct mm_region** stack_region, ptr_t vm_mnt)
+__alloc_user_thread_stack(struct proc_info* proc, 
+                          struct mm_region** stack_region, ptr_t vm_mnt)
 {
     ptr_t th_stack_top = (proc->thread_count + 1) * USR_STACK_SIZE;
     th_stack_top = ROUNDUP(USR_STACK_END - th_stack_top, MEM_PAGE);
@@ -29,8 +29,9 @@ __alloc_user_thread_stack(struct proc_info* proc, struct mm_region** stack_regio
                                 .flags = MAP_ANON | MAP_PRIVATE,
                                 .type = REGION_TYPE_STACK };
 
-    int errno = mmap_user((void**)&th_stack_top, &vmr, th_stack_top, NULL, &param);
-
+    int errno;
+    
+    errno = mmap_user((void**)&th_stack_top, &vmr, th_stack_top, NULL, &param);
     if (errno) {
         WARN("failed to create user thread stack: %d", errno);
         return 0;
@@ -64,17 +65,16 @@ __alloc_kernel_thread_stack(struct proc_info* proc, ptr_t vm_mnt)
     return 0;
 
 found:;
-    ptr_t pa = pmm_alloc_cpage(KSTACK_PAGES - 1, 0);
+    // KSTACK_PAGES = 3, removal one guardian pte, give order 1 page
+    struct leaflet* leaflet = alloc_leaflet(1);
 
-    if (!pa) {
+    if (!leaflet) {
         WARN("failed to create kernel stack: nomem\n");
         return 0;
     }
 
     set_pte(ptep, guard_pte);
-
-    pte_t pte = mkpte(pa, KERNEL_DATA);
-    vmm_set_ptes_contig(ptep + 1, pte, LFT_SIZE, KSTACK_PAGES - 1);
+    ptep_map_leaflet(ptep + 1, mkpte_prot(KERNEL_DATA), leaflet);
 
     ptep += KSTACK_PAGES;
     return align_stack(ptep_va(ptep, LFT_SIZE) - 1);
@@ -83,6 +83,7 @@ found:;
 void
 thread_release_mem(struct thread* thread)
 {
+    struct leaflet* leaflet;
     struct proc_mm* mm = vmspace(thread->process);
     ptr_t vm_mnt = mm->vm_mnt;
 
@@ -90,9 +91,13 @@ thread_release_mem(struct thread* thread)
     assert(vm_mnt);
 
     pte_t* ptep = mkptep_va(vm_mnt, thread->kstack);
+    leaflet = pte_leaflet(*ptep);
     
     ptep -= KSTACK_PAGES - 1;
-    vmm_unset_ptes(ptep, KSTACK_PAGES);
+    set_pte(ptep, null_pte);
+    ptep_unmap_leaflet(ptep + 1, leaflet);
+
+    leaflet_return(leaflet);
     
     if (thread->ustack) {
         if ((thread->ustack->start & 0xfff)) {
@@ -141,22 +146,22 @@ start_thread(struct thread* th, ptr_t entry)
 
     assert(mm->vm_mnt);
     
-    struct transfer_context transfer;
+    struct hart_transition transition;
     if (!kernel_addr(entry)) {
         assert(th->ustack);
 
         ptr_t ustack_top = align_stack(th->ustack->end - 1);
         ustack_top -= 16;   // pre_allocate a 16 byte for inject parameter
-        thread_create_user_transfer(&transfer, th->kstack, ustack_top, entry);
+        hart_user_transfer(&transition, th->kstack, ustack_top, entry);
 
         th->ustack_top = ustack_top;
     } 
     else {
-        thread_create_kernel_transfer(&transfer, th->kstack, entry);
+        hart_kernel_transfer(&transition, th->kstack, entry);
     }
 
-    inject_transfer_context(mm->vm_mnt, &transfer);
-    th->intr_ctx = (isr_param*)transfer.inject;
+    install_hart_transition(mm->vm_mnt, &transition);
+    th->hstate = (struct hart_state*)transition.inject;
 
     commit_thread(th);
 }