lib: launch: update to use new address-space api

This commit is contained in:
2026-03-15 09:42:22 +00:00
parent 5ad5f57a76
commit c9ccebacfc
3 changed files with 42 additions and 36 deletions

View File

@@ -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);
}