From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, patches@linaro.org,
Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-arm] [PATCH 2/8] cpu: Define new cpu_transaction_failed() hook
Date: Sat, 5 Aug 2017 03:06:22 +0200 [thread overview]
Message-ID: <20170805010622.GZ4859@toto> (raw)
In-Reply-To: <1501867249-1924-3-git-send-email-peter.maydell@linaro.org>
On Fri, Aug 04, 2017 at 06:20:43PM +0100, Peter Maydell wrote:
> Currently we have a rather half-baked setup for allowing CPUs to
> generate exceptions on accesses to invalid memory: the CPU has a
> cpu_unassigned_access() hook which the memory system calls in
> unassigned_mem_write() and unassigned_mem_read() if the current_cpu
> pointer is non-NULL. This was originally designed before we
> implemented the MemTxResult type that allows memory operations to
> report a success or failure code, which is why the hook is called
> right at the bottom of the memory system. The major problem with
> this is that it means that the hook can be called even when the
> access was not actually done by the CPU: for instance if the CPU
> writes to a DMA engine register which causes the DMA engine to begin
> a transaction which has been set up by the guest to operate on
> invalid memory then this will casue the CPU to take an exception
> incorrectly. Another minor problem is that currently if a device
> returns a transaction error then this won't turn into a CPU exception
> at all.
>
> The right way to do this is to have allow the CPU to respond
> to memory system transaction failures at the point where the
> CPU specific code calls into the memory system.
>
> Define a new QOM CPU method and utility function
> cpu_transaction_failed() which is called in these cases.
> The functionality here overlaps with the existing
> cpu_unassigned_access() because individual target CPUs will
> need some work to convert them to the new system. When this
> transition is complete we can remove the old cpu_unassigned_access()
> code.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
>
> ---
> include/qom/cpu.h | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 25eefea..fc54d55 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -85,8 +85,10 @@ struct TranslationBlock;
> * @has_work: Callback for checking if there is work to do.
> * @do_interrupt: Callback for interrupt handling.
> * @do_unassigned_access: Callback for unassigned access handling.
> + * (this is deprecated: new targets should use do_transaction_failed instead)
> * @do_unaligned_access: Callback for unaligned access handling, if
> * the target defines #ALIGNED_ONLY.
> + * @do_transaction_failed: Callback for handling failed memory transactions
Looks OK but I wonder if there you might want to clarify that this is a
bus/slave failure and not a failure within the CPU (e.g not an MMU fault).
Anyway:
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> * @virtio_is_big_endian: Callback to return %true if a CPU which supports
> * runtime configurable endianness is currently big-endian. Non-configurable
> * CPUs can use the default implementation of this method. This method should
> @@ -153,6 +155,10 @@ typedef struct CPUClass {
> void (*do_unaligned_access)(CPUState *cpu, vaddr addr,
> MMUAccessType access_type,
> int mmu_idx, uintptr_t retaddr);
> + void (*do_transaction_failed)(CPUState *cpu, hwaddr physaddr, vaddr addr,
> + unsigned size, MMUAccessType access_type,
> + int mmu_idx, MemTxAttrs attrs,
> + MemTxResult response, uintptr_t retaddr);
> bool (*virtio_is_big_endian)(CPUState *cpu);
> int (*memory_rw_debug)(CPUState *cpu, vaddr addr,
> uint8_t *buf, int len, bool is_write);
> @@ -837,6 +843,21 @@ static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr,
>
> cc->do_unaligned_access(cpu, addr, access_type, mmu_idx, retaddr);
> }
> +
> +static inline void cpu_transaction_failed(CPUState *cpu, hwaddr physaddr,
> + vaddr addr, unsigned size,
> + MMUAccessType access_type,
> + int mmu_idx, MemTxAttrs attrs,
> + MemTxResult response,
> + uintptr_t retaddr)
> +{
> + CPUClass *cc = CPU_GET_CLASS(cpu);
> +
> + if (cc->do_transaction_failed) {
> + cc->do_transaction_failed(cpu, physaddr, addr, size, access_type,
> + mmu_idx, attrs, response, retaddr);
> + }
> +}
> #endif
>
> #endif /* NEED_CPU_H */
> --
> 2.7.4
>
>
WARNING: multiple messages have this Message-ID (diff)
From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org,
Richard Henderson <rth@twiddle.net>,
patches@linaro.org
Subject: Re: [Qemu-devel] [Qemu-arm] [PATCH 2/8] cpu: Define new cpu_transaction_failed() hook
Date: Sat, 5 Aug 2017 03:06:22 +0200 [thread overview]
Message-ID: <20170805010622.GZ4859@toto> (raw)
In-Reply-To: <1501867249-1924-3-git-send-email-peter.maydell@linaro.org>
On Fri, Aug 04, 2017 at 06:20:43PM +0100, Peter Maydell wrote:
> Currently we have a rather half-baked setup for allowing CPUs to
> generate exceptions on accesses to invalid memory: the CPU has a
> cpu_unassigned_access() hook which the memory system calls in
> unassigned_mem_write() and unassigned_mem_read() if the current_cpu
> pointer is non-NULL. This was originally designed before we
> implemented the MemTxResult type that allows memory operations to
> report a success or failure code, which is why the hook is called
> right at the bottom of the memory system. The major problem with
> this is that it means that the hook can be called even when the
> access was not actually done by the CPU: for instance if the CPU
> writes to a DMA engine register which causes the DMA engine to begin
> a transaction which has been set up by the guest to operate on
> invalid memory then this will casue the CPU to take an exception
> incorrectly. Another minor problem is that currently if a device
> returns a transaction error then this won't turn into a CPU exception
> at all.
>
> The right way to do this is to have allow the CPU to respond
> to memory system transaction failures at the point where the
> CPU specific code calls into the memory system.
>
> Define a new QOM CPU method and utility function
> cpu_transaction_failed() which is called in these cases.
> The functionality here overlaps with the existing
> cpu_unassigned_access() because individual target CPUs will
> need some work to convert them to the new system. When this
> transition is complete we can remove the old cpu_unassigned_access()
> code.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
>
> ---
> include/qom/cpu.h | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 25eefea..fc54d55 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -85,8 +85,10 @@ struct TranslationBlock;
> * @has_work: Callback for checking if there is work to do.
> * @do_interrupt: Callback for interrupt handling.
> * @do_unassigned_access: Callback for unassigned access handling.
> + * (this is deprecated: new targets should use do_transaction_failed instead)
> * @do_unaligned_access: Callback for unaligned access handling, if
> * the target defines #ALIGNED_ONLY.
> + * @do_transaction_failed: Callback for handling failed memory transactions
Looks OK but I wonder if there you might want to clarify that this is a
bus/slave failure and not a failure within the CPU (e.g not an MMU fault).
Anyway:
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> * @virtio_is_big_endian: Callback to return %true if a CPU which supports
> * runtime configurable endianness is currently big-endian. Non-configurable
> * CPUs can use the default implementation of this method. This method should
> @@ -153,6 +155,10 @@ typedef struct CPUClass {
> void (*do_unaligned_access)(CPUState *cpu, vaddr addr,
> MMUAccessType access_type,
> int mmu_idx, uintptr_t retaddr);
> + void (*do_transaction_failed)(CPUState *cpu, hwaddr physaddr, vaddr addr,
> + unsigned size, MMUAccessType access_type,
> + int mmu_idx, MemTxAttrs attrs,
> + MemTxResult response, uintptr_t retaddr);
> bool (*virtio_is_big_endian)(CPUState *cpu);
> int (*memory_rw_debug)(CPUState *cpu, vaddr addr,
> uint8_t *buf, int len, bool is_write);
> @@ -837,6 +843,21 @@ static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr,
>
> cc->do_unaligned_access(cpu, addr, access_type, mmu_idx, retaddr);
> }
> +
> +static inline void cpu_transaction_failed(CPUState *cpu, hwaddr physaddr,
> + vaddr addr, unsigned size,
> + MMUAccessType access_type,
> + int mmu_idx, MemTxAttrs attrs,
> + MemTxResult response,
> + uintptr_t retaddr)
> +{
> + CPUClass *cc = CPU_GET_CLASS(cpu);
> +
> + if (cc->do_transaction_failed) {
> + cc->do_transaction_failed(cpu, physaddr, addr, size, access_type,
> + mmu_idx, attrs, response, retaddr);
> + }
> +}
> #endif
>
> #endif /* NEED_CPU_H */
> --
> 2.7.4
>
>
next prev parent reply other threads:[~2017-08-05 1:06 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-04 17:20 [Qemu-arm] [PATCH 0/8] Implement ARM external abort handling Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 17:20 ` [Qemu-arm] [PATCH 1/8] memory.h: Move MemTxResult type to memattrs.h Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 17:47 ` [Qemu-arm] " Richard Henderson
2017-08-04 17:47 ` [Qemu-devel] " Richard Henderson
2017-08-05 0:59 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-05 0:59 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-07 23:11 ` [Qemu-arm] [Qemu-devel] " Alistair Francis
2017-08-07 23:11 ` [Qemu-devel] [Qemu-arm] " Alistair Francis
2017-08-04 17:20 ` [Qemu-arm] [PATCH 2/8] cpu: Define new cpu_transaction_failed() hook Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 18:42 ` [Qemu-arm] " Richard Henderson
2017-08-04 18:42 ` [Qemu-devel] " Richard Henderson
2017-08-05 1:06 ` Edgar E. Iglesias [this message]
2017-08-05 1:06 ` [Qemu-devel] [Qemu-arm] " Edgar E. Iglesias
2017-08-05 16:51 ` Peter Maydell
2017-08-05 16:51 ` [Qemu-devel] " Peter Maydell
2017-08-05 1:12 ` Edgar E. Iglesias
2017-08-05 1:12 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-05 17:18 ` Peter Maydell
2017-08-05 17:18 ` [Qemu-devel] " Peter Maydell
2017-08-04 17:20 ` [Qemu-arm] [PATCH 3/8] cputlb: Support generating CPU exceptions on memory transaction failures Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-05 1:15 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-05 1:15 ` [Qemu-devel] " Edgar E. Iglesias
2017-12-13 16:39 ` Peter Maydell
2017-12-13 16:39 ` [Qemu-devel] " Peter Maydell
2017-12-14 9:03 ` Paolo Bonzini
2017-12-14 9:03 ` [Qemu-devel] " Paolo Bonzini
2017-08-04 17:20 ` [Qemu-arm] [PATCH 4/8] boards.h: Define new flag ignore_memory_transaction_failures Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 18:09 ` [Qemu-arm] " Philippe Mathieu-Daudé
2017-08-04 18:09 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-08-04 19:23 ` Richard Henderson
2017-08-05 10:13 ` Peter Maydell
2017-08-05 10:13 ` Peter Maydell
2017-08-17 10:25 ` Peter Maydell
2017-08-17 10:25 ` [Qemu-devel] " Peter Maydell
2017-08-22 3:45 ` Philippe Mathieu-Daudé
2017-08-22 3:45 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-08-22 8:36 ` Peter Maydell
2017-08-22 8:36 ` [Qemu-devel] " Peter Maydell
[not found] ` <CAFEAcA_rSqsrfd_qJijtPFRe1qKEA=JiyHE+3J5atAgxAX8NBg@mail.gmail.com>
2017-08-24 20:28 ` Richard Henderson
2017-08-25 12:02 ` Peter Maydell
2017-08-05 10:29 ` Peter Maydell
2017-08-05 10:29 ` [Qemu-devel] " Peter Maydell
2017-08-05 1:23 ` Edgar E. Iglesias
2017-08-05 1:23 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-04 17:20 ` [Qemu-arm] [PATCH 5/8] hw/arm: Set ignore_memory_transaction_failures for most ARM boards Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-05 1:24 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-05 1:24 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-04 17:20 ` [Qemu-arm] [PATCH 6/8] target/arm: Factor out fault delivery code Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 20:10 ` [Qemu-arm] " Richard Henderson
2017-08-04 20:10 ` [Qemu-devel] " Richard Henderson
2017-08-05 1:40 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-05 1:40 ` [Qemu-devel] " Edgar E. Iglesias
2017-08-04 17:20 ` [Qemu-arm] [PATCH 7/8] target/arm: Allow deliver_fault() caller to specify EA bit Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 20:15 ` [Qemu-arm] " Richard Henderson
2017-08-04 20:15 ` [Qemu-devel] " Richard Henderson
2017-08-05 1:45 ` [Qemu-devel] [Qemu-arm] " Edgar E. Iglesias
2017-08-05 1:45 ` Edgar E. Iglesias
2017-08-04 17:20 ` [Qemu-arm] [PATCH 8/8] target/arm: Implement new do_transaction_failed hook Peter Maydell
2017-08-04 17:20 ` [Qemu-devel] " Peter Maydell
2017-08-04 20:26 ` [Qemu-arm] " Richard Henderson
2017-08-04 20:26 ` [Qemu-devel] " Richard Henderson
2017-08-05 1:44 ` [Qemu-arm] " Edgar E. Iglesias
2017-08-05 1:44 ` [Qemu-devel] " Edgar E. Iglesias
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170805010622.GZ4859@toto \
--to=edgar.iglesias@gmail.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.