diff --git a/include/common.h b/include/common.h index 89721c25941c34853684585de7b022e2ea82470d..52b03ef20115e9bf4956cb81514b182c97d6eb74 100644 --- a/include/common.h +++ b/include/common.h @@ -2,7 +2,7 @@ #define __COMMON_H__ #define DEBUG -#define DIFF_TEST +//#define DIFF_TEST #define ISA64 diff --git a/src/isa/riscv64/diff-test.c b/src/isa/riscv64/diff-test.c index c3401d76a8cbb68034bf39f2a2a25de64f15be18..d0e26cf5c0986a00c58fa221b92e9a32238da753 100644 --- a/src/isa/riscv64/diff-test.c +++ b/src/isa/riscv64/diff-test.c @@ -2,6 +2,14 @@ #include "monitor/diff-test.h" bool isa_difftest_checkregs(CPU_state *ref_r, vaddr_t pc) { + /* + int i; + for (i = 0; i < sizeof(cpu.gpr) / sizeof(cpu.gpr[0]); i ++) { + if (((uint64_t)cpu.gpr[i]._64) > ((uint64_t)0xffffffff)) { + printf("!!-0x%lx, 0x%lx\n", ref_r->gpr[i]._64, cpu.gpr[i]._64); + } + }*/ + if (memcmp(&cpu, ref_r, DIFFTEST_REG_SIZE)) { int i; for (i = 0; i < sizeof(cpu.gpr) / sizeof(cpu.gpr[0]); i ++) { diff --git a/src/isa/riscv64/exec/compute.c b/src/isa/riscv64/exec/compute.c index 5d370ad13f9b3865c39fb6c500876d78ba7d0f5a..4162edd273b27f11eb97f9f36c3ec01ec414a659 100644 --- a/src/isa/riscv64/exec/compute.c +++ b/src/isa/riscv64/exec/compute.c @@ -93,6 +93,7 @@ make_EHelper(auipc) { } make_EHelper(lui) { + rtl_sext(&id_src->val, &id_src->val, 4); rtl_sr(id_dest->reg, &id_src->val, 4); print_asm_template2(lui); diff --git a/src/monitor/diff-test/diff-test.c b/src/monitor/diff-test/diff-test.c index 89b3aff906cfc5ae286830a47fd50ef418522318..76ae5d95f9ce845fd100891947e4297bbdc88d0e 100644 --- a/src/monitor/diff-test/diff-test.c +++ b/src/monitor/diff-test/diff-test.c @@ -67,7 +67,6 @@ void init_difftest(char *ref_so_file, long img_size) { "If it is not necessary, you can turn it off in include/common.h.", ref_so_file); ref_difftest_init(); - Log("Init done\n"); ref_difftest_memcpy_from_dut(PC_START, guest_to_host(IMAGE_START), img_size); ref_difftest_setregs(&cpu); } diff --git a/tools/qemu-diff/src/diff-test.c b/tools/qemu-diff/src/diff-test.c index f4d44dd7956aa6d6288839678977cdb249789f4e..1c214ee2c59b2ebf31e0cc7604026160c361e55b 100644 --- a/tools/qemu-diff/src/diff-test.c +++ b/tools/qemu-diff/src/diff-test.c @@ -31,9 +31,7 @@ void difftest_setregs(const void *r) { } void difftest_exec(uint64_t n) { - while (n --) { - gdb_si(); - } + while (n --) gdb_si(); } void difftest_init(void) { diff --git a/tools/qemu-diff/src/gdb-host.c b/tools/qemu-diff/src/gdb-host.c index 65c97569d64a3ae8079cdb96fb078ecd0af68b93..7e30617716582a076fd51a3f9ee2f79753ac5821 100644 --- a/tools/qemu-diff/src/gdb-host.c +++ b/tools/qemu-diff/src/gdb-host.c @@ -90,7 +90,7 @@ bool gdb_setregs(union isa_gdb_regs *r) { } bool gdb_si(void) { - + char buf[] = "vCont;s:1"; gdb_send(conn, (const uint8_t *)buf, strlen(buf)); size_t size; diff --git a/tools/qemu-diff/src/isa/riscv64/include/isa.h b/tools/qemu-diff/src/isa/riscv64/include/isa.h index a1a2e827464603cf041f96b4bf2b1c8c3df5ef83..3d13d80d5ea909aef6cedc2af66f4e64906a9c20 100644 --- a/tools/qemu-diff/src/isa/riscv64/include/isa.h +++ b/tools/qemu-diff/src/isa/riscv64/include/isa.h @@ -8,8 +8,8 @@ union isa_gdb_regs { struct { - uint32_t gpr[32]; - uint32_t pc; + uint64_t gpr[32]; + uint64_t pc; }; struct { uint32_t array[77]; diff --git a/tools/qemu-diff/src/isa/riscv64/init.c b/tools/qemu-diff/src/isa/riscv64/init.c index 651f58ce285f1e05610084a02ae818ca4fc877a2..bff7e7a7202159abbc86bc86cf9a6110b3cc7334 100644 --- a/tools/qemu-diff/src/isa/riscv64/init.c +++ b/tools/qemu-diff/src/isa/riscv64/init.c @@ -6,7 +6,8 @@ bool gdb_setregs(union isa_gdb_regs *); void difftest_exec(uint64_t n); static uint32_t initcode[] = { - 0x800006b7, // lui a3,0x8000 + //0x800006b7, // lui a3,0x8000 + 0x00000697, // auipc a3, 0x0 0x03c68693, // addi a3,a3,0x3c # 800003c 0x30569073, // csrw mtvec,a3 @@ -49,16 +50,15 @@ void init_isa(void) { gdb_getregs(&r); - /* - int i; + + /*int i; printf("print regs:\n"); for (i = 0; i < 32; i++) { - printf("0x%x\n", r.gpr[i]); + printf("0x%lx\n", r.gpr[i]); } - printf("0x%x\nend print\n", r.pc); + printf("0x%lx\nend print\n", r.pc); fflush(stdout);*/ // execute enough instructions - difftest_exec(19); - + difftest_exec(20); }