lib: launch: update to use new address-space api
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user