support memory redirection, so the issue #217 is fixed
This commit is contained in:
parent
cea1cf210d
commit
3a36e327ab
@ -54,6 +54,9 @@ typedef void (*uc_readonly_mem_t)(MemoryRegion *mr, bool readonly);
|
|||||||
// which interrupt should make emulation stop?
|
// which interrupt should make emulation stop?
|
||||||
typedef bool (*uc_args_int_t)(int intno);
|
typedef bool (*uc_args_int_t)(int intno);
|
||||||
|
|
||||||
|
// some architecture redirect virtual memory to physical memory like Mips
|
||||||
|
typedef uint64_t (*uc_mem_redirect_t)(uint64_t address);
|
||||||
|
|
||||||
|
|
||||||
struct hook_struct {
|
struct hook_struct {
|
||||||
int hook_type; // uc_tracecode_type & uc_tracemem_type
|
int hook_type; // uc_tracecode_type & uc_tracemem_type
|
||||||
@ -94,6 +97,7 @@ struct uc_struct {
|
|||||||
uc_args_uc_ram_size_t memory_map;
|
uc_args_uc_ram_size_t memory_map;
|
||||||
uc_mem_unmap_t memory_unmap;
|
uc_mem_unmap_t memory_unmap;
|
||||||
uc_readonly_mem_t readonly_mem;
|
uc_readonly_mem_t readonly_mem;
|
||||||
|
uc_mem_redirect_t mem_redirect;
|
||||||
// list of cpu
|
// list of cpu
|
||||||
void* cpu;
|
void* cpu;
|
||||||
|
|
||||||
|
@ -17,6 +17,21 @@
|
|||||||
#define READ_BYTE_L(x) (x & 0xff)
|
#define READ_BYTE_L(x) (x & 0xff)
|
||||||
|
|
||||||
|
|
||||||
|
static uint64_t mips_mem_redirect(uint64_t address)
|
||||||
|
{
|
||||||
|
// kseg0 range masks off high address bit
|
||||||
|
if (address >= 0x80000000 && address <= 0x9fffffff)
|
||||||
|
return address & 0x7fffffff;
|
||||||
|
|
||||||
|
// kseg1 range masks off top 3 address bits
|
||||||
|
if (address >= 0xa0000000 && address <= 0xbfffffff) {
|
||||||
|
return address & 0x1fffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no redirect
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
static void mips_set_pc(struct uc_struct *uc, uint64_t address)
|
static void mips_set_pc(struct uc_struct *uc, uint64_t address)
|
||||||
{
|
{
|
||||||
((CPUMIPSState *)uc->current_cpu->env_ptr)->active_tc.PC = address;
|
((CPUMIPSState *)uc->current_cpu->env_ptr)->active_tc.PC = address;
|
||||||
@ -96,5 +111,6 @@ __attribute__ ((visibility ("default")))
|
|||||||
uc->reg_write = mips_reg_write;
|
uc->reg_write = mips_reg_write;
|
||||||
uc->reg_reset = mips_reg_reset;
|
uc->reg_reset = mips_reg_reset;
|
||||||
uc->set_pc = mips_set_pc;
|
uc->set_pc = mips_set_pc;
|
||||||
|
uc->mem_redirect = mips_mem_redirect;
|
||||||
uc_common_init(uc);
|
uc_common_init(uc);
|
||||||
}
|
}
|
||||||
|
@ -69,5 +69,7 @@ int main()
|
|||||||
|
|
||||||
uc_close(uc);
|
uc_close(uc);
|
||||||
|
|
||||||
|
printf("Good, this bug is fixed!\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
4
uc.c
4
uc.c
@ -811,6 +811,10 @@ MemoryRegion *memory_mapping(struct uc_struct* uc, uint64_t address)
|
|||||||
if (uc->mapped_block_count == 0)
|
if (uc->mapped_block_count == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (uc->mem_redirect) {
|
||||||
|
address = uc->mem_redirect(address);
|
||||||
|
}
|
||||||
|
|
||||||
// try with the cache index first
|
// try with the cache index first
|
||||||
i = uc->mapped_block_cache_index;
|
i = uc->mapped_block_cache_index;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user