summaryrefslogtreecommitdiffstats
path: root/hw/core/register.c
diff options
context:
space:
mode:
authorJoaquin de Andres2020-04-02 18:28:39 +0200
committerAlistair Francis2020-05-05 22:37:51 +0200
commitf08085f49fb66a5cdc86653bd896d0e728bcee50 (patch)
tree02899d2241a488a358fb6b010faeef81ce6a90e5 /hw/core/register.c
parentMerge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-05-04' into st... (diff)
downloadqemu-f08085f49fb66a5cdc86653bd896d0e728bcee50.tar.gz
qemu-f08085f49fb66a5cdc86653bd896d0e728bcee50.tar.xz
qemu-f08085f49fb66a5cdc86653bd896d0e728bcee50.zip
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>
Diffstat (limited to 'hw/core/register.c')
-rw-r--r--hw/core/register.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/hw/core/register.c b/hw/core/register.c
index 3c77396587..ddf91eb445 100644
--- a/hw/core/register.c
+++ b/hw/core/register.c
@@ -246,16 +246,18 @@ uint64_t register_read_memory(void *opaque, hwaddr addr,
return extract64(read_val, 0, size * 8);
}
-RegisterInfoArray *register_init_block32(DeviceState *owner,
- const RegisterAccessInfo *rae,
- int num, RegisterInfo *ri,
- uint32_t *data,
- const MemoryRegionOps *ops,
- bool debug_enabled,
- uint64_t memory_size)
+static RegisterInfoArray *register_init_block(DeviceState *owner,
+ const RegisterAccessInfo *rae,
+ int num, RegisterInfo *ri,
+ void *data,
+ const MemoryRegionOps *ops,
+ bool debug_enabled,
+ uint64_t memory_size,
+ size_t data_size_bits)
{
const char *device_prefix = object_get_typename(OBJECT(owner));
RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1);
+ int data_size = data_size_bits >> 3;
int i;
r_array->r = g_new0(RegisterInfo *, num);
@@ -264,12 +266,12 @@ RegisterInfoArray *register_init_block32(DeviceState *owner,
r_array->prefix = device_prefix;
for (i = 0; i < num; i++) {
- int index = rae[i].addr / 4;
+ int index = rae[i].addr / data_size;
RegisterInfo *r = &ri[index];
*r = (RegisterInfo) {
- .data = &data[index],
- .data_size = sizeof(uint32_t),
+ .data = data + data_size * index,
+ .data_size = data_size,
.access = &rae[i],
.opaque = owner,
};
@@ -284,6 +286,30 @@ RegisterInfoArray *register_init_block32(DeviceState *owner,
return r_array;
}
+RegisterInfoArray *register_init_block8(DeviceState *owner,
+ const RegisterAccessInfo *rae,
+ int num, RegisterInfo *ri,
+ uint8_t *data,
+ const MemoryRegionOps *ops,
+ bool debug_enabled,
+ uint64_t memory_size)
+{
+ return register_init_block(owner, rae, num, ri, (void *)
+ data, ops, debug_enabled, memory_size, 8);
+}
+
+RegisterInfoArray *register_init_block32(DeviceState *owner,
+ const RegisterAccessInfo *rae,
+ int num, RegisterInfo *ri,
+ uint32_t *data,
+ const MemoryRegionOps *ops,
+ bool debug_enabled,
+ uint64_t memory_size)
+{
+ return register_init_block(owner, rae, num, ri, (void *)
+ data, ops, debug_enabled, memory_size, 32);
+}
+
void register_finalize_block(RegisterInfoArray *r_array)
{
object_unparent(OBJECT(&r_array->mem));