From: "Alex Bennée" <alex.bennee@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-devel@nongnu.org
Subject: Re: [PULL 00/18] tcg plugins (deprecations, mem apis, contrib plugins)
Date: Thu, 19 Sep 2024 15:33:12 +0100 [thread overview]
Message-ID: <87zfo3ems7.fsf@draig.linaro.org> (raw)
In-Reply-To: <CAFEAcA8UGKtZLNZZVQiDryjst93AkQTKhQrBQ573+J21C-y4QA@mail.gmail.com> (Peter Maydell's message of "Thu, 19 Sep 2024 14:14:57 +0100")
Peter Maydell <peter.maydell@linaro.org> writes:
> On Thu, 19 Sept 2024 at 14:11, Alex Bennée <alex.bennee@linaro.org> wrote:
>>
>> Peter Maydell <peter.maydell@linaro.org> writes:
>> > While I'm looking at the code, this caught my eye:
>> >
>> > case QEMU_PLUGIN_MEM_VALUE_U64:
>> > {
>> > uint64_t *p = (uint64_t *) &ri->data[offset];
>> > uint64_t val = be ? htobe64(value.data.u64) : htole64(value.data.u64);
>> > if (is_store) {
>> > *p = val;
>> > } else if (*p != val) {
>> > unseen_data = true;
>> > }
>> > break;
>> > }
>> >
>> > Casting a random byte pointer to uint64_t* like that
>> > and dereferencing it isn't valid -- it can fault if
>> > it's not aligned correctly.
>>
>> Hmm in the normal case of x86 hosts we will never hit this.
>
> Not necessarily -- some x86 SIMD insns enforce alignment.
>
>> I guess we
>> could do a memcpy step and then the byteswap?
>
> That's what bswap.h does, yes.
>
>> Could it be included directly without bringing in the rest of QEMU's
>> include deps?
>
> It's technically quite close to standalone I think,
> but I think it would be a bad idea to directly include
> it because once you put QEMU's include/ on the plugin
> compile include path then that's a slippery slope to
> the plugins not actually being standalone code any more.
In this case tests/tcg/plugins are built for testing the implementation.
We could let it slide to save on just copy and pasting the whole file:
--8<---------------cut here---------------start------------->8---
modified tests/tcg/plugins/mem.c
@@ -9,10 +9,23 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <endian.h>
#include <stdio.h>
#include <glib.h>
+/*
+ * plugins should not include anything from QEMU aside from the
+ * API header. However the bswap.h header is sufficiently self
+ * contained that we include it here to avoid code duplication.
+ */
+#define HOST_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define HOST_LONG_BITS (__SIZEOF_POINTER__ * 8)
+#ifndef glue
+#define xglue(x, y) x ## y
+#define glue(x, y) xglue(x, y)
+#define stringify(s) tostring(s)
+#define tostring(s) #s
+#endif
+#include <bswap.h>
#include <qemu-plugin.h>
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
@@ -154,33 +167,45 @@ static void update_region_info(uint64_t region, uint64_t offset,
case QEMU_PLUGIN_MEM_VALUE_U16:
{
uint16_t *p = (uint16_t *) &ri->data[offset];
- uint16_t val = be ? htobe16(value.data.u16) : htole16(value.data.u16);
if (is_store) {
- *p = val;
- } else if (*p != val) {
- unseen_data = true;
+ if (be) {
+ stw_be_p(p, value.data.u16);
+ } else {
+ stw_le_p(p, value.data.u16);
+ }
+ } else {
+ uint16_t val = be ? lduw_be_p(p) : lduw_le_p(p);
+ unseen_data = val != value.data.u16;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U32:
{
uint32_t *p = (uint32_t *) &ri->data[offset];
- uint32_t val = be ? htobe32(value.data.u32) : htole32(value.data.u32);
if (is_store) {
- *p = val;
- } else if (*p != val) {
- unseen_data = true;
+ if (be) {
+ stl_be_p(p, value.data.u32);
+ } else {
+ stl_le_p(p, value.data.u32);
+ }
+ } else {
+ uint32_t val = be ? ldl_be_p(p) : ldl_le_p(p);
+ unseen_data = val != value.data.u32;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U64:
{
uint64_t *p = (uint64_t *) &ri->data[offset];
- uint64_t val = be ? htobe64(value.data.u64) : htole64(value.data.u64);
if (is_store) {
- *p = val;
- } else if (*p != val) {
- unseen_data = true;
+ if (be) {
+ stq_be_p(p, value.data.u64);
+ } else {
+ stq_le_p(p, value.data.u64);
+ }
+ } else {
+ uint64_t val = be ? ldq_be_p(p) : ldq_le_p(p);
+ unseen_data = val != value.data.u64;
}
break;
--8<---------------cut here---------------end--------------->8---
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
prev parent reply other threads:[~2024-09-19 14:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-18 21:06 [PULL 00/18] tcg plugins (deprecations, mem apis, contrib plugins) Alex Bennée
2024-09-18 21:06 ` [PULL 01/18] deprecation: don't enable TCG plugins by default on 32 bit hosts Alex Bennée
2024-09-18 21:06 ` [PULL 02/18] deprecation: don't enable TCG plugins by default with TCI Alex Bennée
2026-02-27 23:17 ` Philippe Mathieu-Daudé
2024-09-18 21:06 ` [PULL 03/18] contrib/plugins: control flow plugin Alex Bennée
2024-09-18 21:06 ` [PULL 04/18] plugins: save value during memory accesses Alex Bennée
2024-09-18 21:06 ` [PULL 05/18] plugins: extend API to get latest memory value accessed Alex Bennée
2024-09-18 21:07 ` [PULL 06/18] tests/tcg: add mechanism to run specific tests with plugins Alex Bennée
2024-09-18 21:07 ` [PULL 07/18] tests/tcg: allow to check output of plugins Alex Bennée
2024-09-18 21:07 ` [PULL 08/18] tests/tcg/plugins/mem: add option to print memory accesses Alex Bennée
2024-09-18 21:07 ` [PULL 09/18] tests/tcg/multiarch: add test for plugin memory access Alex Bennée
2024-09-18 21:07 ` [PULL 10/18] tests/tcg: clean up output of memory system test Alex Bennée
2024-09-18 21:07 ` [PULL 11/18] tests/tcg: only read/write 64 bit words on 64 bit systems Alex Bennée
2024-09-18 21:07 ` [PULL 12/18] tests/tcg: ensure s390x-softmmu output redirected Alex Bennée
2024-09-18 21:07 ` [PULL 13/18] tests/tcg: add a system test to check memory instrumentation Alex Bennée
2024-09-18 21:07 ` [PULL 14/18] util/timer: avoid deadlock when shutting down Alex Bennée
2024-09-18 21:07 ` [PULL 15/18] contrib/plugins: Add a plugin to generate basic block vectors Alex Bennée
2024-09-18 21:07 ` [PULL 16/18] plugins: add plugin API to read guest memory Alex Bennée
2024-09-18 21:07 ` [PULL 17/18] plugins: add option to dump write argument to syscall plugin Alex Bennée
2024-09-18 21:07 ` [PULL 18/18] contrib/plugins: avoid hanging program Alex Bennée
2024-09-19 9:50 ` [PULL 00/18] tcg plugins (deprecations, mem apis, contrib plugins) Peter Maydell
2024-09-19 13:11 ` Alex Bennée
2024-09-19 13:14 ` Peter Maydell
2024-09-19 14:33 ` 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=87zfo3ems7.fsf@draig.linaro.org \
--to=alex.bennee@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.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.