[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 18/48] tcg: add memory callbacks for plugins (WIP)
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [RFC 18/48] tcg: add memory callbacks for plugins (WIP) |
Date: |
Fri, 23 Nov 2018 16:55:52 +0000 |
User-agent: |
mu4e 1.1.0; emacs 26.1.90 |
Emilio G. Cota <address@hidden> writes:
> XXX: store hostaddr from non-i386 TCG backends
> XXX: what hostaddr to return for I/O accesses?
> XXX: what hostaddr to return for cross-page accesses?
>
> Here the trickiest feature is passing the host address to
> memory callbacks that request it. Perhaps it would be more
> appropriate to pass a "physical" address to plugins, but since
> in QEMU host addr ~= guest physical, I'm going with that for
> simplicity.
>
> To keep the implementation simple we piggy-back on the TLB fast path,
> and thus can only provide the host address _after_ memory accesses
> have occurred. For the slow path, it's a bit tedious because there
> are many places to update, but it's fairly simple.
>
> However, note that cross-page accesses are tricky, since the
> access might be to non-contiguous host addresses. So I'm punting
> on that and just passing NULL.
>
> Signed-off-by: Emilio G. Cota <address@hidden>
> ---
> accel/tcg/atomic_template.h | 8 ++++-
> accel/tcg/softmmu_template.h | 39 ++++++++++++++++++++
> include/exec/cpu-defs.h | 2 ++
> include/exec/cpu_ldst_template.h | 43 +++++++++++++++--------
> include/exec/cpu_ldst_useronly_template.h | 42 +++++++++++++++-------
> tcg/tcg-op.h | 5 +++
> tcg/tcg.h | 4 +++
> tcg/i386/tcg-target.inc.c | 5 +++
> tcg/tcg-op.c | 37 ++++++++++++++-----
> tcg/tcg.c | 3 ++
> 10 files changed, 152 insertions(+), 36 deletions(-)
>
> diff --git a/accel/tcg/atomic_template.h b/accel/tcg/atomic_template.h
> index b13318c1ce..3de34dc462 100644
> --- a/accel/tcg/atomic_template.h
> +++ b/accel/tcg/atomic_template.h
> @@ -18,6 +18,7 @@
> * License along with this library; if not, see
> <http://www.gnu.org/licenses/>.
> */
>
> +#include "qemu/plugin.h"
> #include "trace/mem.h"
>
> #if DATA_SIZE == 16
> @@ -66,17 +67,22 @@
> trace_guest_mem_before_exec(ENV_GET_CPU(env), addr, info |
> TRACE_MEM_ST); \
> } while (0)
>
> -# define ATOMIC_TRACE_RMW_POST \
> +# define ATOMIC_TRACE_RMW_POST do {
> \
> + qemu_plugin_vcpu_mem_cb(ENV_GET_CPU(env), addr, haddr, info);
> \
> + qemu_plugin_vcpu_mem_cb(ENV_GET_CPU(env), addr, haddr, info |
> TRACE_MEM_ST); \
> +} while (0)
>
> # define ATOMIC_TRACE_LD_PRE \
> trace_guest_mem_before_exec(ENV_GET_CPU(env), addr, info)
>
> # define ATOMIC_TRACE_LD_POST \
> + qemu_plugin_vcpu_mem_cb(ENV_GET_CPU(env), addr, haddr, info)
>
> # define ATOMIC_TRACE_ST_PRE \
> trace_guest_mem_before_exec(ENV_GET_CPU(env), addr, info)
>
> # define ATOMIC_TRACE_ST_POST \
> + qemu_plugin_vcpu_mem_cb(ENV_GET_CPU(env), addr, haddr, info)
>
> #endif /* ATOMIC_TRACE_RMW_PRE */
>
> diff --git a/accel/tcg/softmmu_template.h b/accel/tcg/softmmu_template.h
> index b0adea045e..f6d2f60b81 100644
> --- a/accel/tcg/softmmu_template.h
> +++ b/accel/tcg/softmmu_template.h
> @@ -103,6 +103,11 @@ static inline DATA_TYPE glue(io_read,
> SUFFIX)(CPUArchState *env,
> MMUAccessType access_type)
> {
> CPUIOTLBEntry *iotlbentry = &env->iotlb[mmu_idx][index];
> +
> + /* XXX Any sensible choice other than NULL? */
> + if (tcg_ctx->plugin_mem_cb) {
> + env->hostaddr = NULL;
> + }
This is more argument for getting the softmmu de-macrofiction in first.
--
Alex Bennée
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [RFC 18/48] tcg: add memory callbacks for plugins (WIP),
Alex Bennée <=