#include <stdio.h>
#include <glib.h>
-/*
- * plugins should not include anything from QEMU aside from the
- * API header. However as this is a test plugin to exercise the
- * internals of QEMU and we want to avoid needless code duplication we
- * do so here. bswap.h is pretty self-contained although it needs a
- * few things provided by compiler.h.
- */
-#include <compiler.h>
#include <stdbool.h>
-#include <bswap.h>
#include <qemu-plugin.h>
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
ri->reads++;
}
+ void *ri_data = &ri->data[offset];
switch (value.type) {
case QEMU_PLUGIN_MEM_VALUE_U8:
+ {
+ uint8_t val = value.data.u8;
+ uint8_t *p = ri_data;
if (is_store) {
- ri->data[offset] = value.data.u8;
- } else if (ri->data[offset] != value.data.u8) {
- unseen_data = true;
+ *p = val;
+ } else {
+ unseen_data = *p != val;
}
break;
+ }
case QEMU_PLUGIN_MEM_VALUE_U16:
{
- uint16_t *p = (uint16_t *) &ri->data[offset];
+ uint16_t val = be ? GUINT16_FROM_BE(value.data.u16) :
+ GUINT16_FROM_LE(value.data.u16);
+ uint16_t *p = ri_data;
if (is_store) {
- if (be) {
- stw_be_p(p, value.data.u16);
- } else {
- stw_le_p(p, value.data.u16);
- }
+ *p = val;
} else {
- uint16_t val = be ? lduw_be_p(p) : lduw_le_p(p);
- unseen_data = val != value.data.u16;
+ unseen_data = *p != val;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U32:
{
- uint32_t *p = (uint32_t *) &ri->data[offset];
+ uint32_t val = be ? GUINT32_FROM_BE(value.data.u32) :
+ GUINT32_FROM_LE(value.data.u32);
+ uint32_t *p = ri_data;
if (is_store) {
- if (be) {
- stl_be_p(p, value.data.u32);
- } else {
- stl_le_p(p, value.data.u32);
- }
+ *p = val;
} else {
- uint32_t val = be ? ldl_be_p(p) : ldl_le_p(p);
- unseen_data = val != value.data.u32;
+ unseen_data = *p != val;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U64:
{
- uint64_t *p = (uint64_t *) &ri->data[offset];
+ uint64_t val = be ? GUINT64_FROM_BE(value.data.u64) :
+ GUINT64_FROM_LE(value.data.u64);
+ uint64_t *p = ri_data;
if (is_store) {
- if (be) {
- stq_be_p(p, value.data.u64);
- } else {
- stq_le_p(p, value.data.u64);
- }
+ *p = val;
} else {
- uint64_t val = be ? ldq_be_p(p) : ldq_le_p(p);
- unseen_data = val != value.data.u64;
+ unseen_data = *p != val;
}
break;
}