[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] [PATCH 04/18] armv7m: Explicit error for bad vector table
From: |
Peter Maydell |
Subject: |
Re: [Qemu-arm] [PATCH 04/18] armv7m: Explicit error for bad vector table |
Date: |
Tue, 17 Nov 2015 17:33:05 +0000 |
On 9 November 2015 at 01:11, Michael Davidsaver <address@hidden> wrote:
> Give an explicit error and abort when a load
> from VECBASE fails. Otherwise would likely
> jump to 0, which for v7-m holds the reset stack
> pointer address.
>
> Signed-off-by: Michael Davidsaver <address@hidden>
> ---
> target-arm/helper.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 4178400..1d7ac43 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -5496,7 +5496,17 @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
> /* Clear IT bits */
> env->condexec_bits = 0;
> env->regs[14] = lr;
> - addr = ldl_phys(cs->as, env->v7m.vecbase + env->v7m.exception * 4);
> + {
> + MemTxResult result;
> + addr = address_space_ldl(cs->as,
> + env->v7m.vecbase + env->v7m.exception * 4,
> + MEMTXATTRS_UNSPECIFIED, &result);
> + if (result != MEMTX_OK) {
> + cpu_abort(cs, "Failed to read from exception vector table "
> + "entry %08x\n",
> + env->v7m.vecbase + env->v7m.exception * 4);
> + }
> + }
The behaviour on a failed vector table read is actually architecturally
specified: we should take a nested exception (escalated to HardFault).
If it happens while we're trying to take a HardFault in the first place
then we go into Lockup (where the CPU sits around repeatedly trying
to execute an instruction at 0xFFFFFFFE; it is technically possible
to get back out of Lockup by taking an NMI or a system reset).
That said, trying to get nested exceptions and priority escalation
right is fairly involved, and implementing lockup is both involved
and an exercise in pointlessness. So I think this code is an
improvement overall. I would suggest some small changes, though:
(1) factor this out into its own function, something like:
static uint32_t v7m_read_vector(CPUARMState *env, int excnum)
so the calling code can just do
addr = v7m_read_vector(env, env->v7m.exception);
(2) use a local variable for "env->v7m.vecbase + excnum * 4"
rather than calculating it twice
thanks
-- PMM
- [Qemu-arm] [PATCH 06/18] armv7m: new NVIC utility functions, (continued)
- [Qemu-arm] [PATCH 06/18] armv7m: new NVIC utility functions, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 09/18] armv7m: NVIC update vmstate, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 10/18] armv7m: NVIC initialization, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 11/18] armv7m: fix I and F flag handling, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 17/18] armv7m: implement CCR, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 07/18] armv7m: Update NVIC registers, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 04/18] armv7m: Explicit error for bad vector table, Michael Davidsaver, 2015/11/09
- Re: [Qemu-arm] [PATCH 04/18] armv7m: Explicit error for bad vector table,
Peter Maydell <=
- [Qemu-arm] [PATCH 12/18] armv7m: simpler/faster exception start, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 13/18] armv7m: implement CFSR and HFSR, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 01/18] armv7m: MRS/MSR handle unprivileged access, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 18/18] armv7m: prevent unprivileged write to STIR, Michael Davidsaver, 2015/11/09
- [Qemu-arm] [PATCH 16/18] armv7m: check exception return consistency, Michael Davidsaver, 2015/11/09
- Re: [Qemu-arm] [PATCH 00/18] Fix exception handling and msr/mrs access, Peter Maydell, 2015/11/17