diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c index 136b2fa..cbc4d61 100644 --- a/sys/kern/link_elf_obj.c +++ b/sys/kern/link_elf_obj.c @@ -653,6 +653,7 @@ link_elf_obj_load_file(const char *filename, linker_file_t * result) */ #if defined(__x86_64__) && defined(_KERNEL_VIRTUAL) error = vkernel_module_memory_alloc(&mapbase, round_page(mapsize)); + vm_object_drop(ef->object); #else mapbase = KERNBASE; error = vm_map_find(&kernel_map, ef->object, 0, &mapbase, diff --git a/sys/platform/vkernel64/platform/init.c b/sys/platform/vkernel64/platform/init.c index a1152a9..f38ae6f 100644 --- a/sys/platform/vkernel64/platform/init.c +++ b/sys/platform/vkernel64/platform/init.c @@ -101,6 +101,7 @@ vm_offset_t kernel_vm_end; vm_offset_t crashdumpmap; vm_offset_t clean_sva; vm_offset_t clean_eva; +vm_offset_t module_mapbase; struct msgbuf *msgbufp; caddr_t ptvmmap; vpte_t *KernelPTD; @@ -123,6 +124,7 @@ struct privatespace *CPU_prvspace; static struct trapframe proc0_tf; static void *proc0paddr; +static int init_module_mapbase(vm_offset_t *basep); static void init_sys_memory(char *imageFile); static void init_kern_memory(void); static void init_globaldata(void); @@ -355,6 +357,7 @@ main(int ac, char **av) writepid(); cpu_disable_intr(); + init_module_mapbase(&module_mapbase); init_sys_memory(memImageFile); init_kern_memory(); init_globaldata(); @@ -1411,36 +1414,43 @@ setrealcpu(void) * I'm not sure why this isn't working. */ int +init_module_mapbase(vm_offset_t *basep) +{ + *basep = 0; + /* XXX Initiall 32MB */ + *basep = (vm_offset_t)mmap((void *)0x810000000, 32*1024*1024, + PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_ANON|MAP_SHARED, -1, 0); + if ((void *)*basep == MAP_FAILED) + return ENOMEM; + + printf("DEBUG: Module mapbase initialized at %lx\n", *basep); + + return 0; +} + +int vkernel_module_memory_alloc(vm_offset_t *basep, size_t bytes) { kprintf("module loading for vkernel64's not currently supported\n"); + *basep = module_mapbase + bytes; + kprintf("DEBUG %s: *basep=%lx\n", __func__, *basep); + +#ifdef notyet *basep = 0; - return ENOMEM; -#if 0 -#if 1 - size_t xtra; - xtra = (PAGE_SIZE - (vm_offset_t)sbrk(0)) & PAGE_MASK; - *basep = (vm_offset_t)sbrk(xtra + bytes) + xtra; - bzero((void *)*basep, bytes); -#else *basep = (vm_offset_t)mmap((void *)0x000000000, bytes, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_SHARED, -1, 0); if ((void *)*basep == MAP_FAILED) return ENOMEM; -#endif kprintf("basep %p %p %zd\n", (void *)vkernel_module_memory_alloc, (void *)*basep, bytes); - return 0; #endif + return 0; } void vkernel_module_memory_free(vm_offset_t base, size_t bytes) { -#if 0 -#if 0 munmap((void *)base, bytes); -#endif -#endif }