diff --git a/lib/liblaunch/elf.c b/lib/liblaunch/elf.c index 0d86766..76a5946 100644 --- a/lib/liblaunch/elf.c +++ b/lib/liblaunch/elf.c @@ -160,15 +160,10 @@ static kern_status_t create_exec_regions(struct elf_image *image) image->e_total_size); kern_status_t status = KERN_OK; if (image->e_local_space != KERN_HANDLE_INVALID) { - status = vm_region_create( + status = address_space_reserve( image->e_local_space, - NULL, - 0, - VM_REGION_ANY_OFFSET, + MAP_ADDRESS_ANY, image->e_total_size, - VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC - | VM_PROT_USER, - &image->e_local_exec, &image->e_local_base); } @@ -177,22 +172,18 @@ static kern_status_t create_exec_regions(struct elf_image *image) } if (image->e_remote_space != KERN_HANDLE_INVALID) { - status = vm_region_create( + status = address_space_reserve( image->e_remote_space, - NULL, - 0, - VM_REGION_ANY_OFFSET, + MAP_ADDRESS_ANY, image->e_total_size, - VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC - | VM_PROT_USER, - &image->e_remote_exec, &image->e_remote_base); } if (status != KERN_OK) { - vm_region_kill(image->e_local_exec); - kern_handle_close(image->e_local_exec); - image->e_local_exec = KERN_HANDLE_INVALID; + address_space_release( + image->e_local_space, + image->e_local_base, + image->e_total_size); return status; } @@ -200,6 +191,19 @@ static kern_status_t create_exec_regions(struct elf_image *image) return KERN_OK; } +static kern_status_t release_exec_regions(struct elf_image *image) +{ + address_space_release( + image->e_local_space, + image->e_local_base, + image->e_total_size); + address_space_release( + image->e_remote_space, + image->e_remote_base, + image->e_total_size); + return KERN_OK; +} + static enum launch_status map_executable(struct elf_image *image) { elf_phdr_t phdr; @@ -256,10 +260,10 @@ static enum launch_status map_executable(struct elf_image *image) return LAUNCH_ERR_IMAGE_DATA_LOAD_FAILED; } - if (image->e_local_exec != KERN_HANDLE_INVALID) { - status = vm_region_map_relative( - image->e_local_exec, - phdr.p_vaddr, + if (image->e_local_space != KERN_HANDLE_INVALID) { + status = address_space_map( + image->e_local_space, + image->e_local_base + phdr.p_vaddr, vmo, offset, phdr.p_memsz, @@ -271,10 +275,10 @@ static enum launch_status map_executable(struct elf_image *image) return LAUNCH_ERR_MEMORY_MAP_FAILED; } - if (image->e_remote_exec != KERN_HANDLE_INVALID) { - status = vm_region_map_relative( - image->e_remote_exec, - phdr.p_vaddr, + if (image->e_remote_space != KERN_HANDLE_INVALID) { + status = address_space_map( + image->e_remote_space, + image->e_remote_base + phdr.p_vaddr, vmo, offset, phdr.p_memsz, @@ -499,8 +503,6 @@ void elf_image_init(struct elf_image *out) out->e_data = KERN_HANDLE_INVALID; out->e_local_space = KERN_HANDLE_INVALID; out->e_remote_space = KERN_HANDLE_INVALID; - out->e_local_exec = KERN_HANDLE_INVALID; - out->e_remote_exec = KERN_HANDLE_INVALID; } enum launch_status elf_image_load( @@ -547,6 +549,11 @@ enum launch_status elf_image_load( return status; } + status = release_exec_regions(image); + if (status != KERN_OK) { + return status; + } + status = relocate(image); if (status != LAUNCH_OK) { return status; @@ -557,9 +564,9 @@ enum launch_status elf_image_load( void elf_image_cleanup(struct elf_image *image) { - vm_region_unmap_relative(image->e_local_exec, 0, image->e_total_size); + address_space_unmap( + image->e_local_space, + image->e_local_base, + image->e_total_size); kern_handle_close(image->e_data); - vm_region_kill(image->e_local_exec); - kern_handle_close(image->e_local_exec); - kern_handle_close(image->e_remote_exec); } diff --git a/lib/liblaunch/elf.h b/lib/liblaunch/elf.h index 8432c8a..000f09f 100644 --- a/lib/liblaunch/elf.h +++ b/lib/liblaunch/elf.h @@ -292,7 +292,6 @@ struct elf_image { size_t e_page_size; kern_handle_t e_image, e_data; kern_handle_t e_local_space, e_remote_space; - kern_handle_t e_local_exec, e_remote_exec; virt_addr_t e_local_base, e_remote_base; elf_ehdr_t e_hdr; elf_phdr_t e_dynamic; diff --git a/lib/liblaunch/launch.c b/lib/liblaunch/launch.c index 79518a8..598bfa4 100644 --- a/lib/liblaunch/launch.c +++ b/lib/liblaunch/launch.c @@ -157,17 +157,17 @@ enum launch_status launch_ctx_execute( } virt_addr_t remote_stack_buf, local_stack_buf; - kstatus = vm_region_map_relative( + kstatus = address_space_map( remote_address_space, - VM_REGION_ANY_OFFSET, + MAP_ADDRESS_ANY, stack_vmo, 0, STACK_SIZE, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER, &remote_stack_buf); - kstatus = vm_region_map_relative( + kstatus = address_space_map( params->p_local_address_space, - VM_REGION_ANY_OFFSET, + MAP_ADDRESS_ANY, stack_vmo, 0, STACK_SIZE,