diff --git a/src/kernel/core/elf.c b/src/kernel/core/elf.c index 55f5611987..5f4fcee452 100644 --- a/src/kernel/core/elf.c +++ b/src/kernel/core/elf.c @@ -667,7 +667,7 @@ unload_elf_image(struct elf_image_info *image) static status_t -insert_preloaded_image(struct preloaded_image *preloadedImage) +insert_preloaded_image(struct preloaded_image *preloadedImage, bool kernel) { struct Elf32_Ehdr *elfHeader; struct elf_image_info *image; @@ -700,9 +700,12 @@ insert_preloaded_image(struct preloaded_image *preloadedImage) if (status < B_OK) goto error2; - status = elf_relocate(image, ""); - if (status < B_OK) - goto error2; + if (!kernel) { + status = elf_relocate(image, ""); + if (status < B_OK) + goto error2; + } else + sKernelImage = image; image->debug_symbols = preloadedImage->debug_symbols; image->num_debug_symbols = preloadedImage->num_debug_symbols; @@ -1290,7 +1293,6 @@ unload_kernel_add_on(image_id id) status_t elf_init(kernel_args *ka) { - area_info areaInfo; struct preloaded_image *image; image_init(); @@ -1303,43 +1305,13 @@ elf_init(kernel_args *ka) return B_NO_MEMORY; // Build a image structure for the kernel, which has already been loaded. - // The VM has created areas for it under a known name already - - sKernelImage = create_image_struct(); - sKernelImage->name = strdup("kernel"); - - // text segment - sKernelImage->regions[0].id = find_area("kernel_ro"); - if (sKernelImage->regions[0].id < 0) - panic("elf_init: could not look up kernel text segment region\n"); - - get_area_info(sKernelImage->regions[0].id, &areaInfo); - sKernelImage->regions[0].start = (addr_t)areaInfo.address; - sKernelImage->regions[0].size = areaInfo.size; - - // data segment - sKernelImage->regions[1].id = find_area("kernel_rw"); - if (sKernelImage->regions[1].id < 0) - panic("elf_init: could not look up kernel data segment region\n"); - - get_area_info(sKernelImage->regions[1].id, &areaInfo); - sKernelImage->regions[1].start = (addr_t)areaInfo.address; - sKernelImage->regions[1].size = areaInfo.size; - - // we know where the dynamic section is - sKernelImage->dynamic_ptr = (addr_t)ka->kernel_dynamic_section_addr.start; - - // parse the dynamic section - if (elf_parse_dynamic_section(sKernelImage) < 0) - dprintf("elf_init: WARNING elf_parse_dynamic_section couldn't find dynamic section.\n"); - - // insert it first in the list of kernel images loaded - register_elf_image(sKernelImage); + // The preloaded_images were already prepared by the VM. + if (insert_preloaded_image(&ka->kernel_image, true) < B_OK) + panic("could not create kernel image.\n"); // Build image structures for all preloaded images. - // Again, the VM has already created areas for them. for (image = ka->preloaded_images; image != NULL; image = image->next) { - insert_preloaded_image(image); + insert_preloaded_image(image, false); } add_debugger_command("ls", &dump_address_info, "lookup symbol for a particular address"); diff --git a/src/kernel/core/vm/vm.c b/src/kernel/core/vm/vm.c index 98ed015728..00ffeeb36b 100755 --- a/src/kernel/core/vm/vm.c +++ b/src/kernel/core/vm/vm.c @@ -1706,15 +1706,9 @@ vm_init(kernel_args *ka) vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_heap", &address, REGION_ADDR_EXACT_ADDRESS, HEAP_SIZE, REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL); - address = (void *)ROUNDOWN(ka->kernel_seg0_addr.start, PAGE_SIZE); - vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_ro", &address, REGION_ADDR_EXACT_ADDRESS, - PAGE_ALIGN(ka->kernel_seg0_addr.size), REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL); - - if (ka->kernel_seg1_addr.size > 0) { - address = (void *)ROUNDOWN(ka->kernel_seg1_addr.start, PAGE_SIZE); - vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_rw", &address, REGION_ADDR_EXACT_ADDRESS, - PAGE_ALIGN(ka->kernel_seg1_addr.size), REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL); - } + ka->kernel_image.name = "kernel"; + // the lazy boot loader currently doesn't set the kernel's name... + create_preloaded_image_areas(&ka->kernel_image); // allocate areas for preloaded images for (image = ka->preloaded_images; image != NULL; image = image->next) {