(Almost) removed special handling of the kernel image, as it's now

maintained in a preloaded_image as well.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7706 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-05-31 22:51:01 +00:00
parent 38e937ca8e
commit bc6ab31951
2 changed files with 14 additions and 48 deletions
+11 -39
View File
@@ -667,7 +667,7 @@ unload_elf_image(struct elf_image_info *image)
static status_t static status_t
insert_preloaded_image(struct preloaded_image *preloadedImage) insert_preloaded_image(struct preloaded_image *preloadedImage, bool kernel)
{ {
struct Elf32_Ehdr *elfHeader; struct Elf32_Ehdr *elfHeader;
struct elf_image_info *image; struct elf_image_info *image;
@@ -700,9 +700,12 @@ insert_preloaded_image(struct preloaded_image *preloadedImage)
if (status < B_OK) if (status < B_OK)
goto error2; goto error2;
status = elf_relocate(image, ""); if (!kernel) {
if (status < B_OK) status = elf_relocate(image, "");
goto error2; if (status < B_OK)
goto error2;
} else
sKernelImage = image;
image->debug_symbols = preloadedImage->debug_symbols; image->debug_symbols = preloadedImage->debug_symbols;
image->num_debug_symbols = preloadedImage->num_debug_symbols; image->num_debug_symbols = preloadedImage->num_debug_symbols;
@@ -1290,7 +1293,6 @@ unload_kernel_add_on(image_id id)
status_t status_t
elf_init(kernel_args *ka) elf_init(kernel_args *ka)
{ {
area_info areaInfo;
struct preloaded_image *image; struct preloaded_image *image;
image_init(); image_init();
@@ -1303,43 +1305,13 @@ elf_init(kernel_args *ka)
return B_NO_MEMORY; return B_NO_MEMORY;
// Build a image structure for the kernel, which has already been loaded. // Build a image structure for the kernel, which has already been loaded.
// The VM has created areas for it under a known name already // The preloaded_images were already prepared by the VM.
if (insert_preloaded_image(&ka->kernel_image, true) < B_OK)
sKernelImage = create_image_struct(); panic("could not create kernel image.\n");
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);
// Build image structures for all preloaded images. // 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) { 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"); add_debugger_command("ls", &dump_address_info, "lookup symbol for a particular address");
+3 -9
View File
@@ -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, 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); HEAP_SIZE, REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL);
address = (void *)ROUNDOWN(ka->kernel_seg0_addr.start, PAGE_SIZE); ka->kernel_image.name = "kernel";
vm_create_anonymous_region(vm_get_kernel_aspace_id(), "kernel_ro", &address, REGION_ADDR_EXACT_ADDRESS, // the lazy boot loader currently doesn't set the kernel's name...
PAGE_ALIGN(ka->kernel_seg0_addr.size), REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL); create_preloaded_image_areas(&ka->kernel_image);
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);
}
// allocate areas for preloaded images // allocate areas for preloaded images
for (image = ka->preloaded_images; image != NULL; image = image->next) { for (image = ka->preloaded_images; image != NULL; image = image->next) {