-void* vmm_map_page(void* va, void* pa, pt_attr dattr, pt_attr tattr) {
- // 显然,对空指针进行映射没有意义。
- if (!pa || !va) {
- return NULL;
- }
+int
+vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options)
+{
+ assert((ptr_t)va % PG_SIZE == 0);
+
+ ptr_t l1_inx = L1_INDEX(va);
+ ptr_t l2_inx = L2_INDEX(va);
+ x86_page_table* l1pt = (x86_page_table*)(mnt | (1023 << 12));
+ x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_inx << 12));
+
+ // See if attr make sense
+ assert(attr <= 128);
+
+ x86_pte_t* l1pte = &l1pt->entry[l1_inx];
+ if (!*l1pte) {
+ x86_page_table* new_l1pt_pa =
+ (x86_page_table*)pmm_alloc_page(KERNEL_PID, PP_FGPERSIST);
+
+ // 物理内存已满!
+ if (!new_l1pt_pa) {
+ return 0;
+ }
+
+ // This must be writable
+ *l1pte = NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa);
+
+ // make sure our new l2 table is visible to CPU
+ cpu_flush_page((ptr_t)l2pt);