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
feat: User mode support.
[lunaix-os.git]
/
lunaix-os
/
kernel
/
mm
/
vmm.c
diff --git
a/lunaix-os/kernel/mm/vmm.c
b/lunaix-os/kernel/mm/vmm.c
index 55fe52ba22e1509b58997f6d9fa5de6810aa58cb..fe3d65cc46b7ca40ec4eacb232772754dbceba8d 100644
(file)
--- a/
lunaix-os/kernel/mm/vmm.c
+++ b/
lunaix-os/kernel/mm/vmm.c
@@
-4,8
+4,6
@@
#include <lunaix/mm/vmm.h>
#include <lunaix/spike.h>
#include <lunaix/mm/vmm.h>
#include <lunaix/spike.h>
-#include <stdbool.h>
-
void
vmm_init()
{
void
vmm_init()
{
@@
-28,7
+26,11
@@
vmm_init_pd()
}
int
}
int
-vmm_set_mapping(uintptr_t mnt, uintptr_t va, uintptr_t pa, pt_attr attr)
+vmm_set_mapping(uintptr_t mnt,
+ uintptr_t va,
+ uintptr_t pa,
+ pt_attr attr,
+ int options)
{
assert((uintptr_t)va % PG_SIZE == 0);
{
assert((uintptr_t)va % PG_SIZE == 0);
@@
-49,19
+51,30
@@
vmm_set_mapping(uintptr_t mnt, uintptr_t va, uintptr_t pa, pt_attr attr)
}
// This must be writable
}
// This must be writable
- l1pt->entry[l1_inx] = NEW_L1_ENTRY(attr | PG_WRITE, new_l1pt_pa);
+ l1pt->entry[l1_inx] =
+ NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa);
+
memset((void*)l2pt, 0, PG_SIZE);
memset((void*)l2pt, 0, PG_SIZE);
+ } else {
+ x86_pte_t pte = l2pt->entry[l2_inx];
+ if (pte && (options & VMAP_IGNORE)) {
+ return 1;
+ }
}
if (mnt == PD_REFERENCED) {
cpu_invplg(va);
}
}
if (mnt == PD_REFERENCED) {
cpu_invplg(va);
}
+ if ((options & VMAP_NOMAP)) {
+ return 1;
+ }
+
l2pt->entry[l2_inx] = NEW_L2_ENTRY(attr, pa);
return 1;
}
l2pt->entry[l2_inx] = NEW_L2_ENTRY(attr, pa);
return 1;
}
-
in
t
+
uintptr_
t
vmm_del_mapping(uintptr_t mnt, uintptr_t va)
{
assert(((uintptr_t)va & 0xFFFU) == 0);
vmm_del_mapping(uintptr_t mnt, uintptr_t va)
{
assert(((uintptr_t)va & 0xFFFU) == 0);
@@
-84,14
+97,16
@@
vmm_del_mapping(uintptr_t mnt, uintptr_t va)
cpu_invplg(va);
l2pt->entry[l2_index] = PTE_NULL;
cpu_invplg(va);
l2pt->entry[l2_index] = PTE_NULL;
+
+ return PG_ENTRY_ADDR(l2pte);
}
}
+
+ return 0;
}
int
vmm_lookup(uintptr_t va, v_mapping* mapping)
{
}
int
vmm_lookup(uintptr_t va, v_mapping* mapping)
{
- // va = va & ~0xfff;
-
uint32_t l1_index = L1_INDEX(va);
uint32_t l2_index = L2_INDEX(va);
uint32_t l1_index = L1_INDEX(va);
uint32_t l2_index = L2_INDEX(va);