From: "Alex Bennée" <alex.bennee@linaro.org>
To: Aaron Lindsay <aaron@os.amperecomputing.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
cota@braap.org, richard.henderson@linaro.org,
qemu-devel@nongnu.org
Subject: Re: [PATCH v2] plugins: Expose physical addresses instead of device offsets
Date: Thu, 11 Mar 2021 10:29:24 +0000 [thread overview]
Message-ID: <87pn066l11.fsf@linaro.org> (raw)
In-Reply-To: <20210309202802.211756-1-aaron@os.amperecomputing.com>
Aaron Lindsay <aaron@os.amperecomputing.com> writes:
> This allows plugins to query for full virtual-to-physical address
> translation for a given `qemu_plugin_hwaddr` and stops exposing the
> offset within the device itself. As this change breaks the API,
> QEMU_PLUGIN_VERSION is incremented.
>
> Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
Queued to plugins/next, thanks.
> ---
> contrib/plugins/hotpages.c | 2 +-
> contrib/plugins/hwprofile.c | 2 +-
> include/qemu/qemu-plugin.h | 32 +++++++++++++++++++++++++-------
> plugins/api.c | 17 ++++++++++++-----
> 4 files changed, 39 insertions(+), 14 deletions(-)
>
> diff --git a/contrib/plugins/hotpages.c b/contrib/plugins/hotpages.c
> index eacc678eac..bf53267532 100644
> --- a/contrib/plugins/hotpages.c
> +++ b/contrib/plugins/hotpages.c
> @@ -122,7 +122,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
> }
> } else {
> if (hwaddr && !qemu_plugin_hwaddr_is_io(hwaddr)) {
> - page = (uint64_t) qemu_plugin_hwaddr_device_offset(hwaddr);
> + page = (uint64_t) qemu_plugin_hwaddr_phys_addr(hwaddr);
> } else {
> page = vaddr;
> }
> diff --git a/contrib/plugins/hwprofile.c b/contrib/plugins/hwprofile.c
> index 6dac1d5f85..faf216ac00 100644
> --- a/contrib/plugins/hwprofile.c
> +++ b/contrib/plugins/hwprofile.c
> @@ -201,7 +201,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
> return;
> } else {
> const char *name = qemu_plugin_hwaddr_device_name(hwaddr);
> - uint64_t off = qemu_plugin_hwaddr_device_offset(hwaddr);
> + uint64_t off = qemu_plugin_hwaddr_phys_addr(hwaddr);
> bool is_write = qemu_plugin_mem_is_store(meminfo);
> DeviceCounts *counts;
>
> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
> index c66507fe8f..3303dce862 100644
> --- a/include/qemu/qemu-plugin.h
> +++ b/include/qemu/qemu-plugin.h
> @@ -47,7 +47,7 @@ typedef uint64_t qemu_plugin_id_t;
>
> extern QEMU_PLUGIN_EXPORT int qemu_plugin_version;
>
> -#define QEMU_PLUGIN_VERSION 0
> +#define QEMU_PLUGIN_VERSION 1
>
> typedef struct {
> /* string describing architecture */
> @@ -307,8 +307,8 @@ bool qemu_plugin_mem_is_sign_extended(qemu_plugin_meminfo_t info);
> bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info);
> bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
>
> -/*
> - * qemu_plugin_get_hwaddr():
> +/**
> + * qemu_plugin_get_hwaddr() - return handle for memory operation
> * @vaddr: the virtual address of the memory operation
> *
> * For system emulation returns a qemu_plugin_hwaddr handle to query
> @@ -323,12 +323,30 @@ struct qemu_plugin_hwaddr *qemu_plugin_get_hwaddr(qemu_plugin_meminfo_t info,
> uint64_t vaddr);
>
> /*
> - * The following additional queries can be run on the hwaddr structure
> - * to return information about it. For non-IO accesses the device
> - * offset will be into the appropriate block of RAM.
> + * The following additional queries can be run on the hwaddr structure to
> + * return information about it - namely whether it is for an IO access and the
> + * physical address associated with the access.
> + */
> +
> +/**
> + * qemu_plugin_hwaddr_is_io() - query whether memory operation is IO
> + * @haddr: address handle from qemu_plugin_get_hwaddr()
> + *
> + * Returns true if the handle's memory operation is to memory-mapped IO, or
> + * false if it is to RAM
> */
> bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr);
> -uint64_t qemu_plugin_hwaddr_device_offset(const struct qemu_plugin_hwaddr *haddr);
> +
> +/**
> + * qemu_plugin_hwaddr_phys_addr() - query physical address for memory operation
> + * @haddr: address handle from qemu_plugin_get_hwaddr()
> + *
> + * Returns the physical address associated with the memory operation
> + *
> + * Note that the returned physical address may not be unique if you are dealing
> + * with multiple address spaces.
> + */
> +uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr);
>
> /*
> * Returns a string representing the device. The string is valid for
> diff --git a/plugins/api.c b/plugins/api.c
> index 0b04380d57..3c7dc406e3 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -40,6 +40,7 @@
> #include "sysemu/sysemu.h"
> #include "tcg/tcg.h"
> #include "exec/exec-all.h"
> +#include "exec/ram_addr.h"
> #include "disas/disas.h"
> #include "plugin.h"
> #ifndef CONFIG_USER_ONLY
> @@ -298,19 +299,25 @@ bool qemu_plugin_hwaddr_is_io(const struct qemu_plugin_hwaddr *haddr)
> #endif
> }
>
> -uint64_t qemu_plugin_hwaddr_device_offset(const struct qemu_plugin_hwaddr *haddr)
> +uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr)
> {
> #ifdef CONFIG_SOFTMMU
> if (haddr) {
> if (!haddr->is_io) {
> - ram_addr_t ram_addr = qemu_ram_addr_from_host((void *) haddr->v.ram.hostaddr);
> - if (ram_addr == RAM_ADDR_INVALID) {
> + RAMBlock *block;
> + ram_addr_t offset;
> + void *hostaddr = (void *) haddr->v.ram.hostaddr;
> +
> + block = qemu_ram_block_from_host(hostaddr, false, &offset);
> + if (!block) {
> error_report("Bad ram pointer %"PRIx64"", haddr->v.ram.hostaddr);
> abort();
> }
> - return ram_addr;
> +
> + return block->offset + offset + block->mr->addr;
> } else {
> - return haddr->v.io.offset;
> + MemoryRegionSection *mrs = haddr->v.io.section;
> + return haddr->v.io.offset + mrs->mr->addr;
> }
> }
> #endif
--
Alex Bennée
prev parent reply other threads:[~2021-03-11 10:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-09 20:28 [PATCH v2] plugins: Expose physical addresses instead of device offsets Aaron Lindsay
2021-03-11 10:29 ` Alex Bennée [this message]
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=87pn066l11.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=aaron@os.amperecomputing.com \
--cc=cota@braap.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).