mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-03 15:45:35 +00:00
when uc_mem_exec() remove EXE permission, quit current TB & continue emulating with TB flushed. this fixes issue in PR #378
This commit is contained in:
parent
876c423dd0
commit
e750a4e97c
|
@ -215,6 +215,7 @@ struct uc_struct {
|
||||||
|
|
||||||
bool init_tcg; // already initialized local TCGv variables?
|
bool init_tcg; // already initialized local TCGv variables?
|
||||||
bool stop_request; // request to immediately stop emulation - for uc_emu_stop()
|
bool stop_request; // request to immediately stop emulation - for uc_emu_stop()
|
||||||
|
bool quit_request; // request to quit the current TB, but continue to emulate - for uc_mem_protect()
|
||||||
bool emulation_done; // emulation is done by uc_emu_start()
|
bool emulation_done; // emulation is done by uc_emu_start()
|
||||||
QemuThread timer; // timer for emulation timeout
|
QemuThread timer; // timer for emulation timeout
|
||||||
uint64_t timeout; // timeout for uc_emu_start()
|
uint64_t timeout; // timeout for uc_emu_start()
|
||||||
|
|
|
@ -231,8 +231,14 @@ static bool tcg_exec_all(struct uc_struct* uc)
|
||||||
//qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
|
//qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
|
||||||
// (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
|
// (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
|
||||||
if (cpu_can_run(cpu)) {
|
if (cpu_can_run(cpu)) {
|
||||||
|
uc->quit_request = false;
|
||||||
r = tcg_cpu_exec(uc, env);
|
r = tcg_cpu_exec(uc, env);
|
||||||
if (uc->stop_request) {
|
|
||||||
|
// quit current TB but continue emulating?
|
||||||
|
if (uc->quit_request) {
|
||||||
|
// reset stop_request
|
||||||
|
uc->stop_request = false;
|
||||||
|
} else if (uc->stop_request) {
|
||||||
//printf(">>> got STOP request!!!\n");
|
//printf(">>> got STOP request!!!\n");
|
||||||
finish = true;
|
finish = true;
|
||||||
break;
|
break;
|
||||||
|
|
11
uc.c
11
uc.c
|
@ -826,6 +826,7 @@ uc_err uc_mem_protect(struct uc_struct *uc, uint64_t address, size_t size, uint3
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
uint64_t addr = address;
|
uint64_t addr = address;
|
||||||
size_t count, len;
|
size_t count, len;
|
||||||
|
bool remove_exec = false;
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
// trivial case, no change
|
// trivial case, no change
|
||||||
|
@ -862,12 +863,22 @@ uc_err uc_mem_protect(struct uc_struct *uc, uint64_t address, size_t size, uint3
|
||||||
return UC_ERR_NOMEM;
|
return UC_ERR_NOMEM;
|
||||||
|
|
||||||
mr = memory_mapping(uc, addr);
|
mr = memory_mapping(uc, addr);
|
||||||
|
// will this remove EXEC permission?
|
||||||
|
if (((mr->perms & UC_PROT_EXEC) != 0) && ((perms & UC_PROT_EXEC) == 0))
|
||||||
|
remove_exec = true;
|
||||||
mr->perms = perms;
|
mr->perms = perms;
|
||||||
uc->readonly_mem(mr, (perms & UC_PROT_WRITE) == 0);
|
uc->readonly_mem(mr, (perms & UC_PROT_WRITE) == 0);
|
||||||
|
|
||||||
count += len;
|
count += len;
|
||||||
addr += len;
|
addr += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if EXEC permission is removed, then quit TB and continue at the same place
|
||||||
|
if (remove_exec) {
|
||||||
|
uc->quit_request = true;
|
||||||
|
uc_emu_stop(uc);
|
||||||
|
}
|
||||||
|
|
||||||
return UC_ERR_OK;
|
return UC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue