WIP-mmap-page-at-0
diff --git a/kern/arch/x86/pmap64.c b/kern/arch/x86/pmap64.c
index 09469a9..c677380 100644
--- a/kern/arch/x86/pmap64.c
+++ b/kern/arch/x86/pmap64.c
@@ -631,6 +631,9 @@
ept = kpte_to_epte(kpt);
memset(ept, 0, PGSIZE);
+// XXX
+kpt[0] = 0;
+
/* This bit of paranoia slows process creation a little, but makes sure that
* there is nothing below ULIM in boot_pgdir. Any PML4 entries copied from
* boot_pgdir (e.g. the kernel's memory) will be *shared* among all
diff --git a/kern/src/env.c b/kern/src/env.c
index 2abc57c..007bde4 100644
--- a/kern/src/env.c
+++ b/kern/src/env.c
@@ -79,6 +79,11 @@
if (page_insert(e->env_pgdir, shared_page, (void*)UGDATA, PTE_USER_RW) < 0)
goto env_setup_vm_error;
+ extern struct page *mmap_zero_pg;
+ if (page_insert(e->env_pgdir, mmap_zero_pg, 0, PTE_KERN_RW) < 0)
+ panic("ghetto mmap insertion failed");
+
+
return 0;
env_setup_vm_error:
diff --git a/kern/src/init.c b/kern/src/init.c
index 9ab93fc..4596a00 100644
--- a/kern/src/init.c
+++ b/kern/src/init.c
@@ -119,6 +119,17 @@
}
}
+struct page *mmap_zero_pg;
+
+// XXX if we want to do anything else, we'll need to put it in a section that is
+// linked to be at virtual address 0.
+// could have this get turned on, then be in all new processes addr space
+//void xme() {} __attribute__ ((section ("mmap-zero")));
+void xme()
+{
+ breakpoint();
+}
+
void kernel_init(multiboot_info_t *mboot_info)
{
extern char __start_bss[], __stop_bss[];
@@ -169,6 +180,22 @@
devtabreset();
devtabinit();
+
+
+ int ret;
+ ret = kpage_alloc(&mmap_zero_pg);
+ assert(!ret);
+
+ printk("got paddr %p, ref %d\n", page2pa(mmap_zero_pg),
+ kref_refcnt(&mmap_zero_pg->pg_kref));
+ ret = map_vmap_segment(0, page2pa(mmap_zero_pg), 1, PTE_KERN_RW);
+ assert(!ret);
+ memcpy(0, (void*)xme, PGSIZE);
+ printk("ref %d\n", kref_refcnt(&mmap_zero_pg->pg_kref));
+
+
+
+
#ifdef CONFIG_EXT2FS
mount_fs(&ext2_fs_type, "/dev/ramdisk", "/mnt", 0);
#endif /* CONFIG_EXT2FS */
diff --git a/kern/src/process.c b/kern/src/process.c
index 22b26e7..b2185d0 100644
--- a/kern/src/process.c
+++ b/kern/src/process.c
@@ -502,7 +502,8 @@
/* all memory below UMAPTOP should have been freed via the VMRs. the stuff
* above is the global page and procinfo/procdata */
env_user_mem_free(p, (void*)UMAPTOP, UVPT - UMAPTOP); /* 3rd arg = len... */
- env_user_mem_walk(p, 0, UMAPTOP, __cb_assert_no_pg, 0);
+ //env_user_mem_walk(p, 0, UMAPTOP, __cb_assert_no_pg, 0);
+ env_user_mem_walk(p, (void*)PGSIZE, UMAPTOP, __cb_assert_no_pg, 0);
/* These need to be freed again, since they were allocated with a refcnt. */
free_cont_pages(p->procinfo, LOG2_UP(PROCINFO_NUM_PAGES));
free_cont_pages(p->procdata, LOG2_UP(PROCDATA_NUM_PAGES));
diff --git a/kern/src/syscall.c b/kern/src/syscall.c
index 43ce692..0498c71 100644
--- a/kern/src/syscall.c
+++ b/kern/src/syscall.c
@@ -1015,7 +1015,9 @@
unmap_and_destroy_vmrs(p);
/* close the CLOEXEC ones */
close_fdt(&p->open_files, TRUE);
- env_user_mem_free(p, 0, UMAPTOP);
+ // XXX
+ //env_user_mem_free(p, 0, UMAPTOP);
+ env_user_mem_free(p, (void*)PGSIZE, UMAPTOP);
if (load_elf(p, program, argc, argv, envc, envp)) {
kref_put(&program->f_kref);
user_memdup_free(p, kargenv);