|
|
@ -190,7 +190,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
#if defined(SOFTMMU_CODE_ACCESS)
|
|
|
|
#if defined(SOFTMMU_CODE_ACCESS)
|
|
|
|
error_code = UC_ERR_FETCH_UNMAPPED;
|
|
|
|
error_code = UC_ERR_FETCH_UNMAPPED;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -198,7 +198,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
error_code = UC_ERR_READ_UNMAPPED;
|
|
|
|
error_code = UC_ERR_READ_UNMAPPED;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -221,7 +221,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -242,7 +242,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
// Unicorn: callback on memory read
|
|
|
|
// Unicorn: callback on memory read
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD) {
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data);
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -252,7 +252,7 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -402,7 +402,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
#if defined(SOFTMMU_CODE_ACCESS)
|
|
|
|
#if defined(SOFTMMU_CODE_ACCESS)
|
|
|
|
error_code = UC_ERR_FETCH_UNMAPPED;
|
|
|
|
error_code = UC_ERR_FETCH_UNMAPPED;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -410,7 +410,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
#else
|
|
|
|
#else
|
|
|
|
error_code = UC_ERR_READ_UNMAPPED;
|
|
|
|
error_code = UC_ERR_READ_UNMAPPED;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -433,7 +433,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -454,7 +454,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
// Unicorn: callback on memory read
|
|
|
|
// Unicorn: callback on memory read
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD) {
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data);
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -464,7 +464,7 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx,
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable
|
|
|
|
if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE, 0, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -647,7 +647,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
|
|
|
|
|
|
|
|
// Unicorn: callback on memory write
|
|
|
|
// Unicorn: callback on memory write
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data);
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -656,13 +656,13 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
if (mr == NULL) {
|
|
|
|
if (mr == NULL) {
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (! handled) {
|
|
|
|
if (!handled) {
|
|
|
|
// save error & quit
|
|
|
|
// save error & quit
|
|
|
|
env->invalid_addr = addr;
|
|
|
|
env->invalid_addr = addr;
|
|
|
|
env->invalid_error = UC_ERR_WRITE_UNMAPPED;
|
|
|
|
env->invalid_error = UC_ERR_WRITE_UNMAPPED;
|
|
|
@ -679,7 +679,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -805,7 +805,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
|
|
|
|
|
|
|
|
// Unicorn: callback on memory write
|
|
|
|
// Unicorn: callback on memory write
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data);
|
|
|
|
((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -814,7 +814,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
if (mr == NULL) {
|
|
|
|
if (mr == NULL) {
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -837,7 +837,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable
|
|
|
|
if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable
|
|
|
|
handled = false;
|
|
|
|
handled = false;
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) {
|
|
|
|
HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) {
|
|
|
|
if (! HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
if (!HOOK_BOUND_CHECK(hook, addr))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data)))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|