All of lore.kernel.org
 help / color / mirror / Atom feed
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


      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 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.