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
Boot framework rework (#45)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
mm
/
procvm.c
diff --git
a/lunaix-os/kernel/mm/procvm.c
b/lunaix-os/kernel/mm/procvm.c
index 5b7afad9d816d230530df3e9d647b59ded1abe31..119efde25b389eae2750218665bd2a9d3428bb1c 100644
(file)
--- a/
lunaix-os/kernel/mm/procvm.c
+++ b/
lunaix-os/kernel/mm/procvm.c
@@
-75,7
+75,7
@@
vmscpy(ptr_t dest_mnt, ptr_t src_mnt, bool only_kernel)
*/
pte_t* ptep_ssm = mkl0tep_va(VMS_SELF, dest_mnt);
pte_t* ptep_sms = mkl1tep_va(VMS_SELF, dest_mnt) + VMS_SELF_L0TI;
*/
pte_t* ptep_ssm = mkl0tep_va(VMS_SELF, dest_mnt);
pte_t* ptep_sms = mkl1tep_va(VMS_SELF, dest_mnt) + VMS_SELF_L0TI;
- pte_t pte_sms = mkpte_prot(KERNEL_
DATA
);
+ pte_t pte_sms = mkpte_prot(KERNEL_
PGTAB
);
pte_sms = alloc_kpage_at(ptep_ssm, pte_sms, 0);
set_pte(ptep_sms, pte_sms);
pte_sms = alloc_kpage_at(ptep_ssm, pte_sms, 0);
set_pte(ptep_sms, pte_sms);
@@
-145,7
+145,7
@@
vmscpy(ptr_t dest_mnt, ptr_t src_mnt, bool only_kernel)
while (i++ < MAX_PTEN) {
pte_t pte = *ptep;
while (i++ < MAX_PTEN) {
pte_t pte = *ptep;
- if (l0tep_imp
il
e_vmnts(ptep)) {
+ if (l0tep_imp
li
e_vmnts(ptep)) {
goto _cont;
}
goto _cont;
}
@@
-259,6
+259,12
@@
procvm_dupvms_mount(struct proc_mm* mm) {
void
procvm_mount(struct proc_mm* mm)
{
void
procvm_mount(struct proc_mm* mm)
{
+ // if current mm is already active
+ if (active_vms(mm->vm_mnt)) {
+ return;
+ }
+
+ // we are double mounting
assert(!mm->vm_mnt);
assert(mm->vmroot);
assert(!mm->vm_mnt);
assert(mm->vmroot);
@@
-272,9
+278,13
@@
procvm_mount(struct proc_mm* mm)
void
procvm_unmount(struct proc_mm* mm)
{
void
procvm_unmount(struct proc_mm* mm)
{
+ if (active_vms(mm->vm_mnt)) {
+ return;
+ }
+
assert(mm->vm_mnt);
assert(mm->vm_mnt);
-
vms_unmount(VMS_MOUNT_1);
vms_unmount(VMS_MOUNT_1);
+
struct proc_mm* mm_current = vmspace(__current);
if (mm_current) {
mm_current->guest_mm = NULL;
struct proc_mm* mm_current = vmspace(__current);
if (mm_current) {
mm_current->guest_mm = NULL;
@@
-315,7
+325,6
@@
void
procvm_mount_self(struct proc_mm* mm)
{
assert(!mm->vm_mnt);
procvm_mount_self(struct proc_mm* mm)
{
assert(!mm->vm_mnt);
- assert(!mm->guest_mm);
mm->vm_mnt = VMS_SELF;
}
mm->vm_mnt = VMS_SELF;
}
@@
-350,11
+359,13
@@
procvm_enter_remote(struct remote_vmctx* rvmctx, struct proc_mm* mm,
pte_t* rptep = mkptep_va(vm_mnt, remote_base);
pte_t* lptep = mkptep_va(VMS_SELF, rvmctx->local_mnt);
pte_t* rptep = mkptep_va(vm_mnt, remote_base);
pte_t* lptep = mkptep_va(VMS_SELF, rvmctx->local_mnt);
- unsigned int pattr = region_pteprot(region);
+
+ pte_t pte, rpte = null_pte;
+ rpte = region_tweakpte(region, rpte);
for (size_t i = 0; i < size_pn; i++)
{
for (size_t i = 0; i < size_pn; i++)
{
- pte
_t pte
= vmm_tryptep(rptep, PAGE_SIZE);
+ pte = vmm_tryptep(rptep, PAGE_SIZE);
if (pte_isloaded(pte)) {
set_pte(lptep, pte);
continue;
if (pte_isloaded(pte)) {
set_pte(lptep, pte);
continue;
@@
-362,7
+373,7
@@
procvm_enter_remote(struct remote_vmctx* rvmctx, struct proc_mm* mm,
ptr_t pa = ppage_addr(pmm_alloc_normal(0));
set_pte(lptep, mkpte(pa, KERNEL_DATA));
ptr_t pa = ppage_addr(pmm_alloc_normal(0));
set_pte(lptep, mkpte(pa, KERNEL_DATA));
- set_pte(rptep,
mkpte(pa, pattr
));
+ set_pte(rptep,
pte_setpaddr(rpte, pa
));
}
return vm_mnt;
}
return vm_mnt;