mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
target/riscv: Add support for the new execption numbers
The v0.5 Hypervisor spec add new execption numbers, let's add support for those. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
parent
bd023ce33b
commit
ab67a1d07a
4 changed files with 37 additions and 20 deletions
|
@ -67,6 +67,14 @@ const char * const riscv_excp_names[] = {
|
||||||
"load_page_fault",
|
"load_page_fault",
|
||||||
"reserved",
|
"reserved",
|
||||||
"store_page_fault"
|
"store_page_fault"
|
||||||
|
"reserved",
|
||||||
|
"reserved",
|
||||||
|
"reserved",
|
||||||
|
"reserved",
|
||||||
|
"guest_exec_page_fault",
|
||||||
|
"guest_load_page_fault",
|
||||||
|
"reserved",
|
||||||
|
"guest_store_page_fault"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * const riscv_intr_names[] = {
|
const char * const riscv_intr_names[] = {
|
||||||
|
|
|
@ -488,22 +488,25 @@
|
||||||
#define DEFAULT_RSTVEC 0x1000
|
#define DEFAULT_RSTVEC 0x1000
|
||||||
|
|
||||||
/* Exception causes */
|
/* Exception causes */
|
||||||
#define EXCP_NONE -1 /* sentinel value */
|
#define EXCP_NONE -1 /* sentinel value */
|
||||||
#define RISCV_EXCP_INST_ADDR_MIS 0x0
|
#define RISCV_EXCP_INST_ADDR_MIS 0x0
|
||||||
#define RISCV_EXCP_INST_ACCESS_FAULT 0x1
|
#define RISCV_EXCP_INST_ACCESS_FAULT 0x1
|
||||||
#define RISCV_EXCP_ILLEGAL_INST 0x2
|
#define RISCV_EXCP_ILLEGAL_INST 0x2
|
||||||
#define RISCV_EXCP_BREAKPOINT 0x3
|
#define RISCV_EXCP_BREAKPOINT 0x3
|
||||||
#define RISCV_EXCP_LOAD_ADDR_MIS 0x4
|
#define RISCV_EXCP_LOAD_ADDR_MIS 0x4
|
||||||
#define RISCV_EXCP_LOAD_ACCESS_FAULT 0x5
|
#define RISCV_EXCP_LOAD_ACCESS_FAULT 0x5
|
||||||
#define RISCV_EXCP_STORE_AMO_ADDR_MIS 0x6
|
#define RISCV_EXCP_STORE_AMO_ADDR_MIS 0x6
|
||||||
#define RISCV_EXCP_STORE_AMO_ACCESS_FAULT 0x7
|
#define RISCV_EXCP_STORE_AMO_ACCESS_FAULT 0x7
|
||||||
#define RISCV_EXCP_U_ECALL 0x8
|
#define RISCV_EXCP_U_ECALL 0x8
|
||||||
#define RISCV_EXCP_S_ECALL 0x9
|
#define RISCV_EXCP_S_ECALL 0x9
|
||||||
#define RISCV_EXCP_H_ECALL 0xa
|
#define RISCV_EXCP_VS_ECALL 0xa
|
||||||
#define RISCV_EXCP_M_ECALL 0xb
|
#define RISCV_EXCP_M_ECALL 0xb
|
||||||
#define RISCV_EXCP_INST_PAGE_FAULT 0xc /* since: priv-1.10.0 */
|
#define RISCV_EXCP_INST_PAGE_FAULT 0xc /* since: priv-1.10.0 */
|
||||||
#define RISCV_EXCP_LOAD_PAGE_FAULT 0xd /* since: priv-1.10.0 */
|
#define RISCV_EXCP_LOAD_PAGE_FAULT 0xd /* since: priv-1.10.0 */
|
||||||
#define RISCV_EXCP_STORE_PAGE_FAULT 0xf /* since: priv-1.10.0 */
|
#define RISCV_EXCP_STORE_PAGE_FAULT 0xf /* since: priv-1.10.0 */
|
||||||
|
#define RISCV_EXCP_INST_GUEST_PAGE_FAULT 0x14
|
||||||
|
#define RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT 0x15
|
||||||
|
#define RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT 0x17
|
||||||
|
|
||||||
#define RISCV_EXCP_INT_FLAG 0x80000000
|
#define RISCV_EXCP_INT_FLAG 0x80000000
|
||||||
#define RISCV_EXCP_INT_MASK 0x7fffffff
|
#define RISCV_EXCP_INT_MASK 0x7fffffff
|
||||||
|
|
|
@ -528,13 +528,16 @@ void riscv_cpu_do_interrupt(CPUState *cs)
|
||||||
static const int ecall_cause_map[] = {
|
static const int ecall_cause_map[] = {
|
||||||
[PRV_U] = RISCV_EXCP_U_ECALL,
|
[PRV_U] = RISCV_EXCP_U_ECALL,
|
||||||
[PRV_S] = RISCV_EXCP_S_ECALL,
|
[PRV_S] = RISCV_EXCP_S_ECALL,
|
||||||
[PRV_H] = RISCV_EXCP_H_ECALL,
|
[PRV_H] = RISCV_EXCP_VS_ECALL,
|
||||||
[PRV_M] = RISCV_EXCP_M_ECALL
|
[PRV_M] = RISCV_EXCP_M_ECALL
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!async) {
|
if (!async) {
|
||||||
/* set tval to badaddr for traps with address information */
|
/* set tval to badaddr for traps with address information */
|
||||||
switch (cause) {
|
switch (cause) {
|
||||||
|
case RISCV_EXCP_INST_GUEST_PAGE_FAULT:
|
||||||
|
case RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT:
|
||||||
|
case RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT:
|
||||||
case RISCV_EXCP_INST_ADDR_MIS:
|
case RISCV_EXCP_INST_ADDR_MIS:
|
||||||
case RISCV_EXCP_INST_ACCESS_FAULT:
|
case RISCV_EXCP_INST_ACCESS_FAULT:
|
||||||
case RISCV_EXCP_LOAD_ADDR_MIS:
|
case RISCV_EXCP_LOAD_ADDR_MIS:
|
||||||
|
@ -556,7 +559,7 @@ void riscv_cpu_do_interrupt(CPUState *cs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_riscv_trap(env->mhartid, async, cause, env->pc, tval, cause < 16 ?
|
trace_riscv_trap(env->mhartid, async, cause, env->pc, tval, cause < 23 ?
|
||||||
(async ? riscv_intr_names : riscv_excp_names)[cause] : "(unknown)");
|
(async ? riscv_intr_names : riscv_excp_names)[cause] : "(unknown)");
|
||||||
|
|
||||||
if (env->priv <= PRV_S &&
|
if (env->priv <= PRV_S &&
|
||||||
|
|
|
@ -242,11 +242,14 @@ static const target_ulong delegable_excps =
|
||||||
(1ULL << (RISCV_EXCP_STORE_AMO_ACCESS_FAULT)) |
|
(1ULL << (RISCV_EXCP_STORE_AMO_ACCESS_FAULT)) |
|
||||||
(1ULL << (RISCV_EXCP_U_ECALL)) |
|
(1ULL << (RISCV_EXCP_U_ECALL)) |
|
||||||
(1ULL << (RISCV_EXCP_S_ECALL)) |
|
(1ULL << (RISCV_EXCP_S_ECALL)) |
|
||||||
(1ULL << (RISCV_EXCP_H_ECALL)) |
|
(1ULL << (RISCV_EXCP_VS_ECALL)) |
|
||||||
(1ULL << (RISCV_EXCP_M_ECALL)) |
|
(1ULL << (RISCV_EXCP_M_ECALL)) |
|
||||||
(1ULL << (RISCV_EXCP_INST_PAGE_FAULT)) |
|
(1ULL << (RISCV_EXCP_INST_PAGE_FAULT)) |
|
||||||
(1ULL << (RISCV_EXCP_LOAD_PAGE_FAULT)) |
|
(1ULL << (RISCV_EXCP_LOAD_PAGE_FAULT)) |
|
||||||
(1ULL << (RISCV_EXCP_STORE_PAGE_FAULT));
|
(1ULL << (RISCV_EXCP_STORE_PAGE_FAULT)) |
|
||||||
|
(1ULL << (RISCV_EXCP_INST_GUEST_PAGE_FAULT)) |
|
||||||
|
(1ULL << (RISCV_EXCP_LOAD_GUEST_ACCESS_FAULT)) |
|
||||||
|
(1ULL << (RISCV_EXCP_STORE_GUEST_AMO_ACCESS_FAULT));
|
||||||
static const target_ulong sstatus_v1_9_mask = SSTATUS_SIE | SSTATUS_SPIE |
|
static const target_ulong sstatus_v1_9_mask = SSTATUS_SIE | SSTATUS_SPIE |
|
||||||
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
|
SSTATUS_UIE | SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS |
|
||||||
SSTATUS_SUM | SSTATUS_SD;
|
SSTATUS_SUM | SSTATUS_SD;
|
||||||
|
|
Loading…
Reference in a new issue