From 544cbf655fc24f7a10c25481ef5f9361d7b09ff2 Mon Sep 17 00:00:00 2001 From: William Wang Date: Sun, 20 Sep 2020 15:36:17 +0800 Subject: [PATCH] Difftest: add microarchitectural_pf_check API --- include/isa.h | 1 + src/isa/riscv64/difftest/ref.c | 7 +++++++ src/isa/riscv64/local-include/csr.h | 1 + src/monitor/difftest/ref.c | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/include/isa.h b/include/isa.h index 9215653f..39617b18 100644 --- a/include/isa.h +++ b/include/isa.h @@ -40,5 +40,6 @@ void isa_difftest_getregs(void *r); void isa_difftest_setregs(const void *r); void isa_difftest_raise_intr(word_t NO); void isa_difftest_sync(uint64_t *sync); +bool isa_difftest_microarchitectural_pf_check(vaddr_t addr); #endif diff --git a/src/isa/riscv64/difftest/ref.c b/src/isa/riscv64/difftest/ref.c index f6c59869..fd020458 100644 --- a/src/isa/riscv64/difftest/ref.c +++ b/src/isa/riscv64/difftest/ref.c @@ -68,6 +68,13 @@ void isa_difftest_sync(uint64_t *sync) { // } } +// Legal pagefault might be caused by microarchitural implements. +// For instance, write pte and not sfence it will lead to pagefault. +// (it may be still in sbuffer) +bool isa_difftest_microarchitectural_pf_check(vaddr_t addr) { + return !ptw_is_safe(addr); +} + void isa_difftest_raise_intr(word_t NO) { DecodeExecState s; s.is_jmp = 0; diff --git a/src/isa/riscv64/local-include/csr.h b/src/isa/riscv64/local-include/csr.h index 29873e1b..f3beb20a 100644 --- a/src/isa/riscv64/local-include/csr.h +++ b/src/isa/riscv64/local-include/csr.h @@ -205,5 +205,6 @@ void csr_write(uint32_t addr, rtlreg_t *src); enum { MODE_U = 0, MODE_S, MODE_H, MODE_M }; void change_mode(uint8_t m); +bool ptw_is_safe(vaddr_t vaddr); #endif diff --git a/src/monitor/difftest/ref.c b/src/monitor/difftest/ref.c index 86b8cbd9..9e9d8f7f 100644 --- a/src/monitor/difftest/ref.c +++ b/src/monitor/difftest/ref.c @@ -25,6 +25,10 @@ void difftest_sync(uint64_t *sync) { isa_difftest_sync(sync); } +void difftest_microarchitectural_pf_check(vaddr_t addr){ + isa_difftest_microarchitectural_pf_check(addr); +} + void difftest_exec(uint64_t n) { cpu_exec(n); } -- GitLab