bool is_store = qemu_plugin_mem_is_store(meminfo);
RegionInfo *ri;
bool unseen_data = false;
+ void *val_ptr;
+ unsigned int val_size;
+ qemu_plugin_mem_value swapped_value;
g_assert(offset + size <= region_size);
}
void *ri_data = &ri->data[offset];
+
+ swapped_value.type = value.type;
switch (value.type) {
case QEMU_PLUGIN_MEM_VALUE_U8:
- {
- uint8_t val = value.data.u8;
- uint8_t *p = ri_data;
- if (is_store) {
- *p = val;
- } else {
- unseen_data = *p != val;
- }
+ swapped_value.data.u8 = value.data.u8;
+ val_ptr = &swapped_value.data.u8;
+ val_size = 1;
break;
- }
case QEMU_PLUGIN_MEM_VALUE_U16:
- {
- uint16_t val = be ? GUINT16_FROM_BE(value.data.u16) :
- GUINT16_FROM_LE(value.data.u16);
- uint16_t *p = ri_data;
- if (is_store) {
- *p = val;
- } else {
- unseen_data = *p != val;
- }
+ swapped_value.data.u16 = be ? GUINT16_FROM_BE(value.data.u16) :
+ GUINT16_FROM_LE(value.data.u16);
+ val_ptr = &swapped_value.data.u16;
+ val_size = 2;
break;
- }
case QEMU_PLUGIN_MEM_VALUE_U32:
- {
- uint32_t val = be ? GUINT32_FROM_BE(value.data.u32) :
- GUINT32_FROM_LE(value.data.u32);
- uint32_t *p = ri_data;
- if (is_store) {
- *p = val;
- } else {
- unseen_data = *p != val;
- }
+ swapped_value.data.u32 = be ? GUINT32_FROM_BE(value.data.u32) :
+ GUINT32_FROM_LE(value.data.u32);
+ val_ptr = &swapped_value.data.u32;
+ val_size = 4;
break;
- }
case QEMU_PLUGIN_MEM_VALUE_U64:
- {
- uint64_t val = be ? GUINT64_FROM_BE(value.data.u64) :
- GUINT64_FROM_LE(value.data.u64);
- uint64_t *p = ri_data;
- if (is_store) {
- *p = val;
- } else {
- unseen_data = *p != val;
- }
+ swapped_value.data.u64 = be ? GUINT64_FROM_BE(value.data.u64) :
+ GUINT64_FROM_LE(value.data.u64);
+ val_ptr = &swapped_value.data.u64;
+ val_size = 8;
break;
- }
case QEMU_PLUGIN_MEM_VALUE_U128:
- /* non in test so skip */
- break;
+ /* none in test so skip */
+ goto done;
default:
g_assert_not_reached();
}
+ /* ri_data may not be aligned, so we use memcpy/memcmp */
+ if (is_store) {
+ memcpy(ri_data, val_ptr, val_size);
+ } else {
+ unseen_data = memcmp(ri_data, val_ptr, val_size) != 0;
+ }
+
/*
* This is expected for regions initialised by QEMU (.text etc) but we
* expect to see all data read and written to the test_data region
ri->seen_all = false;
}
+done:
g_mutex_unlock(&lock);
}