Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Pierrick Bouvier

On 4/18/25 10:32, Philippe Mathieu-Daudé wrote:

On 18/4/25 19:23, Pierrick Bouvier wrote:

On 4/18/25 10:10, Philippe Mathieu-Daudé wrote:

On 18/4/25 19:07, Pierrick Bouvier wrote:

On 4/18/25 10:04, Philippe Mathieu-Daudé wrote:

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
  meson.build    |  1 +
  include/hw/boards.h    |  1 +
  include/qemu/target_info-qom.h | 18 ++
  target_info-qom.c  | 24 
  4 files changed, 44 insertions(+)
  create mode 100644 include/qemu/target_info-qom.h
  create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
  specific_ss.add(files('page-target.c', 'page-vary-target.c'))
  common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
  specific_ss.add(files('target_info-stub.c'))
  subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
  #include "system/hostmem.h"
  #include "system/blockdev.h"
  #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
  #include "qemu/module.h"
  #include "qom/object.h"
  #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be
used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on
static initializer, but in qemu-system-sh4, hw/arm or target/arm is
not
linked, so it fails.
I guess this is the null board that is creating this situation, since
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in
list
of machines. But I think it's not so good as it would require to deal
with a list of types when we want to access a machine.

So I would just move the file and link it inconditonnally in all
binaries.


Which file? target_info-qom.c is already in system_ss[].


Move existing target_info-qom in in target/arm/target_info_types.c, and
add it to system_ss, instead of arm_ss or arm_common_ss, so it's always
linked.


That should work, but what is the benefit over having a single file
where all definitions are concentrated?



Limit which types are visible from every hw/X, so it's explicit which
architecture every board/cpu/device will implement in the end.
I don't mind if you want to keep it there for now, it doesn't really
matter.


Oh, then I think I understood you and we are good:

Instead of having a single include/qemu/target_info-qom.h with
all target definitions, I added the ARM* ones to
include/hw/arm/machines-qom.h. But I kept target_info_types[]
in a single common source file.


All good.


Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Philippe Mathieu-Daudé

On 18/4/25 19:23, Pierrick Bouvier wrote:

On 4/18/25 10:10, Philippe Mathieu-Daudé wrote:

On 18/4/25 19:07, Pierrick Bouvier wrote:

On 4/18/25 10:04, Philippe Mathieu-Daudé wrote:

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
 meson.build    |  1 +
 include/hw/boards.h    |  1 +
 include/qemu/target_info-qom.h | 18 ++
 target_info-qom.c  | 24 
 4 files changed, 44 insertions(+)
 create mode 100644 include/qemu/target_info-qom.h
 create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
 specific_ss.add(files('page-target.c', 'page-vary-target.c'))
 common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
 specific_ss.add(files('target_info-stub.c'))
 subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
 #include "system/hostmem.h"
 #include "system/blockdev.h"
 #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
 #include "qemu/module.h"
 #include "qom/object.h"
 #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be
used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on
static initializer, but in qemu-system-sh4, hw/arm or target/arm is 
not

linked, so it fails.
I guess this is the null board that is creating this situation, since
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in 
list

of machines. But I think it's not so good as it would require to deal
with a list of types when we want to access a machine.

So I would just move the file and link it inconditonnally in all
binaries.


Which file? target_info-qom.c is already in system_ss[].


Move existing target_info-qom in in target/arm/target_info_types.c, and
add it to system_ss, instead of arm_ss or arm_common_ss, so it's always
linked.


That should work, but what is the benefit over having a single file
where all definitions are concentrated?



Limit which types are visible from every hw/X, so it's explicit which 
architecture every board/cpu/device will implement in the end.
I don't mind if you want to keep it there for now, it doesn't really 
matter.


Oh, then I think I understood you and we are good:

Instead of having a single include/qemu/target_info-qom.h with
all target definitions, I added the ARM* ones to
include/hw/arm/machines-qom.h. But I kept target_info_types[]
in a single common source file.



Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Pierrick Bouvier

On 4/18/25 10:10, Philippe Mathieu-Daudé wrote:

On 18/4/25 19:07, Pierrick Bouvier wrote:

On 4/18/25 10:04, Philippe Mathieu-Daudé wrote:

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
     meson.build    |  1 +
     include/hw/boards.h    |  1 +
     include/qemu/target_info-qom.h | 18 ++
     target_info-qom.c  | 24 
     4 files changed, 44 insertions(+)
     create mode 100644 include/qemu/target_info-qom.h
     create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
     specific_ss.add(files('page-target.c', 'page-vary-target.c'))
     common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
     specific_ss.add(files('target_info-stub.c'))
     subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
     #include "system/hostmem.h"
     #include "system/blockdev.h"
     #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
     #include "qemu/module.h"
     #include "qom/object.h"
     #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be
used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on
static initializer, but in qemu-system-sh4, hw/arm or target/arm is not
linked, so it fails.
I guess this is the null board that is creating this situation, since
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in list
of machines. But I think it's not so good as it would require to deal
with a list of types when we want to access a machine.

So I would just move the file and link it inconditonnally in all
binaries.


Which file? target_info-qom.c is already in system_ss[].


Move existing target_info-qom in in target/arm/target_info_types.c, and
add it to system_ss, instead of arm_ss or arm_common_ss, so it's always
linked.


That should work, but what is the benefit over having a single file
where all definitions are concentrated?



Limit which types are visible from every hw/X, so it's explicit which 
architecture every board/cpu/device will implement in the end.

I don't mind if you want to keep it there for now, it doesn't really matter.


Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Philippe Mathieu-Daudé

On 18/4/25 19:07, Pierrick Bouvier wrote:

On 4/18/25 10:04, Philippe Mathieu-Daudé wrote:

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
    meson.build    |  1 +
    include/hw/boards.h    |  1 +
    include/qemu/target_info-qom.h | 18 ++
    target_info-qom.c  | 24 
    4 files changed, 44 insertions(+)
    create mode 100644 include/qemu/target_info-qom.h
    create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
    specific_ss.add(files('page-target.c', 'page-vary-target.c'))
    common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
    specific_ss.add(files('target_info-stub.c'))
    subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
    #include "system/hostmem.h"
    #include "system/blockdev.h"
    #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
    #include "qemu/module.h"
    #include "qom/object.h"
    #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be 
used by

boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on
static initializer, but in qemu-system-sh4, hw/arm or target/arm is not
linked, so it fails.
I guess this is the null board that is creating this situation, since
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in list
of machines. But I think it's not so good as it would require to deal
with a list of types when we want to access a machine.

So I would just move the file and link it inconditonnally in all 
binaries.


Which file? target_info-qom.c is already in system_ss[].


Move existing target_info-qom in in target/arm/target_info_types.c, and 
add it to system_ss, instead of arm_ss or arm_common_ss, so it's always 
linked.


That should work, but what is the benefit over having a single file
where all definitions are concentrated?




Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Pierrick Bouvier

On 4/18/25 10:04, Philippe Mathieu-Daudé wrote:

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
    meson.build    |  1 +
    include/hw/boards.h    |  1 +
    include/qemu/target_info-qom.h | 18 ++
    target_info-qom.c  | 24 
    4 files changed, 44 insertions(+)
    create mode 100644 include/qemu/target_info-qom.h
    create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
    specific_ss.add(files('page-target.c', 'page-vary-target.c'))
    common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
    specific_ss.add(files('target_info-stub.c'))
    subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
    #include "system/hostmem.h"
    #include "system/blockdev.h"
    #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
    #include "qemu/module.h"
    #include "qom/object.h"
    #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on
static initializer, but in qemu-system-sh4, hw/arm or target/arm is not
linked, so it fails.
I guess this is the null board that is creating this situation, since
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in list
of machines. But I think it's not so good as it would require to deal
with a list of types when we want to access a machine.

So I would just move the file and link it inconditonnally in all binaries.


Which file? target_info-qom.c is already in system_ss[].


Move existing target_info-qom in in target/arm/target_info_types.c, and 
add it to system_ss, instead of arm_ss or arm_common_ss, so it's always 
linked.


Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Philippe Mathieu-Daudé

On 18/4/25 18:30, Pierrick Bouvier wrote:

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
   meson.build    |  1 +
   include/hw/boards.h    |  1 +
   include/qemu/target_info-qom.h | 18 ++
   target_info-qom.c  | 24 
   4 files changed, 44 insertions(+)
   create mode 100644 include/qemu/target_info-qom.h
   create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
   specific_ss.add(files('page-target.c', 'page-vary-target.c'))
   common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
   specific_ss.add(files('target_info-stub.c'))
   subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
   #include "system/hostmem.h"
   #include "system/blockdev.h"
   #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
   #include "qemu/module.h"
   #include "qom/object.h"
   #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on 
static initializer, but in qemu-system-sh4, hw/arm or target/arm is not 
linked, so it fails.
I guess this is the null board that is creating this situation, since 
it's included by all binaries.


Correct.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in list 
of machines. But I think it's not so good as it would require to deal 
with a list of types when we want to access a machine.


So I would just move the file and link it inconditonnally in all binaries.


Which file? target_info-qom.c is already in system_ss[].



Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Pierrick Bouvier

On 4/18/25 07:07, Philippe Mathieu-Daudé wrote:

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
   meson.build    |  1 +
   include/hw/boards.h    |  1 +
   include/qemu/target_info-qom.h | 18 ++
   target_info-qom.c  | 24 
   4 files changed, 44 insertions(+)
   create mode 100644 include/qemu/target_info-qom.h
   create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
   specific_ss.add(files('page-target.c', 'page-vary-target.c'))
   common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
   specific_ss.add(files('target_info-stub.c'))
   subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
   #include "system/hostmem.h"
   #include "system/blockdev.h"
   #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
   #include "qemu/module.h"
   #include "qom/object.h"
   #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/
target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be used by
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine'
for object 'machine'



If I'm correct, types can be registered anywhere, since they rely on 
static initializer, but in qemu-system-sh4, hw/arm or target/arm is not 
linked, so it fails.
I guess this is the null board that is creating this situation, since 
it's included by all binaries.


I see two solutions while still moving those types in target/arm:
- include this type file in libcommon, so it's always linked.
- introduce a new TYPE_TARGET_ALL_MACHINE, and always include it in list 
of machines. But I think it's not so good as it would require to deal 
with a list of types when we want to access a machine.


So I would just move the file and link it inconditonnally in all binaries.

How about that?


Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-18 Thread Philippe Mathieu-Daudé

On 18/4/25 05:07, Pierrick Bouvier wrote:

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
  meson.build    |  1 +
  include/hw/boards.h    |  1 +
  include/qemu/target_info-qom.h | 18 ++
  target_info-qom.c  | 24 
  4 files changed, 44 insertions(+)
  create mode 100644 include/qemu/target_info-qom.h
  create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
  specific_ss.add(files('page-target.c', 'page-vary-target.c'))
  common_ss.add(files('target_info.c'))
+system_ss.add(files('target_info-qom.c'))
  specific_ss.add(files('target_info-stub.c'))
  subdir('backends')
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
  #include "system/hostmem.h"
  #include "system/blockdev.h"
  #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
  #include "qemu/module.h"
  #include "qom/object.h"
  #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/ 
target_info-qom.h

new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+    "target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+    "target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+    {
+    .name   = TYPE_TARGET_ARM_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+    {
+    .name   = TYPE_TARGET_AARCH64_MACHINE,
+    .parent = TYPE_INTERFACE,
+    },
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be used by 
boards in hw/arm, and by the target_info specialization.


Not the way QOM works, interfaces must be registered, which is
why I use this centralized file. Otherwise we get:

$ qemu-system-sh4 -M help
qemu-system-sh4: -M help: missing interface 'target-info-arm-machine' 
for object 'machine'





Re: [RFC PATCH v2 04/11] hw/arm: Register TYPE_TARGET_ARM/AARCH64_CPU QOM interfaces

2025-04-17 Thread Pierrick Bouvier

On 4/17/25 17:50, Philippe Mathieu-Daudé wrote:

Define the TYPE_TARGET_ARM_MACHINE and TYPE_TARGET_AARCH64_MACHINE
QOM interface names to allow machines to implement them.

Signed-off-by: Philippe Mathieu-Daudé 
---
  meson.build|  1 +
  include/hw/boards.h|  1 +
  include/qemu/target_info-qom.h | 18 ++
  target_info-qom.c  | 24 
  4 files changed, 44 insertions(+)
  create mode 100644 include/qemu/target_info-qom.h
  create mode 100644 target_info-qom.c

diff --git a/meson.build b/meson.build
index 49a050a28a3..168b07b5887 100644
--- a/meson.build
+++ b/meson.build
@@ -3808,6 +3808,7 @@ common_ss.add(pagevary)
  specific_ss.add(files('page-target.c', 'page-vary-target.c'))
  
  common_ss.add(files('target_info.c'))

+system_ss.add(files('target_info-qom.c'))
  specific_ss.add(files('target_info-stub.c'))
  
  subdir('backends')

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 02f43ac5d4d..b1bbf3c34d4 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -7,6 +7,7 @@
  #include "system/hostmem.h"
  #include "system/blockdev.h"
  #include "qapi/qapi-types-machine.h"
+#include "qemu/target_info-qom.h"
  #include "qemu/module.h"
  #include "qom/object.h"
  #include "hw/core/cpu.h"
diff --git a/include/qemu/target_info-qom.h b/include/qemu/target_info-qom.h
new file mode 100644
index 000..7eb9b6bd254
--- /dev/null
+++ b/include/qemu/target_info-qom.h
@@ -0,0 +1,18 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef QEMU_TARGET_INFO_QOM_H
+#define QEMU_TARGET_INFO_QOM_H
+
+#define TYPE_TARGET_ARM_MACHINE \
+"target-info-arm-machine"
+
+#define TYPE_TARGET_AARCH64_MACHINE \
+"target-info-aarch64-machine"
+
+#endif
diff --git a/target_info-qom.c b/target_info-qom.c
new file mode 100644
index 000..d3fee57361b
--- /dev/null
+++ b/target_info-qom.c
@@ -0,0 +1,24 @@
+/*
+ * QEMU binary/target API (QOM types)
+ *
+ *  Copyright (c) Linaro
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/target_info-qom.h"
+#include "qom/object.h"
+
+static const TypeInfo target_info_types[] = {
+{
+.name   = TYPE_TARGET_ARM_MACHINE,
+.parent = TYPE_INTERFACE,
+},
+{
+.name   = TYPE_TARGET_AARCH64_MACHINE,
+.parent = TYPE_INTERFACE,
+},
+};
+
+DEFINE_TYPES(target_info_types)


Ideally, this should be in target/arm, as this type will only be used by 
boards in hw/arm, and by the target_info specialization.