Message ID | 7e9b4a6cc07a931e62da9c18c40849690eef7150.1558131003.git.alistair.francis@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Miscellaneous patches from the RISC-V fork | expand |
On Fri, 17 May 2019 15:11:06 PDT (-0700), Alistair Francis wrote: > From: Michael Clark <mjc@sifive.com> > > This patch adds support for the riscv_cpu_unassigned_access call > and will raise a load or store access fault. > > Signed-off-by: Michael Clark <mjc@sifive.com> > [Changes by AF: > - Squash two patches and rewrite commit message > - Set baddr to the access address > ] > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > target/riscv/cpu.c | 1 + > target/riscv/cpu.h | 2 ++ > target/riscv/cpu_helper.c | 16 ++++++++++++++++ > 3 files changed, 19 insertions(+) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index b7675707e0..bfe92235d3 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -356,6 +356,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) > cc->gdb_stop_before_watchpoint = true; > cc->disas_set_info = riscv_cpu_disas_set_info; > #ifndef CONFIG_USER_ONLY > + cc->do_unassigned_access = riscv_cpu_unassigned_access; > cc->do_unaligned_access = riscv_cpu_do_unaligned_access; > cc->get_phys_page_debug = riscv_cpu_get_phys_page_debug; > #endif > diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h > index c17184f4e4..8250175811 100644 > --- a/target/riscv/cpu.h > +++ b/target/riscv/cpu.h > @@ -264,6 +264,8 @@ void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, > bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, > MMUAccessType access_type, int mmu_idx, > bool probe, uintptr_t retaddr); > +void riscv_cpu_unassigned_access(CPUState *cpu, hwaddr addr, bool is_write, > + bool is_exec, int unused, unsigned size); > char *riscv_isa_string(RISCVCPU *cpu); > void riscv_cpu_list(void); > > diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c > index 41d6db41c3..202b6f021d 100644 > --- a/target/riscv/cpu_helper.c > +++ b/target/riscv/cpu_helper.c > @@ -356,6 +356,22 @@ hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) > return phys_addr; > } > > +void riscv_cpu_unassigned_access(CPUState *cs, hwaddr addr, bool is_write, > + bool is_exec, int unused, unsigned size) > +{ > + RISCVCPU *cpu = RISCV_CPU(cs); > + CPURISCVState *env = &cpu->env; > + > + if (is_write) { > + cs->exception_index = RISCV_EXCP_STORE_AMO_ACCESS_FAULT; > + } else { > + cs->exception_index = RISCV_EXCP_LOAD_ACCESS_FAULT; > + } > + > + env->badaddr = addr; > + riscv_raise_exception(&cpu->env, cs->exception_index, GETPC()); > +} > + > void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, > MMUAccessType access_type, int mmu_idx, > uintptr_t retaddr) Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index b7675707e0..bfe92235d3 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -356,6 +356,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) cc->gdb_stop_before_watchpoint = true; cc->disas_set_info = riscv_cpu_disas_set_info; #ifndef CONFIG_USER_ONLY + cc->do_unassigned_access = riscv_cpu_unassigned_access; cc->do_unaligned_access = riscv_cpu_do_unaligned_access; cc->get_phys_page_debug = riscv_cpu_get_phys_page_debug; #endif diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index c17184f4e4..8250175811 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -264,6 +264,8 @@ void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size, MMUAccessType access_type, int mmu_idx, bool probe, uintptr_t retaddr); +void riscv_cpu_unassigned_access(CPUState *cpu, hwaddr addr, bool is_write, + bool is_exec, int unused, unsigned size); char *riscv_isa_string(RISCVCPU *cpu); void riscv_cpu_list(void); diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 41d6db41c3..202b6f021d 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -356,6 +356,22 @@ hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) return phys_addr; } +void riscv_cpu_unassigned_access(CPUState *cs, hwaddr addr, bool is_write, + bool is_exec, int unused, unsigned size) +{ + RISCVCPU *cpu = RISCV_CPU(cs); + CPURISCVState *env = &cpu->env; + + if (is_write) { + cs->exception_index = RISCV_EXCP_STORE_AMO_ACCESS_FAULT; + } else { + cs->exception_index = RISCV_EXCP_LOAD_ACCESS_FAULT; + } + + env->badaddr = addr; + riscv_raise_exception(&cpu->env, cs->exception_index, GETPC()); +} + void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr, MMUAccessType access_type, int mmu_idx, uintptr_t retaddr)