* [PATCH 0/2] hw/arm/aspeed: Improve QOM usage
@ 2020-06-20 16:28 Philippe Mathieu-Daudé
2020-06-20 16:28 ` [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner Philippe Mathieu-Daudé
2020-06-20 16:28 ` [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState Philippe Mathieu-Daudé
0 siblings, 2 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-20 16:28 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, Eduardo Habkost, Andrew Jeffery, Markus Armbruster,
Philippe Mathieu-Daudé, qemu-arm, Cédric Le Goater,
Joel Stanley
Yet another cleanup.
Simplify aspeed machine QOM usage.
Philippe Mathieu-Daudé (2):
hw/arm/aspeed: Remove extraneous MemoryRegion object owner
hw/arm/aspeed: QOM'ify AspeedBoardState
include/hw/arm/aspeed.h | 8 +-------
hw/arm/aspeed.c | 17 ++++++++++-------
2 files changed, 11 insertions(+), 14 deletions(-)
--
2.21.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner
2020-06-20 16:28 [PATCH 0/2] hw/arm/aspeed: Improve QOM usage Philippe Mathieu-Daudé
@ 2020-06-20 16:28 ` Philippe Mathieu-Daudé
2020-06-22 17:02 ` Cédric Le Goater
2020-06-20 16:28 ` [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState Philippe Mathieu-Daudé
1 sibling, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-20 16:28 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, Eduardo Habkost, Andrew Jeffery, Markus Armbruster,
Philippe Mathieu-Daudé, qemu-arm, Cédric Le Goater,
Joel Stanley
I'm confused by this code, 'bmc' is created as:
bmc = g_new0(AspeedBoardState, 1);
Then we use it as QOM owner for different MemoryRegion objects.
But looking at memory_region_init_ram (similarly for ROM):
void memory_region_init_ram(MemoryRegion *mr,
struct Object *owner,
const char *name,
uint64_t size,
Error **errp)
{
DeviceState *owner_dev;
Error *err = NULL;
memory_region_init_ram_nomigrate(mr, owner, name, size, &err);
if (err) {
error_propagate(errp, err);
return;
}
/* This will assert if owner is neither NULL nor a DeviceState.
* We only want the owner here for the purposes of defining a
* unique name for migration. TODO: Ideally we should implement
* a naming scheme for Objects which are not DeviceStates, in
* which case we can relax this restriction.
*/
owner_dev = DEVICE(owner);
vmstate_register_ram(mr, owner_dev);
}
The expected assertion is not triggered ('bmc' is not NULL neither
a DeviceState).
'bmc' structure is defined as:
struct AspeedBoardState {
AspeedSoCState soc;
MemoryRegion ram_container;
MemoryRegion max_ram;
};
Apparently
What happens is when using 'OBJECT(bmc)', the QOM macros cast the
memory pointed by bmc, which first member is 'soc', which is
initialized ...:
object_initialize_child(OBJECT(machine), "soc",
&bmc->soc, amc->soc_name);
The 'soc' object is indeed a DeviceState, so the assertion passes.
Since this is fragile and only happens to work by luck, remove the
dangerous OBJECT(bmc) owner argument.
This probably breaks migration for this machine.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/arm/aspeed.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 0ad08a2b4c..31765792a2 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -329,12 +329,12 @@ static void aspeed_machine_init(MachineState *machine)
* needed by the flash modules of the Aspeed machines.
*/
if (ASPEED_MACHINE(machine)->mmio_exec) {
- memory_region_init_alias(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
+ memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
&fl->mmio, 0, fl->size);
memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
boot_rom);
} else {
- memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
+ memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
fl->size, &error_abort);
memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
boot_rom);
@@ -345,7 +345,7 @@ static void aspeed_machine_init(MachineState *machine)
if (machine->kernel_filename && sc->num_cpus > 1) {
/* With no u-boot we must set up a boot stub for the secondary CPU */
MemoryRegion *smpboot = g_new(MemoryRegion, 1);
- memory_region_init_ram(smpboot, OBJECT(bmc), "aspeed.smpboot",
+ memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
0x80, &error_abort);
memory_region_add_subregion(get_system_memory(),
AST_SMP_MAILBOX_BASE, smpboot);
--
2.21.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState
2020-06-20 16:28 [PATCH 0/2] hw/arm/aspeed: Improve QOM usage Philippe Mathieu-Daudé
2020-06-20 16:28 ` [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner Philippe Mathieu-Daudé
@ 2020-06-20 16:28 ` Philippe Mathieu-Daudé
2020-06-22 12:34 ` Cédric Le Goater
1 sibling, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-20 16:28 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, Eduardo Habkost, Andrew Jeffery, Markus Armbruster,
Philippe Mathieu-Daudé, qemu-arm, Cédric Le Goater,
Joel Stanley
AspeedBoardState seems crippled. We use incorrectly 2
different structures to do the same thing. Merge them
altogether:
- Move AspeedMachine fields to AspeedBoardState
- AspeedBoardState is now QOM
- Remove unused AspeedMachine
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/arm/aspeed.h | 8 +-------
hw/arm/aspeed.c | 11 +++++++----
2 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
index 95b4daece8..9c9bac1263 100644
--- a/include/hw/arm/aspeed.h
+++ b/include/hw/arm/aspeed.h
@@ -15,13 +15,7 @@ typedef struct AspeedBoardState AspeedBoardState;
#define TYPE_ASPEED_MACHINE MACHINE_TYPE_NAME("aspeed")
#define ASPEED_MACHINE(obj) \
- OBJECT_CHECK(AspeedMachine, (obj), TYPE_ASPEED_MACHINE)
-
-typedef struct AspeedMachine {
- MachineState parent_obj;
-
- bool mmio_exec;
-} AspeedMachine;
+ OBJECT_CHECK(AspeedBoardState, (obj), TYPE_ASPEED_MACHINE)
#define ASPEED_MAC0_ON (1 << 0)
#define ASPEED_MAC1_ON (1 << 1)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 31765792a2..6b7533aeee 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -33,9 +33,14 @@ static struct arm_boot_info aspeed_board_binfo = {
};
struct AspeedBoardState {
+ /* Private */
+ MachineState parent_obj;
+ /* Public */
+
AspeedSoCState soc;
MemoryRegion ram_container;
MemoryRegion max_ram;
+ bool mmio_exec;
};
/* Palmetto hardware value: 0x120CE416 */
@@ -253,7 +258,7 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
static void aspeed_machine_init(MachineState *machine)
{
- AspeedBoardState *bmc;
+ AspeedBoardState *bmc = ASPEED_MACHINE(machine);
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
AspeedSoCClass *sc;
DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
@@ -261,8 +266,6 @@ static void aspeed_machine_init(MachineState *machine)
int i;
NICInfo *nd = &nd_table[0];
- bmc = g_new0(AspeedBoardState, 1);
-
memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
4 * GiB);
memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
@@ -751,7 +754,7 @@ static const TypeInfo aspeed_machine_types[] = {
}, {
.name = TYPE_ASPEED_MACHINE,
.parent = TYPE_MACHINE,
- .instance_size = sizeof(AspeedMachine),
+ .instance_size = sizeof(AspeedBoardState),
.instance_init = aspeed_machine_instance_init,
.class_size = sizeof(AspeedMachineClass),
.class_init = aspeed_machine_class_init,
--
2.21.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState
2020-06-20 16:28 ` [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState Philippe Mathieu-Daudé
@ 2020-06-22 12:34 ` Cédric Le Goater
0 siblings, 0 replies; 5+ messages in thread
From: Cédric Le Goater @ 2020-06-22 12:34 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Peter Maydell, Eduardo Habkost, Andrew Jeffery, Markus Armbruster,
qemu-arm, Joel Stanley
On 6/20/20 6:28 PM, Philippe Mathieu-Daudé wrote:
> AspeedBoardState seems crippled. We use incorrectly 2
> different structures to do the same thing. Merge them
> altogether:
> - Move AspeedMachine fields to AspeedBoardState
> - AspeedBoardState is now QOM
> - Remove unused AspeedMachine
I like that but maybe we should rename AspeedBoardState in AspeedMachine ?
The naming would be more consistent.
Thanks,
C.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> include/hw/arm/aspeed.h | 8 +-------
> hw/arm/aspeed.c | 11 +++++++----
> 2 files changed, 8 insertions(+), 11 deletions(-)
>
> diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
> index 95b4daece8..9c9bac1263 100644
> --- a/include/hw/arm/aspeed.h
> +++ b/include/hw/arm/aspeed.h
> @@ -15,13 +15,7 @@ typedef struct AspeedBoardState AspeedBoardState;
>
> #define TYPE_ASPEED_MACHINE MACHINE_TYPE_NAME("aspeed")
> #define ASPEED_MACHINE(obj) \
> - OBJECT_CHECK(AspeedMachine, (obj), TYPE_ASPEED_MACHINE)
> -
> -typedef struct AspeedMachine {
> - MachineState parent_obj;
> -
> - bool mmio_exec;
> -} AspeedMachine;
> + OBJECT_CHECK(AspeedBoardState, (obj), TYPE_ASPEED_MACHINE)
>
> #define ASPEED_MAC0_ON (1 << 0)
> #define ASPEED_MAC1_ON (1 << 1)
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 31765792a2..6b7533aeee 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -33,9 +33,14 @@ static struct arm_boot_info aspeed_board_binfo = {
> };
>
> struct AspeedBoardState {
> + /* Private */
> + MachineState parent_obj;
> + /* Public */
> +
> AspeedSoCState soc;
> MemoryRegion ram_container;
> MemoryRegion max_ram;
> + bool mmio_exec;
> };
>
> /* Palmetto hardware value: 0x120CE416 */
> @@ -253,7 +258,7 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
>
> static void aspeed_machine_init(MachineState *machine)
> {
> - AspeedBoardState *bmc;
> + AspeedBoardState *bmc = ASPEED_MACHINE(machine);
> AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
> AspeedSoCClass *sc;
> DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
> @@ -261,8 +266,6 @@ static void aspeed_machine_init(MachineState *machine)
> int i;
> NICInfo *nd = &nd_table[0];
>
> - bmc = g_new0(AspeedBoardState, 1);
> -
> memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
> 4 * GiB);
> memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
> @@ -751,7 +754,7 @@ static const TypeInfo aspeed_machine_types[] = {
> }, {
> .name = TYPE_ASPEED_MACHINE,
> .parent = TYPE_MACHINE,
> - .instance_size = sizeof(AspeedMachine),
> + .instance_size = sizeof(AspeedBoardState),
> .instance_init = aspeed_machine_instance_init,
> .class_size = sizeof(AspeedMachineClass),
> .class_init = aspeed_machine_class_init,
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner
2020-06-20 16:28 ` [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner Philippe Mathieu-Daudé
@ 2020-06-22 17:02 ` Cédric Le Goater
0 siblings, 0 replies; 5+ messages in thread
From: Cédric Le Goater @ 2020-06-22 17:02 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Peter Maydell, Eduardo Habkost, Andrew Jeffery, Markus Armbruster,
qemu-arm, Joel Stanley
On 6/20/20 6:28 PM, Philippe Mathieu-Daudé wrote:
> I'm confused by this code, 'bmc' is created as:
>
> bmc = g_new0(AspeedBoardState, 1);
>
> Then we use it as QOM owner for different MemoryRegion objects.
> But looking at memory_region_init_ram (similarly for ROM):
>
> void memory_region_init_ram(MemoryRegion *mr,
> struct Object *owner,
> const char *name,
> uint64_t size,
> Error **errp)
> {
> DeviceState *owner_dev;
> Error *err = NULL;
>
> memory_region_init_ram_nomigrate(mr, owner, name, size, &err);
> if (err) {
> error_propagate(errp, err);
> return;
> }
> /* This will assert if owner is neither NULL nor a DeviceState.
> * We only want the owner here for the purposes of defining a
> * unique name for migration. TODO: Ideally we should implement
> * a naming scheme for Objects which are not DeviceStates, in
> * which case we can relax this restriction.
> */
> owner_dev = DEVICE(owner);
> vmstate_register_ram(mr, owner_dev);
> }
>
> The expected assertion is not triggered ('bmc' is not NULL neither
> a DeviceState).
>
> 'bmc' structure is defined as:
>
> struct AspeedBoardState {
> AspeedSoCState soc;
> MemoryRegion ram_container;
> MemoryRegion max_ram;
> };
>
> Apparently
> What happens is when using 'OBJECT(bmc)', the QOM macros cast the
> memory pointed by bmc, which first member is 'soc', which is
> initialized ...:
>
> object_initialize_child(OBJECT(machine), "soc",
> &bmc->soc, amc->soc_name);
>
> The 'soc' object is indeed a DeviceState, so the assertion passes.
>
> Since this is fragile and only happens to work by luck, remove the
> dangerous OBJECT(bmc) owner argument.
Indeed. Nice catch.
>
> This probably breaks migration for this machine.
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Thanks
C.
> ---
> hw/arm/aspeed.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 0ad08a2b4c..31765792a2 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -329,12 +329,12 @@ static void aspeed_machine_init(MachineState *machine)
> * needed by the flash modules of the Aspeed machines.
> */
> if (ASPEED_MACHINE(machine)->mmio_exec) {
> - memory_region_init_alias(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
> + memory_region_init_alias(boot_rom, NULL, "aspeed.boot_rom",
> &fl->mmio, 0, fl->size);
> memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
> boot_rom);
> } else {
> - memory_region_init_rom(boot_rom, OBJECT(bmc), "aspeed.boot_rom",
> + memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom",
> fl->size, &error_abort);
> memory_region_add_subregion(get_system_memory(), FIRMWARE_ADDR,
> boot_rom);
> @@ -345,7 +345,7 @@ static void aspeed_machine_init(MachineState *machine)
> if (machine->kernel_filename && sc->num_cpus > 1) {
> /* With no u-boot we must set up a boot stub for the secondary CPU */
> MemoryRegion *smpboot = g_new(MemoryRegion, 1);
> - memory_region_init_ram(smpboot, OBJECT(bmc), "aspeed.smpboot",
> + memory_region_init_ram(smpboot, NULL, "aspeed.smpboot",
> 0x80, &error_abort);
> memory_region_add_subregion(get_system_memory(),
> AST_SMP_MAILBOX_BASE, smpboot);
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-06-22 17:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-20 16:28 [PATCH 0/2] hw/arm/aspeed: Improve QOM usage Philippe Mathieu-Daudé
2020-06-20 16:28 ` [PATCH 1/2] hw/arm/aspeed: Remove extraneous MemoryRegion object owner Philippe Mathieu-Daudé
2020-06-22 17:02 ` Cédric Le Goater
2020-06-20 16:28 ` [PATCH 2/2] hw/arm/aspeed: QOM'ify AspeedBoardState Philippe Mathieu-Daudé
2020-06-22 12:34 ` Cédric Le Goater
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).