qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

hw/core/register: Add register_init_block8 helper.

There was no support for 8 bits block registers. Changed
register_init_block32 to be generic and static, adding register
size in bits as parameter. Created one helper for each size.

Signed-off-by: Joaquin de Andres <me@xcancerberox.com.ar>
Message-Id: <20200402162839.76636-1-me@xcancerberox.com.ar>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

authored by

Joaquin de Andres and committed by
Alistair Francis
f08085f4 f19d118b

+44 -10
+36 -10
hw/core/register.c
··· 246 246 return extract64(read_val, 0, size * 8); 247 247 } 248 248 249 - RegisterInfoArray *register_init_block32(DeviceState *owner, 250 - const RegisterAccessInfo *rae, 251 - int num, RegisterInfo *ri, 252 - uint32_t *data, 253 - const MemoryRegionOps *ops, 254 - bool debug_enabled, 255 - uint64_t memory_size) 249 + static RegisterInfoArray *register_init_block(DeviceState *owner, 250 + const RegisterAccessInfo *rae, 251 + int num, RegisterInfo *ri, 252 + void *data, 253 + const MemoryRegionOps *ops, 254 + bool debug_enabled, 255 + uint64_t memory_size, 256 + size_t data_size_bits) 256 257 { 257 258 const char *device_prefix = object_get_typename(OBJECT(owner)); 258 259 RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1); 260 + int data_size = data_size_bits >> 3; 259 261 int i; 260 262 261 263 r_array->r = g_new0(RegisterInfo *, num); ··· 264 266 r_array->prefix = device_prefix; 265 267 266 268 for (i = 0; i < num; i++) { 267 - int index = rae[i].addr / 4; 269 + int index = rae[i].addr / data_size; 268 270 RegisterInfo *r = &ri[index]; 269 271 270 272 *r = (RegisterInfo) { 271 - .data = &data[index], 272 - .data_size = sizeof(uint32_t), 273 + .data = data + data_size * index, 274 + .data_size = data_size, 273 275 .access = &rae[i], 274 276 .opaque = owner, 275 277 }; ··· 282 284 device_prefix, memory_size); 283 285 284 286 return r_array; 287 + } 288 + 289 + RegisterInfoArray *register_init_block8(DeviceState *owner, 290 + const RegisterAccessInfo *rae, 291 + int num, RegisterInfo *ri, 292 + uint8_t *data, 293 + const MemoryRegionOps *ops, 294 + bool debug_enabled, 295 + uint64_t memory_size) 296 + { 297 + return register_init_block(owner, rae, num, ri, (void *) 298 + data, ops, debug_enabled, memory_size, 8); 299 + } 300 + 301 + RegisterInfoArray *register_init_block32(DeviceState *owner, 302 + const RegisterAccessInfo *rae, 303 + int num, RegisterInfo *ri, 304 + uint32_t *data, 305 + const MemoryRegionOps *ops, 306 + bool debug_enabled, 307 + uint64_t memory_size) 308 + { 309 + return register_init_block(owner, rae, num, ri, (void *) 310 + data, ops, debug_enabled, memory_size, 32); 285 311 } 286 312 287 313 void register_finalize_block(RegisterInfoArray *r_array)
+8
include/hw/register.h
··· 185 185 * memory region (r_array->mem) the caller should add to a container. 186 186 */ 187 187 188 + RegisterInfoArray *register_init_block8(DeviceState *owner, 189 + const RegisterAccessInfo *rae, 190 + int num, RegisterInfo *ri, 191 + uint8_t *data, 192 + const MemoryRegionOps *ops, 193 + bool debug_enabled, 194 + uint64_t memory_size); 195 + 188 196 RegisterInfoArray *register_init_block32(DeviceState *owner, 189 197 const RegisterAccessInfo *rae, 190 198 int num, RegisterInfo *ri,