status_t load_kernel(stage2_args *args, Directory *volume) { int fd = open_from(volume, KERNEL_PATH, O_RDONLY); if (fd < B_OK) return fd; dprintf("load kernel...\n"); elf_init(); status_t status = elf_load_image(fd, &gKernelArgs.kernel_image); close(fd); if (status < B_OK) { dprintf("loading kernel failed: %lx!\n", status); return status; } status = elf_relocate_image(&gKernelArgs.kernel_image); if (status < B_OK) { dprintf("relocating kernel failed: %lx!\n", status); return status; } gKernelArgs.kernel_image.name = kernel_args_strdup(KERNEL_IMAGE); return B_OK; }
status_t load_kernel(stage2_args* args, BootVolume& volume) { const char *name; int fd = find_kernel(volume, &name); if (fd < B_OK) return fd; dprintf("load kernel %s...\n", name); elf_init(); preloaded_image *image; status_t status = elf_load_image(fd, &image); close(fd); if (status < B_OK) { dprintf("loading kernel failed: %lx!\n", status); return status; } gKernelArgs.kernel_image = image; status = elf_relocate_image(gKernelArgs.kernel_image); if (status < B_OK) { dprintf("relocating kernel failed: %lx!\n", status); return status; } gKernelArgs.kernel_image->name = kernel_args_strdup(name); return B_OK; }
status_t elf_load_image(Directory *directory, const char *path) { preloaded_image *image; TRACE(("elf_load_image(directory = %p, \"%s\")\n", directory, path)); int fd = open_from(directory, path, O_RDONLY); if (fd < 0) return fd; // check if this file has already been loaded struct stat stat; if (fstat(fd, &stat) < 0) return errno; image = gKernelArgs.preloaded_images; for (; image != NULL; image = image->next) { if (image->inode == stat.st_ino) { // file has already been loaded, no need to load it twice! close(fd); return B_OK; } } // we still need to load it, so do it image = (preloaded_image *)kernel_args_malloc(sizeof(preloaded_image)); if (image == NULL) { close(fd); return B_NO_MEMORY; } status_t status = elf_load_image(fd, image); if (status == B_OK) { image->name = kernel_args_strdup(path); image->inode = stat.st_ino; // insert to kernel args image->next = gKernelArgs.preloaded_images; gKernelArgs.preloaded_images = image; } else kernel_args_free(image); close(fd); return status; }