add basic mmu tests
Some simple tests for diffrent mmu. Basicly add some tlb entries, enable the mmu try to read from virtual address The aarm64 test was provided by imre-kis-arm in #1718
This commit is contained in:
@@ -634,6 +634,76 @@ static void test_riscv_correct_address_in_long_jump_hook(void)
|
||||
OK(uc_close(uc));
|
||||
}
|
||||
|
||||
static void test_riscv_mmu_prepare_tlb(uc_engine *uc, uint32_t data_address, uint32_t code_address)
|
||||
{
|
||||
uint64_t tlbe;
|
||||
uint32_t sptbr = 0x2000;
|
||||
|
||||
OK(uc_mem_map(uc, sptbr, 0x3000, UC_PROT_ALL)); //tlb base
|
||||
|
||||
tlbe = ((sptbr + 0x1000) >> 2) | 1;
|
||||
OK(uc_mem_write(uc, sptbr, &tlbe, sizeof(tlbe)));
|
||||
tlbe = ((sptbr + 0x2000) >> 2) | 1;
|
||||
OK(uc_mem_write(uc, sptbr + 0x1000, &tlbe, sizeof(tlbe)));
|
||||
|
||||
tlbe = (code_address >> 2) | (7 << 1) | 1;
|
||||
OK(uc_mem_write(uc, sptbr + 0x2000 + 0x15*8, &tlbe, sizeof(tlbe)));
|
||||
|
||||
tlbe = (data_address >> 2) | (7 << 1) | 1;
|
||||
OK(uc_mem_write(uc, sptbr + 0x2000 + 0x16*8, &tlbe, sizeof(tlbe)));
|
||||
}
|
||||
|
||||
static void test_riscv_mmu_hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *userdata)
|
||||
{
|
||||
if (address == 0x15010) {
|
||||
OK(uc_emu_stop(uc));
|
||||
}
|
||||
}
|
||||
|
||||
static void test_riscv_mmu(void)
|
||||
{
|
||||
uc_engine *uc;
|
||||
uc_hook h;
|
||||
uint32_t code_address = 0x5000;
|
||||
uint32_t data_address = 0x6000;
|
||||
uint32_t data_value = 0x41414141;
|
||||
uint32_t data_result = 0;
|
||||
|
||||
/*
|
||||
li t3, (8 << 60) | 2
|
||||
csrw sptbr, t3
|
||||
li t0, (1 << 11) | (1 << 5)
|
||||
csrw mstatus, t0
|
||||
la t1, 0x15000
|
||||
csrw mepc, t1
|
||||
mret
|
||||
*/
|
||||
char code_m[] = "\x1b\x0e\xf0\xff" "\x13\x1e\xfe\x03" "\x13\x0e\x2e\x00" "\x73\x10\x0e\x18" "\xb7\x12\x00\x00" "\x9b\x82\x02\x82" "\x73\x90\x02\x30" "\x37\x53\x01\x00" "\x73\x10\x13\x34" "\x73\x00\x20\x30";
|
||||
|
||||
/*
|
||||
li t0, 0x41414141
|
||||
li t1, 0x16000
|
||||
sw t0, 0(t1)
|
||||
nop
|
||||
*/
|
||||
char code_s[] = "\xb7\x42\x41\x41" "\x9b\x82\x12\x14" "\x37\x63\x01\x00" "\x23\x20\x53\x00" "\x13\x00\x00\x00";
|
||||
|
||||
OK(uc_open(UC_ARCH_RISCV, UC_MODE_RISCV64, &uc));
|
||||
OK(uc_hook_add(uc, &h, UC_HOOK_CODE, test_riscv_mmu_hook_code, NULL, 1, 0));
|
||||
OK(uc_mem_map(uc, 0x1000, 0x1000, UC_PROT_ALL));
|
||||
OK(uc_mem_map(uc, code_address, 0x1000, UC_PROT_ALL));
|
||||
OK(uc_mem_map(uc, data_address, 0x1000, UC_PROT_ALL));
|
||||
OK(uc_mem_write(uc, code_address, &code_s, sizeof(code_s)));
|
||||
OK(uc_mem_write(uc, 0x1000, &code_m, sizeof(code_m)));
|
||||
|
||||
test_riscv_mmu_prepare_tlb(uc, data_address, code_address);
|
||||
|
||||
OK(uc_emu_start(uc, 0x1000, sizeof(code_m) - 1, 0, 0));
|
||||
OK(uc_mem_read(uc, data_address, &data_result, sizeof(data_result)));
|
||||
|
||||
TEST_CHECK(data_value == data_result);
|
||||
}
|
||||
|
||||
TEST_LIST = {
|
||||
{"test_riscv32_nop", test_riscv32_nop},
|
||||
{"test_riscv64_nop", test_riscv64_nop},
|
||||
@@ -657,4 +727,5 @@ TEST_LIST = {
|
||||
test_riscv_correct_address_in_small_jump_hook},
|
||||
{"test_riscv_correct_address_in_long_jump_hook",
|
||||
test_riscv_correct_address_in_long_jump_hook},
|
||||
{"test_riscv_mmu", test_riscv_mmu},
|
||||
{NULL, NULL}};
|
||||
|
||||
Reference in New Issue
Block a user