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);
|
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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user