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); image->e_total_size);
kern_status_t status = KERN_OK; kern_status_t status = KERN_OK;
if (image->e_local_space != KERN_HANDLE_INVALID) { if (image->e_local_space != KERN_HANDLE_INVALID) {
status = vm_region_create( status = address_space_reserve(
image->e_local_space, image->e_local_space,
NULL, MAP_ADDRESS_ANY,
0,
VM_REGION_ANY_OFFSET,
image->e_total_size, image->e_total_size,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC
| VM_PROT_USER,
&image->e_local_exec,
&image->e_local_base); &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) { if (image->e_remote_space != KERN_HANDLE_INVALID) {
status = vm_region_create( status = address_space_reserve(
image->e_remote_space, image->e_remote_space,
NULL, MAP_ADDRESS_ANY,
0,
VM_REGION_ANY_OFFSET,
image->e_total_size, image->e_total_size,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC
| VM_PROT_USER,
&image->e_remote_exec,
&image->e_remote_base); &image->e_remote_base);
} }
if (status != KERN_OK) { if (status != KERN_OK) {
vm_region_kill(image->e_local_exec); address_space_release(
kern_handle_close(image->e_local_exec); image->e_local_space,
image->e_local_exec = KERN_HANDLE_INVALID; image->e_local_base,
image->e_total_size);
return status; return status;
} }
@@ -200,6 +191,19 @@ static kern_status_t create_exec_regions(struct elf_image *image)
return KERN_OK; 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) static enum launch_status map_executable(struct elf_image *image)
{ {
elf_phdr_t phdr; 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; return LAUNCH_ERR_IMAGE_DATA_LOAD_FAILED;
} }
if (image->e_local_exec != KERN_HANDLE_INVALID) { if (image->e_local_space != KERN_HANDLE_INVALID) {
status = vm_region_map_relative( status = address_space_map(
image->e_local_exec, image->e_local_space,
phdr.p_vaddr, image->e_local_base + phdr.p_vaddr,
vmo, vmo,
offset, offset,
phdr.p_memsz, phdr.p_memsz,
@@ -271,10 +275,10 @@ static enum launch_status map_executable(struct elf_image *image)
return LAUNCH_ERR_MEMORY_MAP_FAILED; return LAUNCH_ERR_MEMORY_MAP_FAILED;
} }
if (image->e_remote_exec != KERN_HANDLE_INVALID) { if (image->e_remote_space != KERN_HANDLE_INVALID) {
status = vm_region_map_relative( status = address_space_map(
image->e_remote_exec, image->e_remote_space,
phdr.p_vaddr, image->e_remote_base + phdr.p_vaddr,
vmo, vmo,
offset, offset,
phdr.p_memsz, phdr.p_memsz,
@@ -499,8 +503,6 @@ void elf_image_init(struct elf_image *out)
out->e_data = KERN_HANDLE_INVALID; out->e_data = KERN_HANDLE_INVALID;
out->e_local_space = KERN_HANDLE_INVALID; out->e_local_space = KERN_HANDLE_INVALID;
out->e_remote_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( enum launch_status elf_image_load(
@@ -547,6 +549,11 @@ enum launch_status elf_image_load(
return status; return status;
} }
status = release_exec_regions(image);
if (status != KERN_OK) {
return status;
}
status = relocate(image); status = relocate(image);
if (status != LAUNCH_OK) { if (status != LAUNCH_OK) {
return status; return status;
@@ -557,9 +564,9 @@ enum launch_status elf_image_load(
void elf_image_cleanup(struct elf_image *image) 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); 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);
} }

View File

@@ -292,7 +292,6 @@ struct elf_image {
size_t e_page_size; size_t e_page_size;
kern_handle_t e_image, e_data; kern_handle_t e_image, e_data;
kern_handle_t e_local_space, e_remote_space; 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; virt_addr_t e_local_base, e_remote_base;
elf_ehdr_t e_hdr; elf_ehdr_t e_hdr;
elf_phdr_t e_dynamic; elf_phdr_t e_dynamic;

View File

@@ -157,17 +157,17 @@ enum launch_status launch_ctx_execute(
} }
virt_addr_t remote_stack_buf, local_stack_buf; virt_addr_t remote_stack_buf, local_stack_buf;
kstatus = vm_region_map_relative( kstatus = address_space_map(
remote_address_space, remote_address_space,
VM_REGION_ANY_OFFSET, MAP_ADDRESS_ANY,
stack_vmo, stack_vmo,
0, 0,
STACK_SIZE, STACK_SIZE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
&remote_stack_buf); &remote_stack_buf);
kstatus = vm_region_map_relative( kstatus = address_space_map(
params->p_local_address_space, params->p_local_address_space,
VM_REGION_ANY_OFFSET, MAP_ADDRESS_ANY,
stack_vmo, stack_vmo,
0, 0,
STACK_SIZE, STACK_SIZE,