uc: Handle freeing of multiple address spaces

This commit is contained in:
Lioncash 2018-02-18 21:24:09 -05:00
parent 2210c7f486
commit 6d5f465449
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
4 changed files with 11 additions and 9 deletions

View file

@ -1645,9 +1645,9 @@ MemoryRegion *iotlb_to_region(CPUState *cpu, hwaddr index, MemTxAttrs attrs)
return sections[index & ~TARGET_PAGE_MASK].mr; return sections[index & ~TARGET_PAGE_MASK].mr;
} }
void phys_mem_clean(struct uc_struct* uc) void phys_mem_clean(AddressSpace *as)
{ {
AddressSpaceDispatch* d = uc->as.next_dispatch; AddressSpaceDispatch* d = as->next_dispatch;
g_free(d->map.sections); g_free(d->map.sections);
} }

View file

@ -457,6 +457,7 @@ static inline bool cpu_can_do_io(CPUState *cpu)
return true; return true;
} }
void phys_mem_clean(struct uc_struct* uc); // Unicorn: Used for freeing
void phys_mem_clean(AddressSpace *as);
#endif #endif

View file

@ -27,9 +27,7 @@ static void release_common(void *t)
{ {
TCGPool *po, *to; TCGPool *po, *to;
TCGContext *s = (TCGContext *)t; TCGContext *s = (TCGContext *)t;
#if TCG_TARGET_REG_BITS == 32
int i; int i;
#endif
// Clean TCG. // Clean TCG.
TCGOpDef* def = &s->tcg_op_defs[0]; TCGOpDef* def = &s->tcg_op_defs[0];
@ -46,8 +44,11 @@ static void release_common(void *t)
// TODO(danghvu): these function is not available outside qemu // TODO(danghvu): these function is not available outside qemu
// so we keep them here instead of outside uc_close. // so we keep them here instead of outside uc_close.
phys_mem_clean(s->uc); for (i = 0; i < s->uc->cpu->num_ases; i++) {
address_space_destroy(&(s->uc->as)); AddressSpace *as = s->uc->cpu->cpu_ases[i].as;
phys_mem_clean(as);
address_space_destroy(as);
}
memory_free(s->uc); memory_free(s->uc);
tb_cleanup(s->uc); tb_cleanup(s->uc);
free_code_gen_buffer(s->uc); free_code_gen_buffer(s->uc);

4
uc.c
View file

@ -429,7 +429,7 @@ uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size)
MemoryRegion *mr = memory_mapping(uc, address); MemoryRegion *mr = memory_mapping(uc, address);
if (mr) { if (mr) {
len = (size_t)MIN(size - count, mr->end - address); len = (size_t)MIN(size - count, mr->end - address);
if (uc->read_mem(&uc->as, address, bytes, len) == false) if (uc->read_mem(uc->cpu->as, address, bytes, len) == false)
break; break;
count += len; count += len;
address += len; address += len;
@ -467,7 +467,7 @@ uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *_bytes, size_t
uc->readonly_mem(mr, false); uc->readonly_mem(mr, false);
len = (size_t)MIN(size - count, mr->end - address); len = (size_t)MIN(size - count, mr->end - address);
if (uc->write_mem(&uc->as, address, bytes, len) == false) if (uc->write_mem(uc->cpu->as, address, bytes, len) == false)
break; break;
if (!(operms & UC_PROT_WRITE)) // write protected if (!(operms & UC_PROT_WRITE)) // write protected