#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>
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);
.flags = MAP_ANON | MAP_PRIVATE,
.type = REGION_TYPE_STACK };
- int errno = mmap_user((void**)&th_stack_top, &vmr, th_stack_top, NULL, ¶m);
-
+ int errno;
+
+ errno = mmap_user((void**)&th_stack_top, &vmr, th_stack_top, NULL, ¶m);
if (errno) {
WARN("failed to create user thread stack: %d", errno);
return 0;
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);
void
thread_release_mem(struct thread* thread)
{
+ struct leaflet* leaflet;
struct proc_mm* mm = vmspace(thread->process);
ptr_t vm_mnt = mm->vm_mnt;
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)) {
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);
}