implement host-controlled memory mapping for #261
This commit is contained in:
35
uc.c
35
uc.c
@ -570,8 +570,8 @@ static uc_err _hook_mem_access(uc_engine *uc, uc_hook_type type,
|
||||
return UC_ERR_OK;
|
||||
}
|
||||
|
||||
UNICORN_EXPORT
|
||||
uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms)
|
||||
// common setup/error checking shared between uc_mem_map and uc_mem_map_ptr
|
||||
static uc_err mem_map_start(uc_engine *uc, uint64_t address, size_t size, uint32_t perms)
|
||||
{
|
||||
MemoryRegion **regions;
|
||||
|
||||
@ -600,7 +600,13 @@ uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms)
|
||||
uc->mapped_blocks = regions;
|
||||
}
|
||||
|
||||
uc->mapped_blocks[uc->mapped_block_count] = uc->memory_map(uc, address, size, perms);
|
||||
return UC_ERR_OK;
|
||||
}
|
||||
|
||||
// common final step shared by uc_mem_map and uc_mem_map_ptr
|
||||
static uc_err mem_map_finish(uc_engine *uc, MemoryRegion *block)
|
||||
{
|
||||
uc->mapped_blocks[uc->mapped_block_count] = block;
|
||||
if (uc->mapped_blocks[uc->mapped_block_count] == NULL)
|
||||
return UC_ERR_NOMEM;
|
||||
|
||||
@ -609,6 +615,29 @@ uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms)
|
||||
return UC_ERR_OK;
|
||||
}
|
||||
|
||||
UNICORN_EXPORT
|
||||
uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms)
|
||||
{
|
||||
uc_err err;
|
||||
if ((err = mem_map_start(uc, address, size, perms)) != UC_ERR_OK)
|
||||
return err;
|
||||
|
||||
return mem_map_finish(uc, uc->memory_map(uc, address, size, perms));
|
||||
}
|
||||
|
||||
UNICORN_EXPORT
|
||||
uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, void *ptr)
|
||||
{
|
||||
if (ptr == NULL)
|
||||
return UC_ERR_ARG;
|
||||
|
||||
uc_err err;
|
||||
if ((err = mem_map_start(uc, address, size, UC_PROT_ALL)) != UC_ERR_OK)
|
||||
return err;
|
||||
|
||||
return mem_map_finish(uc, uc->memory_map_ptr(uc, address, size, ptr));
|
||||
}
|
||||
|
||||
// Create a backup copy of the indicated MemoryRegion.
|
||||
// Generally used in prepartion for splitting a MemoryRegion.
|
||||
static uint8_t *copy_region(struct uc_struct *uc, MemoryRegion *mr)
|
||||
|
Reference in New Issue
Block a user