git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
userspace fun: maze game and a new device to support it
[lunaix-os.git]
/
lunaix-os
/
kernel
/
process
/
thread.c
diff --git
a/lunaix-os/kernel/process/thread.c
b/lunaix-os/kernel/process/thread.c
index e74718e89f5312c9b4d79d4a9a4bbc7b936a68ae..ef207aa0be82ccc9404f60210ebb58675d6aa768 100644
(file)
--- a/
lunaix-os/kernel/process/thread.c
+++ b/
lunaix-os/kernel/process/thread.c
@@
-3,8
+3,7
@@
#include <lunaix/syscall.h>
#include <lunaix/syscall_utils.h>
#include <lunaix/mm/mmap.h>
#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>
#include <lunaix/syslog.h>
#include <usr/lunaix/threads.h>
@@
-15,32
+14,35
@@
LOG_MODULE("THREAD")
static ptr_t
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_PAG
E);
+ ptr_t th_stack_top = (proc->thread_count + 1) * USR_STACK_SIZE
_THREAD
;
+ th_stack_top = ROUNDUP(USR_STACK_END - th_stack_top,
PAGE_SIZ
E);
struct mm_region* vmr;
struct proc_mm* mm = vmspace(proc);
struct mmap_param param = { .vms_mnt = vm_mnt,
.pvms = mm,
struct mm_region* vmr;
struct proc_mm* mm = vmspace(proc);
struct mmap_param param = { .vms_mnt = vm_mnt,
.pvms = mm,
- .mlen = USR_STACK_SIZE,
+ .mlen = USR_STACK_SIZE
_THREAD
,
.proct = PROT_READ | PROT_WRITE,
.flags = MAP_ANON | MAP_PRIVATE,
.type = REGION_TYPE_STACK };
.proct = PROT_READ | PROT_WRITE,
.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;
}
if (errno) {
WARN("failed to create user thread stack: %d", errno);
return 0;
}
- set_pte(mkptep_va(vm_mnt, vmr->start), guard_pte);
+ pte_t* guardp = mkptep_va(vm_mnt, vmr->start);
+ set_pte(guardp, guard_pte);
*stack_region = vmr;
*stack_region = vmr;
- ptr_t stack_top = align_stack(th_stack_top + USR_STACK_SIZE - 1);
+ ptr_t stack_top = align_stack(th_stack_top + USR_STACK_SIZE
_THREAD
- 1);
return stack_top;
}
return stack_top;
}
@@
-51,10
+53,9
@@
__alloc_kernel_thread_stack(struct proc_info* proc, ptr_t vm_mnt)
pfn_t kstack_end = pfn(KSTACK_AREA);
pte_t* ptep = mkptep_pn(vm_mnt, kstack_top);
while (ptep_pfn(ptep) > kstack_end) {
pfn_t kstack_end = pfn(KSTACK_AREA);
pte_t* ptep = mkptep_pn(vm_mnt, kstack_top);
while (ptep_pfn(ptep) > kstack_end) {
- ptep -= KSTACK_PAGES;
+ ptep -= KSTACK_PAGES
+ 1
;
- // first page in the kernel stack is guardian page
- pte_t pte = *(ptep + 1);
+ pte_t pte = pte_at(ptep + 1);
if (pte_isnull(pte)) {
goto found;
}
if (pte_isnull(pte)) {
goto found;
}
@@
-64,17
+65,16
@@
__alloc_kernel_thread_stack(struct proc_info* proc, ptr_t vm_mnt)
return 0;
found:;
return 0;
found:;
- ptr_t pa = pmm_alloc_cpage(KSTACK_PAGES - 1, 0);
+ unsigned int po = count_order(KSTACK_PAGES);
+ struct leaflet* leaflet = alloc_leaflet(po);
- if (!
pa
) {
+ if (!
leaflet
) {
WARN("failed to create kernel stack: nomem\n");
return 0;
}
set_pte(ptep, guard_pte);
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);
ptep += KSTACK_PAGES;
return align_stack(ptep_va(ptep, LFT_SIZE) - 1);
@@
-83,6
+83,7
@@
found:;
void
thread_release_mem(struct thread* thread)
{
void
thread_release_mem(struct thread* thread)
{
+ struct leaflet* leaflet;
struct proc_mm* mm = vmspace(thread->process);
ptr_t vm_mnt = mm->vm_mnt;
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);
assert(vm_mnt);
pte_t* ptep = mkptep_va(vm_mnt, thread->kstack);
+ leaflet = pte_leaflet(*ptep);
ptep -= KSTACK_PAGES - 1;
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)) {
if (thread->ustack) {
if ((thread->ustack->start & 0xfff)) {
@@
-129,6
+134,10
@@
create_thread(struct proc_info* proc, bool with_ustack)
th->kstack = kstack;
th->ustack = ustack_region;
th->kstack = kstack;
th->ustack = ustack_region;
+
+ if (ustack_region) {
+ th->ustack_top = align_stack(ustack_region->end - 1);
+ }
return th;
}
return th;
}
@@
-141,22
+150,18
@@
start_thread(struct thread* th, ptr_t entry)
assert(mm->vm_mnt);
assert(mm->vm_mnt);
- struct
transfer_context transfer
;
+ struct
hart_transition transition
;
if (!kernel_addr(entry)) {
assert(th->ustack);
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);
-
- th->ustack_top = ustack_top;
+ hart_user_transfer(&transition, th->kstack, th->ustack_top, entry);
}
else {
}
else {
-
thread_create_kernel_transfer(&transfer
, th->kstack, entry);
+
hart_kernel_transfer(&transition
, th->kstack, entry);
}
}
- in
ject_transfer_context(mm->vm_mnt, &transfer
);
- th->
intr_ctx = (isr_param*)transfer
.inject;
+ in
stall_hart_transition(mm->vm_mnt, &transition
);
+ th->
hstate = (struct hart_state*)transition
.inject;
commit_thread(th);
}
commit_thread(th);
}
@@
-180,21
+185,23
@@
thread_find(struct proc_info* proc, tid_t tid)
return NULL;
}
return NULL;
}
-__DEFINE_LXSYSCALL
4(int, th_create, tid_t*, tid, struct uthread_info*, thinfo
,
-
void*, entry, void*, param
)
+__DEFINE_LXSYSCALL
3(int, th_create, tid_t*, tid
,
+
struct uthread_param*, thparam, void*, entry
)
{
struct thread* th = create_thread(__current, true);
if (!th) {
return EAGAIN;
}
{
struct thread* th = create_thread(__current, true);
if (!th) {
return EAGAIN;
}
-
start_thread(th, (ptr_t)entry)
;
+
ptr_t ustack_top
;
-
ptr_t
ustack_top = th->ustack_top;
-
*((void**)ustack_top) = param
;
+ ustack_top = th->ustack_top;
+
ustack_top = align_stack(ustack_top - sizeof(*thparam))
;
- thinfo->th_stack_sz = region_size(th->ustack);
- thinfo->th_stack_top = (void*)ustack_top;
+ memcpy((void*)ustack_top, thparam, sizeof(*thparam));
+
+ th->ustack_top = ustack_top;
+ start_thread(th, (ptr_t)entry);
if (tid) {
*tid = th->tid;
if (tid) {
*tid = th->tid;