All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1
@ 2023-05-31 12:53 Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
                   ` (22 more replies)
  0 siblings, 23 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

[MCA: the original series has now been split into 2 separate parts based upon
Phil's comments re: QOM parenting for objects in Q800MachineState. Part 1
consists of the Q800MachineState patches along with QOM parenting fixes and
the 2 mac_via RTC patches.]

This series contains the remaining patches needed to allow QEMU's q800
machine to boot MacOS Classic when used in conjunction with a real
Quadra 800 ROM image. In fact with this series applied it is possible
to boot all of the following OSs:

  - MacOS 7.1 - 8.1, with or without virtual memory enabled
  - A/UX 3.0.1
  - NetBSD 9.3
  - Linux (via EMILE)

If you are ready to experience some 90s nostalgia then all you need is
to grab yourself a copy of the Quadra 800 ROM (checksum 0xf1acad13) and a
suitable install ISO as follows:

  # Prepare a PRAM image
  $ qemu-img create -f raw pram.img 256b

  # Launch QEMU with blank disk and install CDROM
  $ ./qemu-system-m68k \
      -M q800 \
      -m 128 \
      -bios Quadra800.rom \
      -drive file=pram.img,format=raw,if=mtd \
      -drive file=disk.img,media=disk,format=raw,if=none,id=hd \
      -device scsi-hd,scsi-id=0,drive=hd \
      -drive file=cdrom.iso,media=cdrom,if=none,id=cd \
      -device scsi-cd,scsi-id=3,drive=cd

And off you go! For more in-depth information about the installation process
I highly recommend the installation guide over at emaculation.com [1].
Compatibility is generally very good, and I'm pleased to report it is possible
to run one of the most popular productivity apps from the 90s [2].

I'd like to add a big thank you to all the people who have helped me work on
this series, including testing on real hardware, answering questions about
MacOS Classic internals and helping to diagnose and fix bugs in the 68k
emulation. In particular thanks go to Laurent Vivier, Finn Thain, Howard
Spoelstra, Volker Rümelin, Richard Henderson, Martin Husemann, Rin Okuyama,
Elliot Nunn, and SolraBizna.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

[1] https://www.emaculation.com/doku.php/qemu
[2] https://www.youtube.com/watch?v=yI21gURQ1Ew


v2:
- Split series into 2 parts (this is part 1)
- Update QOM parenting for objects in Q800MachineState (Phil)
- Split GLUE device into separate glue.c and glue.h files
- Split TYPE_DP8393X and dp8393xState into dp8393x.h
- Add R-B tags from Laurent (where I still believe they are valid)


Mark Cave-Ayland (23):
  q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty
    array
  q800: add missing space after parent object in GLUEState
  q800: introduce Q800MachineState
  q800: rename q800_init() to q800_machine_init()
  q800: move CPU object into Q800MachineState
  q800: move ROM memory region to Q800MachineState
  q800: move GLUE device into separate q800-glue.c file
  q800: move GLUE device to Q800MachineState
  q800: introduce mac-io container memory region
  q800: reimplement mac-io region aliasing using IO memory region
  q800: move VIA1 device to Q800MachineState
  q800: move VIA2 device to Q800MachineState
  hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  q800: move dp8393x device to Q800MachineState
  q800: move ESCC device to Q800MachineState
  q800: move escc_orgate device to Q800MachineState
  q800: move ESP device to Q800MachineState
  q800: move SWIM device to Q800MachineState
  q800: move mac-nubus-bridge device to Q800MachineState
  q800: don't access Nubus bus directly from the mac-nubus-bridge device
  q800: move macfb device to Q800MachineState
  mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf
  mac_via: fix rtc command decoding for the PRAM seconds registers

 MAINTAINERS                 |   3 +
 hw/m68k/meson.build         |   2 +-
 hw/m68k/q800-glue.c         | 252 ++++++++++++++++++
 hw/m68k/q800.c              | 505 +++++++++++++-----------------------
 hw/misc/mac_via.c           |  13 +-
 hw/net/dp8393x.c            |  32 +--
 include/hw/m68k/q800-glue.h |  50 ++++
 include/hw/m68k/q800.h      |  62 +++++
 include/hw/net/dp8393x.h    |  60 +++++
 9 files changed, 619 insertions(+), 360 deletions(-)
 create mode 100644 hw/m68k/q800-glue.c
 create mode 100644 include/hw/m68k/q800-glue.h
 create mode 100644 include/hw/m68k/q800.h
 create mode 100644 include/hw/net/dp8393x.h

-- 
2.30.2



^ permalink raw reply	[flat|nested] 50+ messages in thread

* [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:56   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
                   ` (21 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Ensure there is a space before the final closing brace for all global
properties.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index b35ecafbc7..1aead224e2 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -719,14 +719,14 @@ static void q800_init(MachineState *machine)
 }
 
 static GlobalProperty hw_compat_q800[] = {
-    { "scsi-hd", "quirk_mode_page_vendor_specific_apple", "on"},
+    { "scsi-hd", "quirk_mode_page_vendor_specific_apple", "on" },
     { "scsi-hd", "vendor", " SEAGATE" },
     { "scsi-hd", "product", "          ST225N" },
     { "scsi-hd", "ver", "1.0 " },
-    { "scsi-cd", "quirk_mode_page_apple_vendor", "on"},
-    { "scsi-cd", "quirk_mode_sense_rom_use_dbd", "on"},
-    { "scsi-cd", "quirk_mode_page_vendor_specific_apple", "on"},
-    { "scsi-cd", "quirk_mode_page_truncated", "on"},
+    { "scsi-cd", "quirk_mode_page_apple_vendor", "on" },
+    { "scsi-cd", "quirk_mode_sense_rom_use_dbd", "on" },
+    { "scsi-cd", "quirk_mode_page_vendor_specific_apple", "on" },
+    { "scsi-cd", "quirk_mode_page_truncated", "on" },
     { "scsi-cd", "vendor", "MATSHITA" },
     { "scsi-cd", "product", "CD-ROM CR-8005" },
     { "scsi-cd", "ver", "1.0k" },
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 02/23] q800: add missing space after parent object in GLUEState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:35   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
                   ` (20 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

This brings GLUEState in line with our current QOM guidelines.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 1aead224e2..bb9e857632 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -100,6 +100,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
 
 struct GLUEState {
     SysBusDevice parent_obj;
+
     M68kCPU *cpu;
     uint8_t ipr;
     uint8_t auxmode;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 03/23] q800: introduce Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:37   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
                   ` (19 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

This provides an overall container and owner for Machine-related objects such
as MemoryRegions.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 MAINTAINERS            |  1 +
 hw/m68k/q800.c         |  2 ++
 include/hw/m68k/q800.h | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+)
 create mode 100644 include/hw/m68k/q800.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 4b025a7b63..51e62efe1b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1234,6 +1234,7 @@ F: include/hw/misc/mac_via.h
 F: include/hw/nubus/*
 F: include/hw/display/macfb.h
 F: include/hw/block/swim.h
+F: include/hw/m68k/q800.h
 
 virt
 M: Laurent Vivier <laurent@vivier.eu>
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index bb9e857632..93a3f96991 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -38,6 +38,7 @@
 #include "standard-headers/asm-m68k/bootinfo.h"
 #include "standard-headers/asm-m68k/bootinfo-mac.h"
 #include "bootinfo.h"
+#include "hw/m68k/q800.h"
 #include "hw/misc/mac_via.h"
 #include "hw/input/adb.h"
 #include "hw/nubus/mac-nubus-bridge.h"
@@ -749,6 +750,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
 static const TypeInfo q800_machine_typeinfo = {
     .name       = MACHINE_TYPE_NAME("q800"),
     .parent     = TYPE_MACHINE,
+    .instance_size = sizeof(Q800MachineState),
     .class_init = q800_machine_class_init,
 };
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
new file mode 100644
index 0000000000..76ea6560b2
--- /dev/null
+++ b/include/hw/m68k/q800.h
@@ -0,0 +1,37 @@
+/*
+ * QEMU Motorla 680x0 Macintosh hardware System Emulator
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HW_Q800_H
+#define HW_Q800_H
+
+/*
+ * The main Q800 machine
+ */
+
+struct Q800MachineState {
+    MachineState parent_obj;
+};
+
+#define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
+OBJECT_DECLARE_SIMPLE_TYPE(Q800MachineState, Q800_MACHINE)
+
+#endif
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init()
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (2 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:37   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
                   ` (18 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

This will enable us later to distinguish between QOM initialisation and machine
initialisation.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 93a3f96991..3730b30dd1 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -362,7 +362,7 @@ static uint8_t fake_mac_rom[] = {
     0x60, 0xFE                          /* bras [self] */
 };
 
-static void q800_init(MachineState *machine)
+static void q800_machine_init(MachineState *machine)
 {
     M68kCPU *cpu = NULL;
     int linux_boot;
@@ -738,8 +738,9 @@ static const size_t hw_compat_q800_len = G_N_ELEMENTS(hw_compat_q800);
 static void q800_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
+
     mc->desc = "Macintosh Quadra 800";
-    mc->init = q800_init;
+    mc->init = q800_machine_init;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
     mc->max_cpus = 1;
     mc->block_default_type = IF_SCSI;
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (3 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:40   ` Philippe Mathieu-Daudé
       [not found]   ` <edd9f126-526e-ee57-767b-a1d307008a4d@linaro.org>
  2023-05-31 12:53 ` [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
                   ` (17 subsequent siblings)
  22 siblings, 2 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the CPU to use object_initialize_child()
followed by a separate realisation.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 13 ++++++++-----
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 3730b30dd1..c34b2548ca 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
 
 static void q800_machine_init(MachineState *machine)
 {
-    M68kCPU *cpu = NULL;
+    Q800MachineState *m = Q800_MACHINE(machine);
     int linux_boot;
     int32_t kernel_size;
     uint64_t elf_entry;
@@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
     }
 
     /* init CPUs */
-    cpu = M68K_CPU(cpu_create(machine->cpu_type));
-    qemu_register_reset(main_cpu_reset, cpu);
+    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
+                            M68K_CPU_TYPE_NAME("m68040"));
+    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
+    qemu_register_reset(main_cpu_reset, &m->cpu);
 
     /* RAM */
     memory_region_add_subregion(get_system_memory(), 0, machine->ram);
@@ -430,7 +432,8 @@ static void q800_machine_init(MachineState *machine)
 
     /* IRQ Glue */
     glue = qdev_new(TYPE_GLUE);
-    object_property_set_link(OBJECT(glue), "cpu", OBJECT(cpu), &error_abort);
+    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
+                             &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
 
     /* VIA 1 */
@@ -605,7 +608,7 @@ static void q800_machine_init(MachineState *machine)
 
     macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
 
-    cs = CPU(cpu);
+    cs = CPU(&m->cpu);
     if (linux_boot) {
         uint64_t high;
         void *param_blob, *param_ptr, *param_rng_seed;
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 76ea6560b2..0f54f1c2cf 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -29,6 +29,8 @@
 
 struct Q800MachineState {
     MachineState parent_obj;
+
+    M68kCPU cpu;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (4 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:42   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
                   ` (16 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 13 +++++--------
 include/hw/m68k/q800.h |  1 +
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index c34b2548ca..3d0a56d9f3 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -372,7 +372,6 @@ static void q800_machine_init(MachineState *machine)
     int bios_size;
     ram_addr_t initrd_base;
     int32_t initrd_size;
-    MemoryRegion *rom;
     MemoryRegion *io;
     MemoryRegion *dp8393x_prom = g_new(MemoryRegion, 1);
     uint8_t *prom;
@@ -647,11 +646,10 @@ static void q800_machine_init(MachineState *machine)
         BOOTINFO1(param_ptr, BI_MAC_VROW, macfb_mode->stride);
         BOOTINFO1(param_ptr, BI_MAC_SCCBASE, SCC_BASE);
 
-        rom = g_malloc(sizeof(*rom));
-        memory_region_init_ram_ptr(rom, NULL, "m68k_fake_mac.rom",
+        memory_region_init_ram_ptr(&m->rom, NULL, "m68k_fake_mac.rom",
                                    sizeof(fake_mac_rom), fake_mac_rom);
-        memory_region_set_readonly(rom, true);
-        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom);
+        memory_region_set_readonly(&m->rom, true);
+        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
 
         if (kernel_cmdline) {
             BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
@@ -693,11 +691,10 @@ static void q800_machine_init(MachineState *machine)
     } else {
         uint8_t *ptr;
         /* allocate and load BIOS */
-        rom = g_malloc(sizeof(*rom));
-        memory_region_init_rom(rom, NULL, "m68k_mac.rom", MACROM_SIZE,
+        memory_region_init_rom(&m->rom, NULL, "m68k_mac.rom", MACROM_SIZE,
                                &error_abort);
         filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
-        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom);
+        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
 
         /* Load MacROM binary */
         if (filename) {
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 0f54f1c2cf..3e41f0e297 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -31,6 +31,7 @@ struct Q800MachineState {
     MachineState parent_obj;
 
     M68kCPU cpu;
+    MemoryRegion rom;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 07/23] q800: move GLUE device into separate q800-glue.c file
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (5 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
                   ` (15 subsequent siblings)
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

This will allow the q800-glue.h header to be included separately so that the
GLUE device can be referenced externally.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 MAINTAINERS                 |   2 +
 hw/m68k/meson.build         |   2 +-
 hw/m68k/q800-glue.c         | 252 ++++++++++++++++++++++++++++++++++++
 hw/m68k/q800.c              | 238 +---------------------------------
 include/hw/m68k/q800-glue.h |  50 +++++++
 5 files changed, 306 insertions(+), 238 deletions(-)
 create mode 100644 hw/m68k/q800-glue.c
 create mode 100644 include/hw/m68k/q800-glue.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 51e62efe1b..802fb1c2a4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1223,6 +1223,7 @@ q800
 M: Laurent Vivier <laurent@vivier.eu>
 S: Maintained
 F: hw/m68k/q800.c
+F: hw/m68k/q800-glue.c
 F: hw/misc/mac_via.c
 F: hw/nubus/*
 F: hw/display/macfb.c
@@ -1235,6 +1236,7 @@ F: include/hw/nubus/*
 F: include/hw/display/macfb.h
 F: include/hw/block/swim.h
 F: include/hw/m68k/q800.h
+F: include/hw/m68k/q800-glue.h
 
 virt
 M: Laurent Vivier <laurent@vivier.eu>
diff --git a/hw/m68k/meson.build b/hw/m68k/meson.build
index 31248641d3..84bc68fa4e 100644
--- a/hw/m68k/meson.build
+++ b/hw/m68k/meson.build
@@ -2,7 +2,7 @@ m68k_ss = ss.source_set()
 m68k_ss.add(when: 'CONFIG_AN5206', if_true: files('an5206.c', 'mcf5206.c'))
 m68k_ss.add(when: 'CONFIG_MCF5208', if_true: files('mcf5208.c', 'mcf_intc.c'))
 m68k_ss.add(when: 'CONFIG_NEXTCUBE', if_true: files('next-kbd.c', 'next-cube.c'))
-m68k_ss.add(when: 'CONFIG_Q800', if_true: files('q800.c'))
+m68k_ss.add(when: 'CONFIG_Q800', if_true: files('q800.c', 'q800-glue.c'))
 m68k_ss.add(when: 'CONFIG_M68K_VIRT', if_true: files('virt.c'))
 
 hw_arch += {'m68k': m68k_ss}
diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c
new file mode 100644
index 0000000000..793bdb110c
--- /dev/null
+++ b/hw/m68k/q800-glue.c
@@ -0,0 +1,252 @@
+/*
+ * QEMU q800 logic glue
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include "cpu.h"
+#include "hw/m68k/q800-glue.h"
+#include "hw/boards.h"
+#include "hw/irq.h"
+#include "hw/nmi.h"
+#include "hw/qdev-properties.h"
+#include "migration/vmstate.h"
+
+/*
+ * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
+ * that performs a variety of functions (RAM management, clock generation, ...).
+ * The GLUE chip receives interrupt requests from various devices,
+ * assign priority to each, and asserts one or more interrupt line to the
+ * CPU.
+ */
+
+/*
+ * The GLUE logic on the Quadra 800 supports 2 different IRQ routing modes
+ * controlled from the VIA1 auxmode GPIO (port B bit 6) which are documented
+ * in NetBSD as follows:
+ *
+ * A/UX mode (Linux, NetBSD, auxmode GPIO low)
+ *
+ *   Level 0:        Spurious: ignored
+ *   Level 1:        Software
+ *   Level 2:        VIA2 (except ethernet, sound)
+ *   Level 3:        Ethernet
+ *   Level 4:        Serial (SCC)
+ *   Level 5:        Sound
+ *   Level 6:        VIA1
+ *   Level 7:        NMIs: parity errors, RESET button, YANCC error
+ *
+ * Classic mode (default: used by MacOS, A/UX 3.0.1, auxmode GPIO high)
+ *
+ *   Level 0:        Spurious: ignored
+ *   Level 1:        VIA1 (clock, ADB)
+ *   Level 2:        VIA2 (NuBus, SCSI)
+ *   Level 3:
+ *   Level 4:        Serial (SCC)
+ *   Level 5:
+ *   Level 6:
+ *   Level 7:        Non-maskable: parity errors, RESET button
+ *
+ * Note that despite references to A/UX mode in Linux and NetBSD, at least
+ * A/UX 3.0.1 still uses Classic mode.
+ */
+
+static void GLUE_set_irq(void *opaque, int irq, int level)
+{
+    GLUEState *s = opaque;
+    int i;
+
+    if (s->auxmode) {
+        /* Classic mode */
+        switch (irq) {
+        case GLUE_IRQ_IN_VIA1:
+            irq = 0;
+            break;
+
+        case GLUE_IRQ_IN_VIA2:
+            irq = 1;
+            break;
+
+        case GLUE_IRQ_IN_SONIC:
+            /* Route to VIA2 instead */
+            qemu_set_irq(s->irqs[GLUE_IRQ_NUBUS_9], level);
+            return;
+
+        case GLUE_IRQ_IN_ESCC:
+            irq = 3;
+            break;
+
+        case GLUE_IRQ_IN_NMI:
+            irq = 6;
+            break;
+
+        default:
+            g_assert_not_reached();
+        }
+    } else {
+        /* A/UX mode */
+        switch (irq) {
+        case GLUE_IRQ_IN_VIA1:
+            irq = 5;
+            break;
+
+        case GLUE_IRQ_IN_VIA2:
+            irq = 1;
+            break;
+
+        case GLUE_IRQ_IN_SONIC:
+            irq = 2;
+            break;
+
+        case GLUE_IRQ_IN_ESCC:
+            irq = 3;
+            break;
+
+        case GLUE_IRQ_IN_NMI:
+            irq = 6;
+            break;
+
+        default:
+            g_assert_not_reached();
+        }
+    }
+
+    if (level) {
+        s->ipr |= 1 << irq;
+    } else {
+        s->ipr &= ~(1 << irq);
+    }
+
+    for (i = 7; i >= 0; i--) {
+        if ((s->ipr >> i) & 1) {
+            m68k_set_irq_level(s->cpu, i + 1, i + 25);
+            return;
+        }
+    }
+    m68k_set_irq_level(s->cpu, 0, 0);
+}
+
+static void glue_auxmode_set_irq(void *opaque, int irq, int level)
+{
+    GLUEState *s = GLUE(opaque);
+
+    s->auxmode = level;
+}
+
+static void glue_nmi(NMIState *n, int cpu_index, Error **errp)
+{
+    GLUEState *s = GLUE(n);
+
+    /* Hold NMI active for 100ms */
+    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1);
+    timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100);
+}
+
+static void glue_nmi_release(void *opaque)
+{
+    GLUEState *s = GLUE(opaque);
+
+    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 0);
+}
+
+static void glue_reset(DeviceState *dev)
+{
+    GLUEState *s = GLUE(dev);
+
+    s->ipr = 0;
+    s->auxmode = 0;
+
+    timer_del(s->nmi_release);
+}
+
+static const VMStateDescription vmstate_glue = {
+    .name = "q800-glue",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT8(ipr, GLUEState),
+        VMSTATE_UINT8(auxmode, GLUEState),
+        VMSTATE_TIMER_PTR(nmi_release, GLUEState),
+        VMSTATE_END_OF_LIST(),
+    },
+};
+
+/*
+ * If the m68k CPU implemented its inbound irq lines as GPIO lines
+ * rather than via the m68k_set_irq_level() function we would not need
+ * this cpu link property and could instead provide outbound IRQ lines
+ * that the board could wire up to the CPU.
+ */
+static Property glue_properties[] = {
+    DEFINE_PROP_LINK("cpu", GLUEState, cpu, TYPE_M68K_CPU, M68kCPU *),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void glue_finalize(Object *obj)
+{
+    GLUEState *s = GLUE(obj);
+
+    timer_free(s->nmi_release);
+}
+
+static void glue_init(Object *obj)
+{
+    DeviceState *dev = DEVICE(obj);
+    GLUEState *s = GLUE(dev);
+
+    qdev_init_gpio_in(dev, GLUE_set_irq, 8);
+    qdev_init_gpio_in_named(dev, glue_auxmode_set_irq, "auxmode", 1);
+
+    qdev_init_gpio_out(dev, s->irqs, 1);
+
+    /* NMI release timer */
+    s->nmi_release = timer_new_ms(QEMU_CLOCK_VIRTUAL, glue_nmi_release, s);
+}
+
+static void glue_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    NMIClass *nc = NMI_CLASS(klass);
+
+    dc->vmsd = &vmstate_glue;
+    dc->reset = glue_reset;
+    device_class_set_props(dc, glue_properties);
+    nc->nmi_monitor_handler = glue_nmi;
+}
+
+static const TypeInfo glue_info = {
+    .name = TYPE_GLUE,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(GLUEState),
+    .instance_init = glue_init,
+    .instance_finalize = glue_finalize,
+    .class_init = glue_class_init,
+    .interfaces = (InterfaceInfo[]) {
+         { TYPE_NMI },
+         { }
+    },
+};
+
+static void glue_register_types(void)
+{
+    type_register_static(&glue_info);
+}
+
+type_init(glue_register_types)
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 3d0a56d9f3..1d9dad60b3 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -28,7 +28,6 @@
 #include "cpu.h"
 #include "hw/boards.h"
 #include "hw/or-irq.h"
-#include "hw/nmi.h"
 #include "elf.h"
 #include "hw/loader.h"
 #include "ui/console.h"
@@ -39,6 +38,7 @@
 #include "standard-headers/asm-m68k/bootinfo-mac.h"
 #include "bootinfo.h"
 #include "hw/m68k/q800.h"
+#include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
 #include "hw/input/adb.h"
 #include "hw/nubus/mac-nubus-bridge.h"
@@ -88,241 +88,6 @@
 #define Q800_NUBUS_SLOTS_AVAILABLE    (BIT(0x9) | BIT(0xc) | BIT(0xd) | \
                                        BIT(0xe))
 
-/*
- * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
- * that performs a variety of functions (RAM management, clock generation, ...).
- * The GLUE chip receives interrupt requests from various devices,
- * assign priority to each, and asserts one or more interrupt line to the
- * CPU.
- */
-
-#define TYPE_GLUE "q800-glue"
-OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
-
-struct GLUEState {
-    SysBusDevice parent_obj;
-
-    M68kCPU *cpu;
-    uint8_t ipr;
-    uint8_t auxmode;
-    qemu_irq irqs[1];
-    QEMUTimer *nmi_release;
-};
-
-#define GLUE_IRQ_IN_VIA1       0
-#define GLUE_IRQ_IN_VIA2       1
-#define GLUE_IRQ_IN_SONIC      2
-#define GLUE_IRQ_IN_ESCC       3
-#define GLUE_IRQ_IN_NMI        4
-
-#define GLUE_IRQ_NUBUS_9       0
-
-/*
- * The GLUE logic on the Quadra 800 supports 2 different IRQ routing modes
- * controlled from the VIA1 auxmode GPIO (port B bit 6) which are documented
- * in NetBSD as follows:
- *
- * A/UX mode (Linux, NetBSD, auxmode GPIO low)
- *
- *   Level 0:        Spurious: ignored
- *   Level 1:        Software
- *   Level 2:        VIA2 (except ethernet, sound)
- *   Level 3:        Ethernet
- *   Level 4:        Serial (SCC)
- *   Level 5:        Sound
- *   Level 6:        VIA1
- *   Level 7:        NMIs: parity errors, RESET button, YANCC error
- *
- * Classic mode (default: used by MacOS, A/UX 3.0.1, auxmode GPIO high)
- *
- *   Level 0:        Spurious: ignored
- *   Level 1:        VIA1 (clock, ADB)
- *   Level 2:        VIA2 (NuBus, SCSI)
- *   Level 3:
- *   Level 4:        Serial (SCC)
- *   Level 5:
- *   Level 6:
- *   Level 7:        Non-maskable: parity errors, RESET button
- *
- * Note that despite references to A/UX mode in Linux and NetBSD, at least
- * A/UX 3.0.1 still uses Classic mode.
- */
-
-static void GLUE_set_irq(void *opaque, int irq, int level)
-{
-    GLUEState *s = opaque;
-    int i;
-
-    if (s->auxmode) {
-        /* Classic mode */
-        switch (irq) {
-        case GLUE_IRQ_IN_VIA1:
-            irq = 0;
-            break;
-
-        case GLUE_IRQ_IN_VIA2:
-            irq = 1;
-            break;
-
-        case GLUE_IRQ_IN_SONIC:
-            /* Route to VIA2 instead */
-            qemu_set_irq(s->irqs[GLUE_IRQ_NUBUS_9], level);
-            return;
-
-        case GLUE_IRQ_IN_ESCC:
-            irq = 3;
-            break;
-
-        case GLUE_IRQ_IN_NMI:
-            irq = 6;
-            break;
-
-        default:
-            g_assert_not_reached();
-        }
-    } else {
-        /* A/UX mode */
-        switch (irq) {
-        case GLUE_IRQ_IN_VIA1:
-            irq = 5;
-            break;
-
-        case GLUE_IRQ_IN_VIA2:
-            irq = 1;
-            break;
-
-        case GLUE_IRQ_IN_SONIC:
-            irq = 2;
-            break;
-
-        case GLUE_IRQ_IN_ESCC:
-            irq = 3;
-            break;
-
-        case GLUE_IRQ_IN_NMI:
-            irq = 6;
-            break;
-
-        default:
-            g_assert_not_reached();
-        }
-    }
-
-    if (level) {
-        s->ipr |= 1 << irq;
-    } else {
-        s->ipr &= ~(1 << irq);
-    }
-
-    for (i = 7; i >= 0; i--) {
-        if ((s->ipr >> i) & 1) {
-            m68k_set_irq_level(s->cpu, i + 1, i + 25);
-            return;
-        }
-    }
-    m68k_set_irq_level(s->cpu, 0, 0);
-}
-
-static void glue_auxmode_set_irq(void *opaque, int irq, int level)
-{
-    GLUEState *s = GLUE(opaque);
-
-    s->auxmode = level;
-}
-
-static void glue_nmi(NMIState *n, int cpu_index, Error **errp)
-{
-    GLUEState *s = GLUE(n);
-
-    /* Hold NMI active for 100ms */
-    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1);
-    timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100);
-}
-
-static void glue_nmi_release(void *opaque)
-{
-    GLUEState *s = GLUE(opaque);
-
-    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 0);
-}
-
-static void glue_reset(DeviceState *dev)
-{
-    GLUEState *s = GLUE(dev);
-
-    s->ipr = 0;
-    s->auxmode = 0;
-
-    timer_del(s->nmi_release);
-}
-
-static const VMStateDescription vmstate_glue = {
-    .name = "q800-glue",
-    .version_id = 0,
-    .minimum_version_id = 0,
-    .fields = (VMStateField[]) {
-        VMSTATE_UINT8(ipr, GLUEState),
-        VMSTATE_UINT8(auxmode, GLUEState),
-        VMSTATE_TIMER_PTR(nmi_release, GLUEState),
-        VMSTATE_END_OF_LIST(),
-    },
-};
-
-/*
- * If the m68k CPU implemented its inbound irq lines as GPIO lines
- * rather than via the m68k_set_irq_level() function we would not need
- * this cpu link property and could instead provide outbound IRQ lines
- * that the board could wire up to the CPU.
- */
-static Property glue_properties[] = {
-    DEFINE_PROP_LINK("cpu", GLUEState, cpu, TYPE_M68K_CPU, M68kCPU *),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
-static void glue_finalize(Object *obj)
-{
-    GLUEState *s = GLUE(obj);
-
-    timer_free(s->nmi_release);
-}
-
-static void glue_init(Object *obj)
-{
-    DeviceState *dev = DEVICE(obj);
-    GLUEState *s = GLUE(dev);
-
-    qdev_init_gpio_in(dev, GLUE_set_irq, 8);
-    qdev_init_gpio_in_named(dev, glue_auxmode_set_irq, "auxmode", 1);
-
-    qdev_init_gpio_out(dev, s->irqs, 1);
-
-    /* NMI release timer */
-    s->nmi_release = timer_new_ms(QEMU_CLOCK_VIRTUAL, glue_nmi_release, s);
-}
-
-static void glue_class_init(ObjectClass *klass, void *data)
-{
-    DeviceClass *dc = DEVICE_CLASS(klass);
-    NMIClass *nc = NMI_CLASS(klass);
-
-    dc->vmsd = &vmstate_glue;
-    dc->reset = glue_reset;
-    device_class_set_props(dc, glue_properties);
-    nc->nmi_monitor_handler = glue_nmi;
-}
-
-static const TypeInfo glue_info = {
-    .name = TYPE_GLUE,
-    .parent = TYPE_SYS_BUS_DEVICE,
-    .instance_size = sizeof(GLUEState),
-    .instance_init = glue_init,
-    .instance_finalize = glue_finalize,
-    .class_init = glue_class_init,
-    .interfaces = (InterfaceInfo[]) {
-         { TYPE_NMI },
-         { }
-    },
-};
 
 static void main_cpu_reset(void *opaque)
 {
@@ -758,7 +523,6 @@ static const TypeInfo q800_machine_typeinfo = {
 static void q800_machine_register_types(void)
 {
     type_register_static(&q800_machine_typeinfo);
-    type_register_static(&glue_info);
 }
 
 type_init(q800_machine_register_types)
diff --git a/include/hw/m68k/q800-glue.h b/include/hw/m68k/q800-glue.h
new file mode 100644
index 0000000000..c1817b01a5
--- /dev/null
+++ b/include/hw/m68k/q800-glue.h
@@ -0,0 +1,50 @@
+/*
+ * QEMU q800 logic glue
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HW_Q800_GLUE_H
+#define HW_Q800_GLUE_H
+
+#include "qemu/osdep.h"
+#include "hw/sysbus.h"
+
+#define TYPE_GLUE "q800-glue"
+OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
+
+struct GLUEState {
+    SysBusDevice parent_obj;
+
+    M68kCPU *cpu;
+    uint8_t ipr;
+    uint8_t auxmode;
+    qemu_irq irqs[1];
+    QEMUTimer *nmi_release;
+};
+
+#define GLUE_IRQ_IN_VIA1       0
+#define GLUE_IRQ_IN_VIA2       1
+#define GLUE_IRQ_IN_SONIC      2
+#define GLUE_IRQ_IN_ESCC       3
+#define GLUE_IRQ_IN_NMI        4
+
+#define GLUE_IRQ_NUBUS_9       0
+
+#endif
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 08/23] q800: move GLUE device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (6 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:43   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
                   ` (14 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the GLUE device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 24 ++++++++++++++----------
 include/hw/m68k/q800.h |  3 +++
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 1d9dad60b3..7bd8e795d2 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -158,7 +158,6 @@ static void q800_machine_init(MachineState *machine)
     SysBusDevice *sysbus;
     BusState *adb_bus;
     NubusBus *nubus;
-    DeviceState *glue;
     DriveInfo *dinfo;
     uint8_t rng_seed[32];
 
@@ -195,10 +194,10 @@ static void q800_machine_init(MachineState *machine)
     }
 
     /* IRQ Glue */
-    glue = qdev_new(TYPE_GLUE);
-    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
+    object_initialize_child(OBJECT(machine), "glue", &m->glue, TYPE_GLUE);
+    object_property_set_link(OBJECT(&m->glue), "cpu", OBJECT(&m->cpu),
                              &error_abort);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(&m->glue), &error_fatal);
 
     /* VIA 1 */
     via1_dev = qdev_new(TYPE_MOS6522_Q800_VIA1);
@@ -209,10 +208,12 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(via1_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 1, VIA_BASE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_VIA1));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
     qdev_connect_gpio_out(via1_dev, 0,
-                          qdev_get_gpio_in_named(glue, "auxmode", 0));
+                          qdev_get_gpio_in_named(DEVICE(&m->glue),
+                                                 "auxmode", 0));
 
     adb_bus = qdev_get_child_bus(via1_dev, "adb.0");
     dev = qdev_new(TYPE_ADB_KEYBOARD);
@@ -225,7 +226,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(via2_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 1, VIA_BASE + VIA_SIZE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_VIA2));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA2));
 
     /* MACSONIC */
 
@@ -258,7 +260,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 0, SONIC_BASE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_SONIC));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_SONIC));
 
     memory_region_init_rom(dp8393x_prom, NULL, "dp8393x-q800.prom",
                            SONIC_PROM_SIZE, &error_fatal);
@@ -295,7 +298,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(escc_orgate, 0));
     sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(escc_orgate, 1));
     qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
-                          qdev_get_gpio_in(glue, GLUE_IRQ_IN_ESCC));
+                          qdev_get_gpio_in(DEVICE(&m->glue),
+                                           GLUE_IRQ_IN_ESCC));
     sysbus_mmio_map(sysbus, 0, SCC_BASE);
 
     /* SCSI */
@@ -350,7 +354,7 @@ static void q800_machine_init(MachineState *machine)
      * Since the framebuffer in slot 0x9 uses a separate IRQ, wire the unused
      * IRQ via GLUE for use by SONIC Ethernet in classic mode
      */
-    qdev_connect_gpio_out(glue, GLUE_IRQ_NUBUS_9,
+    qdev_connect_gpio_out(DEVICE(&m->glue), GLUE_IRQ_NUBUS_9,
                           qdev_get_gpio_in_named(via2_dev, "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 3e41f0e297..8e1bb0735d 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -23,6 +23,8 @@
 #ifndef HW_Q800_H
 #define HW_Q800_H
 
+#include "hw/m68k/q800-glue.h"
+
 /*
  * The main Q800 machine
  */
@@ -32,6 +34,7 @@ struct Q800MachineState {
 
     M68kCPU cpu;
     MemoryRegion rom;
+    GLUEState glue;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 09/23] q800: introduce mac-io container memory region
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (7 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
                   ` (13 subsequent siblings)
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Move all devices from the IO region to within the container in preparation
for updating the IO aliasing mechanism.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 6 ++++++
 include/hw/m68k/q800.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 7bd8e795d2..2394d14c97 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -178,6 +178,12 @@ static void q800_machine_init(MachineState *machine)
     /* RAM */
     memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
+    /*
+     * Create container for all IO devices
+     */
+    memory_region_init(&m->macio, OBJECT(machine), "mac-io", IO_SLICE);
+    memory_region_add_subregion(get_system_memory(), IO_BASE, &m->macio);
+
     /*
      * Memory from IO_BASE to IO_BASE + IO_SLICE is repeated
      * from IO_BASE + IO_SLICE to IO_BASE + IO_SIZE
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 8e1bb0735d..b9de8e36cd 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -35,6 +35,7 @@ struct Q800MachineState {
     M68kCPU cpu;
     MemoryRegion rom;
     GLUEState glue;
+    MemoryRegion macio;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (8 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
                   ` (12 subsequent siblings)
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

The current use of aliased memory regions causes us 2 problems: firstly the
output of "info qom-tree" is absolutely huge and difficult to read, and
secondly we have already reached the internal limit for memory regions as
adding any new memory region into the mac-io region causes QEMU to assert
with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
failed".

Implement the mac-io region aliasing using a single IO memory region that
applies IO_SLICE_MASK representing the maximum size of the aliased region and
then forwarding the access to the existing mac-io memory region using the
address space API.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
 include/hw/m68k/q800.h |   1 +
 2 files changed, 82 insertions(+), 19 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 2394d14c97..785a67b0a9 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -59,6 +59,7 @@
 
 #define IO_BASE               0x50000000
 #define IO_SLICE              0x00040000
+#define IO_SLICE_MASK         (IO_SLICE - 1)
 #define IO_SIZE               0x04000000
 
 #define VIA_BASE              (IO_BASE + 0x00000)
@@ -127,6 +128,68 @@ static uint8_t fake_mac_rom[] = {
     0x60, 0xFE                          /* bras [self] */
 };
 
+static MemTxResult macio_alias_read(void *opaque, hwaddr addr, uint64_t *data,
+                                    unsigned size, MemTxAttrs attrs)
+{
+    MemTxResult r;
+    uint32_t val;
+
+    addr &= IO_SLICE_MASK;
+    addr |= IO_BASE;
+
+    switch (size) {
+    case 4:
+        val = address_space_ldl_be(&address_space_memory, addr, attrs, &r);
+        break;
+    case 2:
+        val = address_space_lduw_be(&address_space_memory, addr, attrs, &r);
+        break;
+    case 1:
+        val = address_space_ldub(&address_space_memory, addr, attrs, &r);
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    *data = val;
+    return r;
+}
+
+static MemTxResult macio_alias_write(void *opaque, hwaddr addr, uint64_t value,
+                                     unsigned size, MemTxAttrs attrs)
+{
+    MemTxResult r;
+
+    addr &= IO_SLICE_MASK;
+    addr |= IO_BASE;
+
+    switch (size) {
+    case 4:
+        address_space_stl_be(&address_space_memory, addr, value, attrs, &r);
+        break;
+    case 2:
+        address_space_stw_be(&address_space_memory, addr, value, attrs, &r);
+        break;
+    case 1:
+        address_space_stb(&address_space_memory, addr, value, attrs, &r);
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    return r;
+}
+
+static const MemoryRegionOps macio_alias_ops = {
+    .read_with_attrs = macio_alias_read,
+    .write_with_attrs = macio_alias_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 1,
+        .max_access_size = 4,
+    },
+};
+
 static void q800_machine_init(MachineState *machine)
 {
     Q800MachineState *m = Q800_MACHINE(machine);
@@ -137,10 +200,8 @@ static void q800_machine_init(MachineState *machine)
     int bios_size;
     ram_addr_t initrd_base;
     int32_t initrd_size;
-    MemoryRegion *io;
     MemoryRegion *dp8393x_prom = g_new(MemoryRegion, 1);
     uint8_t *prom;
-    const int io_slice_nb = (IO_SIZE / IO_SLICE) - 1;
     int i, checksum;
     MacFbMode *macfb_mode;
     ram_addr_t ram_size = machine->ram_size;
@@ -188,16 +249,10 @@ static void q800_machine_init(MachineState *machine)
      * Memory from IO_BASE to IO_BASE + IO_SLICE is repeated
      * from IO_BASE + IO_SLICE to IO_BASE + IO_SIZE
      */
-    io = g_new(MemoryRegion, io_slice_nb);
-    for (i = 0; i < io_slice_nb; i++) {
-        char *name = g_strdup_printf("mac_m68k.io[%d]", i + 1);
-
-        memory_region_init_alias(&io[i], NULL, name, get_system_memory(),
-                                 IO_BASE, IO_SLICE);
-        memory_region_add_subregion(get_system_memory(),
-                                    IO_BASE + (i + 1) * IO_SLICE, &io[i]);
-        g_free(name);
-    }
+    memory_region_init_io(&m->macio_alias, OBJECT(machine), &macio_alias_ops,
+                          &m->macio, "mac-io.alias", IO_SIZE - IO_SLICE);
+    memory_region_add_subregion(get_system_memory(), IO_BASE + IO_SLICE,
+                                &m->macio_alias);
 
     /* IRQ Glue */
     object_initialize_child(OBJECT(machine), "glue", &m->glue, TYPE_GLUE);
@@ -213,7 +268,8 @@ static void q800_machine_init(MachineState *machine)
     }
     sysbus = SYS_BUS_DEVICE(via1_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 1, VIA_BASE);
+    memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
@@ -231,7 +287,8 @@ static void q800_machine_init(MachineState *machine)
     via2_dev = qdev_new(TYPE_MOS6522_Q800_VIA2);
     sysbus = SYS_BUS_DEVICE(via2_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 1, VIA_BASE + VIA_SIZE);
+    memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE + VIA_SIZE,
+                                sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA2));
 
@@ -265,7 +322,8 @@ static void q800_machine_init(MachineState *machine)
                              OBJECT(get_system_memory()), &error_abort);
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 0, SONIC_BASE);
+    memory_region_add_subregion(&m->macio, SONIC_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_SONIC));
 
@@ -306,7 +364,8 @@ static void q800_machine_init(MachineState *machine)
     qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
                           qdev_get_gpio_in(DEVICE(&m->glue),
                                            GLUE_IRQ_IN_ESCC));
-    sysbus_mmio_map(sysbus, 0, SCC_BASE);
+    memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
 
     /* SCSI */
 
@@ -326,8 +385,10 @@ static void q800_machine_init(MachineState *machine)
                                                   VIA2_IRQ_SCSI_BIT)));
     sysbus_connect_irq(sysbus, 1, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
                                                   VIA2_IRQ_SCSI_DATA_BIT)));
-    sysbus_mmio_map(sysbus, 0, ESP_BASE);
-    sysbus_mmio_map(sysbus, 1, ESP_PDMA);
+    memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
+    memory_region_add_subregion(&m->macio, ESP_PDMA - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 1));
 
     scsi_bus_legacy_handle_cmdline(&esp->bus);
 
@@ -335,7 +396,8 @@ static void q800_machine_init(MachineState *machine)
 
     dev = qdev_new(TYPE_SWIM);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, SWIM_BASE);
+    memory_region_add_subregion(&m->macio, SWIM_BASE - IO_BASE,
+                                sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
 
     /* NuBus */
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index b9de8e36cd..81598af627 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -36,6 +36,7 @@ struct Q800MachineState {
     MemoryRegion rom;
     GLUEState glue;
     MemoryRegion macio;
+    MemoryRegion macio_alias;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (9 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:45   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 12/23] q800: move VIA2 " Mark Cave-Ayland
                   ` (11 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the VIA1 device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 16 +++++++++-------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 785a67b0a9..65947ba580 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,7 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *via1_dev, *via2_dev;
+    DeviceState *via2_dev;
     DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
@@ -261,23 +261,25 @@ static void q800_machine_init(MachineState *machine)
     sysbus_realize(SYS_BUS_DEVICE(&m->glue), &error_fatal);
 
     /* VIA 1 */
-    via1_dev = qdev_new(TYPE_MOS6522_Q800_VIA1);
+    object_initialize_child(OBJECT(machine), "via1", &m->via1,
+                            TYPE_MOS6522_Q800_VIA1);
     dinfo = drive_get(IF_MTD, 0, 0);
     if (dinfo) {
-        qdev_prop_set_drive(via1_dev, "drive", blk_by_legacy_dinfo(dinfo));
+        qdev_prop_set_drive(DEVICE(&m->via1), "drive",
+                            blk_by_legacy_dinfo(dinfo));
     }
-    sysbus = SYS_BUS_DEVICE(via1_dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus = SYS_BUS_DEVICE(&m->via1);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
-    qdev_connect_gpio_out(via1_dev, 0,
+    qdev_connect_gpio_out(DEVICE(&m->via1), 0,
                           qdev_get_gpio_in_named(DEVICE(&m->glue),
                                                  "auxmode", 0));
 
-    adb_bus = qdev_get_child_bus(via1_dev, "adb.0");
+    adb_bus = qdev_get_child_bus(DEVICE(&m->via1), "adb.0");
     dev = qdev_new(TYPE_ADB_KEYBOARD);
     qdev_realize_and_unref(dev, adb_bus, &error_fatal);
     dev = qdev_new(TYPE_ADB_MOUSE);
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 81598af627..a7e03b3d28 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -24,6 +24,7 @@
 #define HW_Q800_H
 
 #include "hw/m68k/q800-glue.h"
+#include "hw/misc/mac_via.h"
 
 /*
  * The main Q800 machine
@@ -35,6 +36,7 @@ struct Q800MachineState {
     M68kCPU cpu;
     MemoryRegion rom;
     GLUEState glue;
+    MOS6522Q800VIA1State via1;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 12/23] q800: move VIA2 device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (10 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:47   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
                   ` (10 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the VIA2 device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 27 ++++++++++++++++-----------
 include/hw/m68k/q800.h |  1 +
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 65947ba580..53d6308a7a 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,6 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *via2_dev;
     DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
@@ -286,9 +285,10 @@ static void q800_machine_init(MachineState *machine)
     qdev_realize_and_unref(dev, adb_bus, &error_fatal);
 
     /* VIA 2 */
-    via2_dev = qdev_new(TYPE_MOS6522_Q800_VIA2);
-    sysbus = SYS_BUS_DEVICE(via2_dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    object_initialize_child(OBJECT(machine), "via2", &m->via2,
+                            TYPE_MOS6522_Q800_VIA2);
+    sysbus = SYS_BUS_DEVICE(&m->via2);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE + VIA_SIZE,
                                 sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
@@ -383,10 +383,14 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     /* SCSI and SCSI data IRQs are negative edge triggered */
-    sysbus_connect_irq(sysbus, 0, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
-                                                  VIA2_IRQ_SCSI_BIT)));
-    sysbus_connect_irq(sysbus, 1, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
-                                                  VIA2_IRQ_SCSI_DATA_BIT)));
+    sysbus_connect_irq(sysbus, 0,
+                       qemu_irq_invert(
+                           qdev_get_gpio_in(DEVICE(&m->via2),
+                                                   VIA2_IRQ_SCSI_BIT)));
+    sysbus_connect_irq(sysbus, 1,
+                       qemu_irq_invert(
+                           qdev_get_gpio_in(DEVICE(&m->via2),
+                                                   VIA2_IRQ_SCSI_DATA_BIT)));
     memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 0));
     memory_region_add_subregion(&m->macio, ESP_PDMA - IO_BASE,
@@ -412,11 +416,12 @@ static void q800_machine_init(MachineState *machine)
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, NUBUS_SLOT_BASE +
                     MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE);
     qdev_connect_gpio_out(dev, 9,
-                          qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                          qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                           VIA2_NUBUS_IRQ_INTVIDEO));
     for (i = 1; i < VIA2_NUBUS_IRQ_NB; i++) {
         qdev_connect_gpio_out(dev, 9 + i,
-                              qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                              qdev_get_gpio_in_named(DEVICE(&m->via2),
+                                                     "nubus-irq",
                                                      VIA2_NUBUS_IRQ_9 + i));
     }
 
@@ -425,7 +430,7 @@ static void q800_machine_init(MachineState *machine)
      * IRQ via GLUE for use by SONIC Ethernet in classic mode
      */
     qdev_connect_gpio_out(DEVICE(&m->glue), GLUE_IRQ_NUBUS_9,
-                          qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                          qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
     nubus = &NUBUS_BRIDGE(dev)->bus;
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index a7e03b3d28..ba3aa45513 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -37,6 +37,7 @@ struct Q800MachineState {
     MemoryRegion rom;
     GLUEState glue;
     MOS6522Q800VIA1State via1;
+    MOS6522Q800VIA2State via2;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (11 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 12/23] q800: move VIA2 " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:49   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
                   ` (9 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel; +Cc: Jason Wang

This is to enable them to be used outside of dp8393x.c.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: Jason Wang <jasowang@redhat.com>
---
 hw/net/dp8393x.c         | 32 +--------------------
 include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 31 deletions(-)
 create mode 100644 include/hw/net/dp8393x.h

diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 45b954e46c..a596f7fbc6 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -20,6 +20,7 @@
 #include "qemu/osdep.h"
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
+#include "hw/net/dp8393x.h"
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "net/net.h"
@@ -85,7 +86,6 @@ static const char *reg_names[] = {
 #define SONIC_MPT    0x2e
 #define SONIC_MDT    0x2f
 #define SONIC_DCR2   0x3f
-#define SONIC_REG_COUNT  0x40
 
 #define SONIC_CR_HTX     0x0001
 #define SONIC_CR_TXP     0x0002
@@ -139,36 +139,6 @@ static const char *reg_names[] = {
 #define SONIC_DESC_EOL   0x0001
 #define SONIC_DESC_ADDR  0xFFFE
 
-#define TYPE_DP8393X "dp8393x"
-OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
-
-struct dp8393xState {
-    SysBusDevice parent_obj;
-
-    /* Hardware */
-    uint8_t it_shift;
-    bool big_endian;
-    bool last_rba_is_full;
-    qemu_irq irq;
-    int irq_level;
-    QEMUTimer *watchdog;
-    int64_t wt_last_update;
-    NICConf conf;
-    NICState *nic;
-    MemoryRegion mmio;
-
-    /* Registers */
-    uint16_t cam[16][3];
-    uint16_t regs[SONIC_REG_COUNT];
-
-    /* Temporaries */
-    uint8_t tx_buffer[0x10000];
-    int loopback_packet;
-
-    /* Memory access */
-    MemoryRegion *dma_mr;
-    AddressSpace as;
-};
 
 /*
  * Accessor functions for values which are formed by
diff --git a/include/hw/net/dp8393x.h b/include/hw/net/dp8393x.h
new file mode 100644
index 0000000000..bb5f0ced5a
--- /dev/null
+++ b/include/hw/net/dp8393x.h
@@ -0,0 +1,60 @@
+/*
+ * QEMU NS SONIC DP8393x netcard
+ *
+ * Copyright (c) 2008-2009 Herve Poussineau
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef HW_NET_DP8393X_H
+#define HW_NET_DP8393X_H
+
+#include "qemu/osdep.h"
+#include "hw/sysbus.h"
+#include "net/net.h"
+
+#define SONIC_REG_COUNT  0x40
+
+#define TYPE_DP8393X "dp8393x"
+OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
+
+struct dp8393xState {
+    SysBusDevice parent_obj;
+
+    /* Hardware */
+    uint8_t it_shift;
+    bool big_endian;
+    bool last_rba_is_full;
+    qemu_irq irq;
+    int irq_level;
+    QEMUTimer *watchdog;
+    int64_t wt_last_update;
+    NICConf conf;
+    NICState *nic;
+    MemoryRegion mmio;
+
+    /* Registers */
+    uint16_t cam[16][3];
+    uint16_t regs[SONIC_REG_COUNT];
+
+    /* Temporaries */
+    uint8_t tx_buffer[0x10000];
+    int loopback_packet;
+
+    /* Memory access */
+    MemoryRegion *dma_mr;
+    AddressSpace as;
+};
+
+#endif
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (12 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:49   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 15/23] q800: move ESCC " Mark Cave-Ayland
                   ` (8 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel; +Cc: Jason Wang

Also change the instantiation of the dp8393x device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: Jason Wang <jasowang@redhat.com>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 53d6308a7a..e25f6f1373 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -316,14 +316,16 @@ static void q800_machine_init(MachineState *machine)
     nd_table[0].macaddr.a[1] = 0x00;
     nd_table[0].macaddr.a[2] = 0x07;
 
-    dev = qdev_new("dp8393x");
+    object_initialize_child(OBJECT(machine), "dp8393x", &m->dp8393x,
+                            TYPE_DP8393X);
+    dev = DEVICE(&m->dp8393x);
     qdev_set_nic_properties(dev, &nd_table[0]);
     qdev_prop_set_uint8(dev, "it_shift", 2);
     qdev_prop_set_bit(dev, "big_endian", true);
     object_property_set_link(OBJECT(dev), "dma_mr",
                              OBJECT(get_system_memory()), &error_abort);
     sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, SONIC_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 0));
     sysbus_connect_irq(sysbus, 0,
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index ba3aa45513..82964cfea1 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -25,6 +25,7 @@
 
 #include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
+#include "hw/net/dp8393x.h"
 
 /*
  * The main Q800 machine
@@ -38,6 +39,7 @@ struct Q800MachineState {
     GLUEState glue;
     MOS6522Q800VIA1State via1;
     MOS6522Q800VIA2State via2;
+    dp8393xState dp8393x;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 15/23] q800: move ESCC device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (13 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:49   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 16/23] q800: move escc_orgate " Mark Cave-Ayland
                   ` (7 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the ESCC device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index e25f6f1373..ac92daf190 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -347,7 +347,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* SCC */
 
-    dev = qdev_new(TYPE_ESCC);
+    object_initialize_child(OBJECT(machine), "escc", &m->escc,
+                            TYPE_ESCC);
+    dev = DEVICE(&m->escc);
     qdev_prop_set_uint32(dev, "disabled", 0);
     qdev_prop_set_uint32(dev, "frequency", MAC_CLOCK);
     qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -357,7 +359,7 @@ static void q800_machine_init(MachineState *machine)
     qdev_prop_set_uint32(dev, "chnBtype", 0);
     qdev_prop_set_uint32(dev, "chnAtype", 0);
     sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus_realize(sysbus, &error_fatal);
 
     /* Logically OR both its IRQs together */
     escc_orgate = DEVICE(object_new(TYPE_OR_IRQ));
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 82964cfea1..d03603fe02 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -26,6 +26,7 @@
 #include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
 #include "hw/net/dp8393x.h"
+#include "hw/char/escc.h"
 
 /*
  * The main Q800 machine
@@ -40,6 +41,7 @@ struct Q800MachineState {
     MOS6522Q800VIA1State via1;
     MOS6522Q800VIA2State via2;
     dp8393xState dp8393x;
+    ESCCState escc;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 16/23] q800: move escc_orgate device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (14 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 15/23] q800: move ESCC " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:50   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 17/23] q800: move ESP " Mark Cave-Ayland
                   ` (6 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the escc_orgate device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 16 +++++++++-------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index ac92daf190..6f54677e5f 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,6 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
     SysBusDevice *sysbus;
@@ -362,12 +361,15 @@ static void q800_machine_init(MachineState *machine)
     sysbus_realize(sysbus, &error_fatal);
 
     /* Logically OR both its IRQs together */
-    escc_orgate = DEVICE(object_new(TYPE_OR_IRQ));
-    object_property_set_int(OBJECT(escc_orgate), "num-lines", 2, &error_fatal);
-    qdev_realize_and_unref(escc_orgate, NULL, &error_fatal);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(escc_orgate, 0));
-    sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(escc_orgate, 1));
-    qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
+    object_initialize_child(OBJECT(machine), "escc_orgate", &m->escc_orgate,
+                            TYPE_OR_IRQ);
+    object_property_set_int(OBJECT(&m->escc_orgate), "num-lines", 2,
+                            &error_fatal);
+    dev = DEVICE(&m->escc_orgate);
+    qdev_realize(dev, NULL, &error_fatal);
+    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(dev, 0));
+    sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(dev, 1));
+    qdev_connect_gpio_out(dev, 0,
                           qdev_get_gpio_in(DEVICE(&m->glue),
                                            GLUE_IRQ_IN_ESCC));
     memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE,
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index d03603fe02..f9af314ee1 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -27,6 +27,7 @@
 #include "hw/misc/mac_via.h"
 #include "hw/net/dp8393x.h"
 #include "hw/char/escc.h"
+#include "hw/or-irq.h"
 
 /*
  * The main Q800 machine
@@ -42,6 +43,7 @@ struct Q800MachineState {
     MOS6522Q800VIA2State via2;
     dp8393xState dp8393x;
     ESCCState escc;
+    OrIRQState escc_orgate;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 17/23] q800: move ESP device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (15 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 16/23] q800: move escc_orgate " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:51   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 18/23] q800: move SWIM " Mark Cave-Ayland
                   ` (5 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the ESP device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 9 +++++----
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 6f54677e5f..befef5f822 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -377,8 +377,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* SCSI */
 
-    dev = qdev_new(TYPE_SYSBUS_ESP);
-    sysbus_esp = SYSBUS_ESP(dev);
+    object_initialize_child(OBJECT(machine), "esp", &m->esp,
+                            TYPE_SYSBUS_ESP);
+    sysbus_esp = SYSBUS_ESP(&m->esp);
     esp = &sysbus_esp->esp;
     esp->dma_memory_read = NULL;
     esp->dma_memory_write = NULL;
@@ -386,8 +387,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus_esp->it_shift = 4;
     esp->dma_enabled = 1;
 
-    sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus = SYS_BUS_DEVICE(&m->esp);
+    sysbus_realize(sysbus, &error_fatal);
     /* SCSI and SCSI data IRQs are negative edge triggered */
     sysbus_connect_irq(sysbus, 0,
                        qemu_irq_invert(
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index f9af314ee1..ba76aa37f2 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -28,6 +28,7 @@
 #include "hw/net/dp8393x.h"
 #include "hw/char/escc.h"
 #include "hw/or-irq.h"
+#include "hw/scsi/esp.h"
 
 /*
  * The main Q800 machine
@@ -44,6 +45,7 @@ struct Q800MachineState {
     dp8393xState dp8393x;
     ESCCState escc;
     OrIRQState escc_orgate;
+    SysBusESPState esp;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 18/23] q800: move SWIM device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (16 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 17/23] q800: move ESP " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:51   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
                   ` (4 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the SWIM device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 8 +++++---
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index befef5f822..f85ccf83af 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -407,10 +407,12 @@ static void q800_machine_init(MachineState *machine)
 
     /* SWIM floppy controller */
 
-    dev = qdev_new(TYPE_SWIM);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+    object_initialize_child(OBJECT(machine), "swim", &m->swim,
+                            TYPE_SWIM);
+    sysbus = SYS_BUS_DEVICE(&m->swim);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, SWIM_BASE - IO_BASE,
-                                sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
+                                sysbus_mmio_get_region(sysbus, 0));
 
     /* NuBus */
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index ba76aa37f2..ce8dbcd68f 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -29,6 +29,7 @@
 #include "hw/char/escc.h"
 #include "hw/or-irq.h"
 #include "hw/scsi/esp.h"
+#include "hw/block/swim.h"
 
 /*
  * The main Q800 machine
@@ -46,6 +47,7 @@ struct Q800MachineState {
     ESCCState escc;
     OrIRQState escc_orgate;
     SysBusESPState esp;
+    Swim swim;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (17 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 18/23] q800: move SWIM " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:52   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
                   ` (3 subsequent siblings)
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the mac-nubus-bridge device to use
object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 5 ++++-
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index f85ccf83af..d02a1a7a1f 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -416,7 +416,10 @@ static void q800_machine_init(MachineState *machine)
 
     /* NuBus */
 
-    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
+    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
+                            &m->mac_nubus_bridge,
+                            TYPE_MAC_NUBUS_BRIDGE);
+    dev = DEVICE(&m->mac_nubus_bridge);
     qdev_prop_set_uint32(dev, "slot-available-mask",
                          Q800_NUBUS_SLOTS_AVAILABLE);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index ce8dbcd68f..3f3e87b3dc 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -30,6 +30,7 @@
 #include "hw/or-irq.h"
 #include "hw/scsi/esp.h"
 #include "hw/block/swim.h"
+#include "hw/nubus/mac-nubus-bridge.h"
 
 /*
  * The main Q800 machine
@@ -48,6 +49,7 @@ struct Q800MachineState {
     OrIRQState escc_orgate;
     SysBusESPState esp;
     Swim swim;
+    MacNubusBridge mac_nubus_bridge;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (18 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 12:53 ` [PATCH v2 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
                   ` (2 subsequent siblings)
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Instead use the qdev_get_child_bus() function which is intended for this exact
purpose.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index d02a1a7a1f..946cb09e30 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -445,7 +445,7 @@ static void q800_machine_init(MachineState *machine)
                           qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
-    nubus = &NUBUS_BRIDGE(dev)->bus;
+    nubus = NUBUS_BUS(qdev_get_child_bus(dev, "nubus-bus.0"));
 
     /* framebuffer in nubus slot #9 */
 
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 21/23] q800: move macfb device to Q800MachineState
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (19 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 13:55   ` Philippe Mathieu-Daudé
  2023-05-31 12:53 ` [PATCH v2 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
  2023-05-31 12:54 ` [PATCH v2 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland
  22 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the macfb device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 946cb09e30..0e7451e77a 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -449,7 +449,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* framebuffer in nubus slot #9 */
 
-    dev = qdev_new(TYPE_NUBUS_MACFB);
+    object_initialize_child(OBJECT(machine), "macfb", &m->macfb,
+                            TYPE_NUBUS_MACFB);
+    dev = DEVICE(&m->macfb);
     qdev_prop_set_uint32(dev, "slot", 9);
     qdev_prop_set_uint32(dev, "width", graphic_width);
     qdev_prop_set_uint32(dev, "height", graphic_height);
@@ -459,7 +461,7 @@ static void q800_machine_init(MachineState *machine)
     } else {
         qdev_prop_set_uint8(dev, "display", MACFB_DISPLAY_VGA);
     }
-    qdev_realize_and_unref(dev, BUS(nubus), &error_fatal);
+    qdev_realize(dev, BUS(nubus), &error_fatal);
 
     macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 3f3e87b3dc..48d2443d74 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -31,6 +31,7 @@
 #include "hw/scsi/esp.h"
 #include "hw/block/swim.h"
 #include "hw/nubus/mac-nubus-bridge.h"
+#include "hw/display/macfb.h"
 
 /*
  * The main Q800 machine
@@ -50,6 +51,7 @@ struct Q800MachineState {
     SysBusESPState esp;
     Swim swim;
     MacNubusBridge mac_nubus_bridge;
+    MacfbNubusState macfb;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (20 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 12:53 ` Mark Cave-Ayland
  2023-05-31 12:54 ` [PATCH v2 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:53 UTC (permalink / raw)
  To: laurent, qemu-devel

A comparison between the rtc command table included in the comment and the code
itself shows that the decoding for PRAM addresses 0x0 to 0xf is being done on
the raw command, and not the shifted version held in value.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/misc/mac_via.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 076d18e5fd..85c2e65856 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -399,7 +399,7 @@ static int via1_rtc_compact_cmd(uint8_t value)
         } else if ((value & 0x1c) == 0x08) {
             /* RAM address 0x10 to 0x13 */
             return read | (REG_PRAM_ADDR + 0x10 + (value & 0x03));
-        } else if ((value & 0x43) == 0x41) {
+        } else if ((value & 0x10) == 0x10) {
             /* RAM address 0x00 to 0x0f */
             return read | (REG_PRAM_ADDR + (value & 0x0f));
         }
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* [PATCH v2 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers
  2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (21 preceding siblings ...)
  2023-05-31 12:53 ` [PATCH v2 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
@ 2023-05-31 12:54 ` Mark Cave-Ayland
  22 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-05-31 12:54 UTC (permalink / raw)
  To: laurent, qemu-devel

Analysis of the MacOS toolbox ROM code shows that on startup it attempts 2
separate reads of the seconds registers with commands 0x9d...0x91 followed by
0x8d..0x81 without resetting the command to its initial value. The PRAM seconds
value is only accepted when the values of the 2 separate reads match.

From this we conclude that bit 4 of the rtc command is not decoded or we don't
care about its value when reading the PRAM seconds registers. Implement this
decoding change so that both reads return successfully which allows the MacOS
toolbox ROM to correctly set the date/time.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/misc/mac_via.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 85c2e65856..0787a0268d 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -362,10 +362,10 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
  *
  * Command byte    Register addressed by the command
  *
- * z0000001        Seconds register 0 (lowest-order byte)
- * z0000101        Seconds register 1
- * z0001001        Seconds register 2
- * z0001101        Seconds register 3 (highest-order byte)
+ * z00x0001        Seconds register 0 (lowest-order byte)
+ * z00x0101        Seconds register 1
+ * z00x1001        Seconds register 2
+ * z00x1101        Seconds register 3 (highest-order byte)
  * 00110001        Test register (write-only)
  * 00110101        Write-Protect Register (write-only)
  * z010aa01        RAM address 100aa ($10-$13) (first 20 bytes only)
@@ -373,6 +373,7 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
  * z0111aaa        Extended memory designator and sector number
  *
  * For a read request, z=1, for a write z=0
+ * The letter x indicates don't care
  * The letter a indicates bits whose value depend on what parameter
  * RAM byte you want to address
  */
@@ -389,7 +390,7 @@ static int via1_rtc_compact_cmd(uint8_t value)
     }
     if ((value & 0x03) == 0x01) {
         value >>= 2;
-        if ((value & 0x1c) == 0) {
+        if ((value & 0x18) == 0) {
             /* seconds registers */
             return read | (REG_0 + (value & 0x03));
         } else if ((value == 0x0c) && !read) {
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 02/23] q800: add missing space after parent object in GLUEState
  2023-05-31 12:53 ` [PATCH v2 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
@ 2023-05-31 13:35   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:35 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> This brings GLUEState in line with our current QOM guidelines.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c | 1 +
>   1 file changed, 1 insertion(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>




^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 03/23] q800: introduce Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:37   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:37 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> This provides an overall container and owner for Machine-related objects such
> as MemoryRegions.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   MAINTAINERS            |  1 +
>   hw/m68k/q800.c         |  2 ++
>   include/hw/m68k/q800.h | 37 +++++++++++++++++++++++++++++++++++++
>   3 files changed, 40 insertions(+)
>   create mode 100644 include/hw/m68k/q800.h
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 4b025a7b63..51e62efe1b 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1234,6 +1234,7 @@ F: include/hw/misc/mac_via.h
>   F: include/hw/nubus/*
>   F: include/hw/display/macfb.h
>   F: include/hw/block/swim.h
> +F: include/hw/m68k/q800.h
>   
>   virt
>   M: Laurent Vivier <laurent@vivier.eu>
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index bb9e857632..93a3f96991 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -38,6 +38,7 @@
>   #include "standard-headers/asm-m68k/bootinfo.h"
>   #include "standard-headers/asm-m68k/bootinfo-mac.h"
>   #include "bootinfo.h"
> +#include "hw/m68k/q800.h"
>   #include "hw/misc/mac_via.h"
>   #include "hw/input/adb.h"
>   #include "hw/nubus/mac-nubus-bridge.h"
> @@ -749,6 +750,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
>   static const TypeInfo q800_machine_typeinfo = {
>       .name       = MACHINE_TYPE_NAME("q800"),
>       .parent     = TYPE_MACHINE,
> +    .instance_size = sizeof(Q800MachineState),
>       .class_init = q800_machine_class_init,
>   };
>   
> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> new file mode 100644
> index 0000000000..76ea6560b2
> --- /dev/null
> +++ b/include/hw/m68k/q800.h
> @@ -0,0 +1,37 @@
> +/*
> + * QEMU Motorla 680x0 Macintosh hardware System Emulator
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#ifndef HW_Q800_H
> +#define HW_Q800_H
> +
> +/*
> + * The main Q800 machine
> + */
> +
> +struct Q800MachineState {
> +    MachineState parent_obj;

Declared in "hw/boards.h",

> +};
> +
> +#define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
> +OBJECT_DECLARE_SIMPLE_TYPE(Q800MachineState, Q800_MACHINE)

defined in "qom/object.h".

> +#endif

With the 2 missing includes:
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init()
  2023-05-31 12:53 ` [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
@ 2023-05-31 13:37   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:37 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> This will enable us later to distinguish between QOM initialisation and machine
> initialisation.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>




^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:40   ` Philippe Mathieu-Daudé
  2023-05-31 15:00     ` Markus Armbruster
       [not found]   ` <edd9f126-526e-ee57-767b-a1d307008a4d@linaro.org>
  1 sibling, 1 reply; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:40 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel; +Cc: Markus Armbruster

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the CPU to use object_initialize_child()
> followed by a separate realisation.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 13 ++++++++-----
>   include/hw/m68k/q800.h |  2 ++
>   2 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 3730b30dd1..c34b2548ca 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>   
>   static void q800_machine_init(MachineState *machine)
>   {
> -    M68kCPU *cpu = NULL;
> +    Q800MachineState *m = Q800_MACHINE(machine);
>       int linux_boot;
>       int32_t kernel_size;
>       uint64_t elf_entry;
> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>       }
>   
>       /* init CPUs */
> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
> -    qemu_register_reset(main_cpu_reset, cpu);
> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
> +                            M68K_CPU_TYPE_NAME("m68040"));
> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);

CPUs are QDev-based, shouldn't we use qdev_realize()?

> +    qemu_register_reset(main_cpu_reset, &m->cpu);
>   
>       /* RAM */
>       memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> @@ -430,7 +432,8 @@ static void q800_machine_init(MachineState *machine)
>   
>       /* IRQ Glue */
>       glue = qdev_new(TYPE_GLUE);
> -    object_property_set_link(OBJECT(glue), "cpu", OBJECT(cpu), &error_abort);
> +    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
> +                             &error_abort);
>       sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
>   
>       /* VIA 1 */
> @@ -605,7 +608,7 @@ static void q800_machine_init(MachineState *machine)
>   
>       macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
>   
> -    cs = CPU(cpu);
> +    cs = CPU(&m->cpu);
>       if (linux_boot) {
>           uint64_t high;
>           void *param_blob, *param_ptr, *param_rng_seed;
> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> index 76ea6560b2..0f54f1c2cf 100644
> --- a/include/hw/m68k/q800.h
> +++ b/include/hw/m68k/q800.h
> @@ -29,6 +29,8 @@
>   
>   struct Q800MachineState {
>       MachineState parent_obj;
> +
> +    M68kCPU cpu;

Declared in "target/m68k/cpu-qom.h" (missing #include).

>   };
>   
>   #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:42   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:42 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 13 +++++--------
>   include/hw/m68k/q800.h |  1 +
>   2 files changed, 6 insertions(+), 8 deletions(-)


> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> index 0f54f1c2cf..3e41f0e297 100644
> --- a/include/hw/m68k/q800.h
> +++ b/include/hw/m68k/q800.h
> @@ -31,6 +31,7 @@ struct Q800MachineState {
>       MachineState parent_obj;
>   
>       M68kCPU cpu;
> +    MemoryRegion rom;

Declared in "exec/memory.h" (missing #include), otherwise:

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

>   };
>   
>   #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 08/23] q800: move GLUE device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:43   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:43 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the GLUE device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 24 ++++++++++++++----------
>   include/hw/m68k/q800.h |  3 +++
>   2 files changed, 17 insertions(+), 10 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:45   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:45 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the VIA1 device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 16 +++++++++-------
>   include/hw/m68k/q800.h |  2 ++
>   2 files changed, 11 insertions(+), 7 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 12/23] q800: move VIA2 device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 12/23] q800: move VIA2 " Mark Cave-Ayland
@ 2023-05-31 13:47   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:47 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the VIA2 device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 27 ++++++++++++++++-----------
>   include/hw/m68k/q800.h |  1 +
>   2 files changed, 17 insertions(+), 11 deletions(-)

Thanks for splitting in 2.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-05-31 12:53 ` [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
@ 2023-05-31 13:49   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:49 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel; +Cc: Jason Wang

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> This is to enable them to be used outside of dp8393x.c.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> CC: Jason Wang <jasowang@redhat.com>
> ---
>   hw/net/dp8393x.c         | 32 +--------------------
>   include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 61 insertions(+), 31 deletions(-)
>   create mode 100644 include/hw/net/dp8393x.h
> 
> diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> index 45b954e46c..a596f7fbc6 100644
> --- a/hw/net/dp8393x.c
> +++ b/hw/net/dp8393x.c
> @@ -20,6 +20,7 @@
>   #include "qemu/osdep.h"
>   #include "hw/irq.h"
>   #include "hw/qdev-properties.h"
> +#include "hw/net/dp8393x.h"
>   #include "hw/sysbus.h"
>   #include "migration/vmstate.h"
>   #include "net/net.h"
> @@ -85,7 +86,6 @@ static const char *reg_names[] = {
>   #define SONIC_MPT    0x2e
>   #define SONIC_MDT    0x2f
>   #define SONIC_DCR2   0x3f
> -#define SONIC_REG_COUNT  0x40
>   
>   #define SONIC_CR_HTX     0x0001
>   #define SONIC_CR_TXP     0x0002
> @@ -139,36 +139,6 @@ static const char *reg_names[] = {
>   #define SONIC_DESC_EOL   0x0001
>   #define SONIC_DESC_ADDR  0xFFFE
>   
> -#define TYPE_DP8393X "dp8393x"
> -OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> -
> -struct dp8393xState {
> -    SysBusDevice parent_obj;
> -
> -    /* Hardware */
> -    uint8_t it_shift;
> -    bool big_endian;
> -    bool last_rba_is_full;
> -    qemu_irq irq;
> -    int irq_level;
> -    QEMUTimer *watchdog;
> -    int64_t wt_last_update;
> -    NICConf conf;
> -    NICState *nic;
> -    MemoryRegion mmio;
> -
> -    /* Registers */
> -    uint16_t cam[16][3];
> -    uint16_t regs[SONIC_REG_COUNT];
> -
> -    /* Temporaries */
> -    uint8_t tx_buffer[0x10000];
> -    int loopback_packet;
> -
> -    /* Memory access */
> -    MemoryRegion *dma_mr;
> -    AddressSpace as;
> -};
>   
>   /*
>    * Accessor functions for values which are formed by
> diff --git a/include/hw/net/dp8393x.h b/include/hw/net/dp8393x.h
> new file mode 100644
> index 0000000000..bb5f0ced5a
> --- /dev/null
> +++ b/include/hw/net/dp8393x.h
> @@ -0,0 +1,60 @@
> +/*
> + * QEMU NS SONIC DP8393x netcard
> + *
> + * Copyright (c) 2008-2009 Herve Poussineau
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef HW_NET_DP8393X_H
> +#define HW_NET_DP8393X_H
> +
> +#include "qemu/osdep.h"

No "osdep.h" in headers please (anti-pattern).

> +#include "hw/sysbus.h"
> +#include "net/net.h"
> +
> +#define SONIC_REG_COUNT  0x40
> +
> +#define TYPE_DP8393X "dp8393x"
> +OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> +
> +struct dp8393xState {
> +    SysBusDevice parent_obj;
> +
> +    /* Hardware */
> +    uint8_t it_shift;
> +    bool big_endian;
> +    bool last_rba_is_full;
> +    qemu_irq irq;
> +    int irq_level;
> +    QEMUTimer *watchdog;
> +    int64_t wt_last_update;
> +    NICConf conf;
> +    NICState *nic;
> +    MemoryRegion mmio;
> +
> +    /* Registers */
> +    uint16_t cam[16][3];
> +    uint16_t regs[SONIC_REG_COUNT];
> +
> +    /* Temporaries */
> +    uint8_t tx_buffer[0x10000];
> +    int loopback_packet;
> +
> +    /* Memory access */
> +    MemoryRegion *dma_mr;
> +    AddressSpace as;

Missing "exec/memory.h" #include.

> +};
> +
> +#endif



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:49   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:49 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel; +Cc: Jason Wang

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the dp8393x device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> CC: Jason Wang <jasowang@redhat.com>
> ---
>   hw/m68k/q800.c         | 6 ++++--
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 6 insertions(+), 2 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 15/23] q800: move ESCC device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 15/23] q800: move ESCC " Mark Cave-Ayland
@ 2023-05-31 13:49   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:49 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the ESCC device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 6 ++++--
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 6 insertions(+), 2 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 16/23] q800: move escc_orgate device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 16/23] q800: move escc_orgate " Mark Cave-Ayland
@ 2023-05-31 13:50   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:50 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the escc_orgate device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 16 +++++++++-------
>   include/hw/m68k/q800.h |  2 ++
>   2 files changed, 11 insertions(+), 7 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 17/23] q800: move ESP device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 17/23] q800: move ESP " Mark Cave-Ayland
@ 2023-05-31 13:51   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:51 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the ESP device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 9 +++++----
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 7 insertions(+), 4 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 18/23] q800: move SWIM device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 18/23] q800: move SWIM " Mark Cave-Ayland
@ 2023-05-31 13:51   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:51 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the SWIM device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 8 +++++---
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 7 insertions(+), 3 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
@ 2023-05-31 13:52   ` Philippe Mathieu-Daudé
  2023-06-03 20:22     ` Mark Cave-Ayland
  0 siblings, 1 reply; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:52 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the mac-nubus-bridge device to use
> object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 5 ++++-
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index f85ccf83af..d02a1a7a1f 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -416,7 +416,10 @@ static void q800_machine_init(MachineState *machine)
>   
>       /* NuBus */
>   
> -    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
> +    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
> +                            &m->mac_nubus_bridge,
> +                            TYPE_MAC_NUBUS_BRIDGE);
> +    dev = DEVICE(&m->mac_nubus_bridge);
>       qdev_prop_set_uint32(dev, "slot-available-mask",
>                            Q800_NUBUS_SLOTS_AVAILABLE);
>       sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);

No need to unref(), right?

> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> index ce8dbcd68f..3f3e87b3dc 100644
> --- a/include/hw/m68k/q800.h
> +++ b/include/hw/m68k/q800.h
> @@ -30,6 +30,7 @@
>   #include "hw/or-irq.h"
>   #include "hw/scsi/esp.h"
>   #include "hw/block/swim.h"
> +#include "hw/nubus/mac-nubus-bridge.h"
>   
>   /*
>    * The main Q800 machine
> @@ -48,6 +49,7 @@ struct Q800MachineState {
>       OrIRQState escc_orgate;
>       SysBusESPState esp;
>       Swim swim;
> +    MacNubusBridge mac_nubus_bridge;
>       MemoryRegion macio;
>       MemoryRegion macio_alias;
>   };



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 21/23] q800: move macfb device to Q800MachineState
  2023-05-31 12:53 ` [PATCH v2 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
@ 2023-05-31 13:55   ` Philippe Mathieu-Daudé
  2023-06-03 20:32     ` Mark Cave-Ayland
  0 siblings, 1 reply; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:55 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Also change the instantiation of the macfb device to use object_initialize_child().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 6 ++++--
>   include/hw/m68k/q800.h | 2 ++
>   2 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 946cb09e30..0e7451e77a 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -449,7 +449,9 @@ static void q800_machine_init(MachineState *machine)
>   
>       /* framebuffer in nubus slot #9 */
>   
> -    dev = qdev_new(TYPE_NUBUS_MACFB);
> +    object_initialize_child(OBJECT(machine), "macfb", &m->macfb,

Alternatively "framebuffer" or "fb". Regardless,

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

> +                            TYPE_NUBUS_MACFB);



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array
  2023-05-31 12:53 ` [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
@ 2023-05-31 13:56   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 50+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 13:56 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 31/5/23 14:53, Mark Cave-Ayland wrote:
> Ensure there is a space before the final closing brace for all global
> properties.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c | 10 +++++-----
>   1 file changed, 5 insertions(+), 5 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-05-31 13:40   ` Philippe Mathieu-Daudé
@ 2023-05-31 15:00     ` Markus Armbruster
  2023-06-01  8:00       ` Mark Cave-Ayland
  0 siblings, 1 reply; 50+ messages in thread
From: Markus Armbruster @ 2023-05-31 15:00 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: Mark Cave-Ayland, laurent, qemu-devel

Philippe Mathieu-Daudé <philmd@linaro.org> writes:

> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>> Also change the instantiation of the CPU to use object_initialize_child()
>> followed by a separate realisation.
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/m68k/q800.c         | 13 ++++++++-----
>>   include/hw/m68k/q800.h |  2 ++
>>   2 files changed, 10 insertions(+), 5 deletions(-)
>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>> index 3730b30dd1..c34b2548ca 100644
>> --- a/hw/m68k/q800.c
>> +++ b/hw/m68k/q800.c
>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>     static void q800_machine_init(MachineState *machine)
>>   {
>> -    M68kCPU *cpu = NULL;
>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>       int linux_boot;
>>       int32_t kernel_size;
>>       uint64_t elf_entry;
>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>       }
>>         /* init CPUs */
>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>> -    qemu_register_reset(main_cpu_reset, cpu);
>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>> +                            M68K_CPU_TYPE_NAME("m68040"));
>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>
> CPUs are QDev-based, shouldn't we use qdev_realize()?

Yes, we should.

[...]



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-05-31 15:00     ` Markus Armbruster
@ 2023-06-01  8:00       ` Mark Cave-Ayland
  2023-06-01  9:00         ` Markus Armbruster
  0 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-01  8:00 UTC (permalink / raw)
  To: Markus Armbruster, Philippe Mathieu-Daudé; +Cc: laurent, qemu-devel

On 31/05/2023 16:00, Markus Armbruster wrote:

> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> 
>> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>>> Also change the instantiation of the CPU to use object_initialize_child()
>>> followed by a separate realisation.
>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>> ---
>>>    hw/m68k/q800.c         | 13 ++++++++-----
>>>    include/hw/m68k/q800.h |  2 ++
>>>    2 files changed, 10 insertions(+), 5 deletions(-)
>>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>>> index 3730b30dd1..c34b2548ca 100644
>>> --- a/hw/m68k/q800.c
>>> +++ b/hw/m68k/q800.c
>>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>>      static void q800_machine_init(MachineState *machine)
>>>    {
>>> -    M68kCPU *cpu = NULL;
>>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>>        int linux_boot;
>>>        int32_t kernel_size;
>>>        uint64_t elf_entry;
>>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>>        }
>>>          /* init CPUs */
>>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>>> -    qemu_register_reset(main_cpu_reset, cpu);
>>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>>> +                            M68K_CPU_TYPE_NAME("m68040"));
>>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>>
>> CPUs are QDev-based, shouldn't we use qdev_realize()?
> 
> Yes, we should.
> 
> [...]

Interesting. I remember thinking that CPUs were different, so I'm fairly sure I 
borrowed this from some similar code in hw/arm :)

Shouldn't the above be directly equivalent to qdev_realize(dev, NULL, &error_fatal) 
given that the CPU doesn't connect to a bus?


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-06-01  8:00       ` Mark Cave-Ayland
@ 2023-06-01  9:00         ` Markus Armbruster
  2023-06-03 20:42           ` Mark Cave-Ayland
  0 siblings, 1 reply; 50+ messages in thread
From: Markus Armbruster @ 2023-06-01  9:00 UTC (permalink / raw)
  To: Mark Cave-Ayland; +Cc: Philippe Mathieu-Daudé, laurent, qemu-devel

Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:

> On 31/05/2023 16:00, Markus Armbruster wrote:
>
>> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>> 
>>> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>>>> Also change the instantiation of the CPU to use object_initialize_child()
>>>> followed by a separate realisation.
>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>> ---
>>>>    hw/m68k/q800.c         | 13 ++++++++-----
>>>>    include/hw/m68k/q800.h |  2 ++
>>>>    2 files changed, 10 insertions(+), 5 deletions(-)
>>>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>>>> index 3730b30dd1..c34b2548ca 100644
>>>> --- a/hw/m68k/q800.c
>>>> +++ b/hw/m68k/q800.c
>>>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>>>      static void q800_machine_init(MachineState *machine)
>>>>    {
>>>> -    M68kCPU *cpu = NULL;
>>>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>>>        int linux_boot;
>>>>        int32_t kernel_size;
>>>>        uint64_t elf_entry;
>>>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>>>        }
>>>>          /* init CPUs */
>>>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>>>> -    qemu_register_reset(main_cpu_reset, cpu);
>>>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>>>> +                            M68K_CPU_TYPE_NAME("m68040"));
>>>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>>>
>>> CPUs are QDev-based, shouldn't we use qdev_realize()?
>>
>> Yes, we should.
>> [...]
>
> Interesting. I remember thinking that CPUs were different, so I'm fairly sure I borrowed this from some similar code in hw/arm :)
>
> Shouldn't the above be directly equivalent to qdev_realize(dev, NULL, &error_fatal) given that the CPU doesn't connect to a bus?

It's been a while since I worked on this...

Commit ce189ab230b (qdev: Convert bus-less devices to qdev_realize()
with Coccinelle) looks like you're right.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-05-31 13:52   ` Philippe Mathieu-Daudé
@ 2023-06-03 20:22     ` Mark Cave-Ayland
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-03 20:22 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, laurent, qemu-devel

On 31/05/2023 14:52, Philippe Mathieu-Daudé wrote:

> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>> Also change the instantiation of the mac-nubus-bridge device to use
>> object_initialize_child().
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/m68k/q800.c         | 5 ++++-
>>   include/hw/m68k/q800.h | 2 ++
>>   2 files changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>> index f85ccf83af..d02a1a7a1f 100644
>> --- a/hw/m68k/q800.c
>> +++ b/hw/m68k/q800.c
>> @@ -416,7 +416,10 @@ static void q800_machine_init(MachineState *machine)
>>       /* NuBus */
>> -    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
>> +    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
>> +                            &m->mac_nubus_bridge,
>> +                            TYPE_MAC_NUBUS_BRIDGE);
>> +    dev = DEVICE(&m->mac_nubus_bridge);
>>       qdev_prop_set_uint32(dev, "slot-available-mask",
>>                            Q800_NUBUS_SLOTS_AVAILABLE);
>>       sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> 
> No need to unref(), right?

Ooops yes indeed, I forgot to remove the and_unref().

>> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
>> index ce8dbcd68f..3f3e87b3dc 100644
>> --- a/include/hw/m68k/q800.h
>> +++ b/include/hw/m68k/q800.h
>> @@ -30,6 +30,7 @@
>>   #include "hw/or-irq.h"
>>   #include "hw/scsi/esp.h"
>>   #include "hw/block/swim.h"
>> +#include "hw/nubus/mac-nubus-bridge.h"
>>   /*
>>    * The main Q800 machine
>> @@ -48,6 +49,7 @@ struct Q800MachineState {
>>       OrIRQState escc_orgate;
>>       SysBusESPState esp;
>>       Swim swim;
>> +    MacNubusBridge mac_nubus_bridge;
>>       MemoryRegion macio;
>>       MemoryRegion macio_alias;
>>   };


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 21/23] q800: move macfb device to Q800MachineState
  2023-05-31 13:55   ` Philippe Mathieu-Daudé
@ 2023-06-03 20:32     ` Mark Cave-Ayland
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-03 20:32 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, laurent, qemu-devel

On 31/05/2023 14:55, Philippe Mathieu-Daudé wrote:

> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>> Also change the instantiation of the macfb device to use object_initialize_child().
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/m68k/q800.c         | 6 ++++--
>>   include/hw/m68k/q800.h | 2 ++
>>   2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>> index 946cb09e30..0e7451e77a 100644
>> --- a/hw/m68k/q800.c
>> +++ b/hw/m68k/q800.c
>> @@ -449,7 +449,9 @@ static void q800_machine_init(MachineState *machine)
>>       /* framebuffer in nubus slot #9 */
>> -    dev = qdev_new(TYPE_NUBUS_MACFB);
>> +    object_initialize_child(OBJECT(machine), "macfb", &m->macfb,
> 
> Alternatively "framebuffer" or "fb". Regardless,

I'd prefer to keep this as macfb if possible, simply because it matches the 
convention of using the device type as the basis for the object child property name 
throughout the series.

> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> 
>> +                            TYPE_NUBUS_MACFB);


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
       [not found]   ` <edd9f126-526e-ee57-767b-a1d307008a4d@linaro.org>
@ 2023-06-03 20:36     ` Mark Cave-Ayland
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-03 20:36 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, laurent, qemu-devel

On 31/05/2023 18:43, Philippe Mathieu-Daudé wrote:

> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>> Also change the instantiation of the CPU to use object_initialize_child()
>> followed by a separate realisation.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/m68k/q800.c         | 13 ++++++++-----
>>   include/hw/m68k/q800.h |  2 ++
>>   2 files changed, 10 insertions(+), 5 deletions(-)
> 
> 
>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>       }
>>       /* init CPUs */
>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>> -    qemu_register_reset(main_cpu_reset, cpu);
>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>> +                            M68K_CPU_TYPE_NAME("m68040"));
> 
> Shouldn't we keep using machine->cpu_type?
> 
> If the m68040 is the single CPU usable, we should set
> MachineClass::valid_cpu_types[] in q800_machine_class_init().
> 
>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>> +    qemu_register_reset(main_cpu_reset, &m->cpu);

Yes I can do that: I don't think it makes any difference to the q800 machine here 
because the MacOS toolbox ROM doesn't appear to boot with anything other than a 68040 
CPU, but it could be useful to make this explicit.


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-06-01  9:00         ` Markus Armbruster
@ 2023-06-03 20:42           ` Mark Cave-Ayland
  2023-06-13 11:50             ` Markus Armbruster
  0 siblings, 1 reply; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-03 20:42 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Philippe Mathieu-Daudé, laurent, qemu-devel

On 01/06/2023 10:00, Markus Armbruster wrote:

> Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:
> 
>> On 31/05/2023 16:00, Markus Armbruster wrote:
>>
>>> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>>>
>>>> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>>>>> Also change the instantiation of the CPU to use object_initialize_child()
>>>>> followed by a separate realisation.
>>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>>> ---
>>>>>     hw/m68k/q800.c         | 13 ++++++++-----
>>>>>     include/hw/m68k/q800.h |  2 ++
>>>>>     2 files changed, 10 insertions(+), 5 deletions(-)
>>>>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>>>>> index 3730b30dd1..c34b2548ca 100644
>>>>> --- a/hw/m68k/q800.c
>>>>> +++ b/hw/m68k/q800.c
>>>>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>>>>       static void q800_machine_init(MachineState *machine)
>>>>>     {
>>>>> -    M68kCPU *cpu = NULL;
>>>>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>>>>         int linux_boot;
>>>>>         int32_t kernel_size;
>>>>>         uint64_t elf_entry;
>>>>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>>>>         }
>>>>>           /* init CPUs */
>>>>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>>>>> -    qemu_register_reset(main_cpu_reset, cpu);
>>>>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>>>>> +                            M68K_CPU_TYPE_NAME("m68040"));
>>>>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>>>>
>>>> CPUs are QDev-based, shouldn't we use qdev_realize()?
>>>
>>> Yes, we should.
>>> [...]
>>
>> Interesting. I remember thinking that CPUs were different, so I'm fairly sure I borrowed this from some similar code in hw/arm :)
>>
>> Shouldn't the above be directly equivalent to qdev_realize(dev, NULL, &error_fatal) given that the CPU doesn't connect to a bus?
> 
> It's been a while since I worked on this...
> 
> Commit ce189ab230b (qdev: Convert bus-less devices to qdev_realize()
> with Coccinelle) looks like you're right.

Thanks for the confirmation! Given that this matches existing code that doesn't use 
cpu_create(), I'm inclined to keep this as-is to avoid creating another pattern for 
instantiating CPUs.


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-06-03 20:42           ` Mark Cave-Ayland
@ 2023-06-13 11:50             ` Markus Armbruster
  2023-06-19 12:28               ` Mark Cave-Ayland
  0 siblings, 1 reply; 50+ messages in thread
From: Markus Armbruster @ 2023-06-13 11:50 UTC (permalink / raw)
  To: Mark Cave-Ayland; +Cc: Philippe Mathieu-Daudé, laurent, qemu-devel

Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:

> On 01/06/2023 10:00, Markus Armbruster wrote:
>
>> Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:
>> 
>>> On 31/05/2023 16:00, Markus Armbruster wrote:
>>>
>>>> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>>>>
>>>>> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>>>>>> Also change the instantiation of the CPU to use object_initialize_child()
>>>>>> followed by a separate realisation.
>>>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>>>> ---
>>>>>>     hw/m68k/q800.c         | 13 ++++++++-----
>>>>>>     include/hw/m68k/q800.h |  2 ++
>>>>>>     2 files changed, 10 insertions(+), 5 deletions(-)
>>>>>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>>>>>> index 3730b30dd1..c34b2548ca 100644
>>>>>> --- a/hw/m68k/q800.c
>>>>>> +++ b/hw/m68k/q800.c
>>>>>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>>>>>       static void q800_machine_init(MachineState *machine)
>>>>>>     {
>>>>>> -    M68kCPU *cpu = NULL;
>>>>>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>>>>>         int linux_boot;
>>>>>>         int32_t kernel_size;
>>>>>>         uint64_t elf_entry;
>>>>>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>>>>>         }
>>>>>>           /* init CPUs */
>>>>>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>>>>>> -    qemu_register_reset(main_cpu_reset, cpu);
>>>>>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>>>>>> +                            M68K_CPU_TYPE_NAME("m68040"));
>>>>>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>>>>>
>>>>> CPUs are QDev-based, shouldn't we use qdev_realize()?
>>>>
>>>> Yes, we should.
>>>> [...]
>>>
>>> Interesting. I remember thinking that CPUs were different, so I'm fairly sure I borrowed this from some similar code in hw/arm :)
>>>
>>> Shouldn't the above be directly equivalent to qdev_realize(dev, NULL, &error_fatal) given that the CPU doesn't connect to a bus?
>>
>> It's been a while since I worked on this...
>>
>> Commit ce189ab230b (qdev: Convert bus-less devices to qdev_realize()
>> with Coccinelle) looks like you're right.
>
> Thanks for the confirmation! Given that this matches existing code that doesn't use cpu_create(), I'm inclined to keep this as-is to avoid creating another pattern for instantiating CPUs.

Wherever you *can* use qdev_realize(), you should.  The less we access
property "realized" outside qdev core, the better.

I few accesses have crept in since I converted the tree to
qdev_realize() & friends.  Another conversion pass would be in order.



^ permalink raw reply	[flat|nested] 50+ messages in thread

* Re: [PATCH v2 05/23] q800: move CPU object into Q800MachineState
  2023-06-13 11:50             ` Markus Armbruster
@ 2023-06-19 12:28               ` Mark Cave-Ayland
  0 siblings, 0 replies; 50+ messages in thread
From: Mark Cave-Ayland @ 2023-06-19 12:28 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Philippe Mathieu-Daudé, laurent, qemu-devel

On 13/06/2023 12:50, Markus Armbruster wrote:

> Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:
> 
>> On 01/06/2023 10:00, Markus Armbruster wrote:
>>
>>> Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> writes:
>>>
>>>> On 31/05/2023 16:00, Markus Armbruster wrote:
>>>>
>>>>> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>>>>>
>>>>>> On 31/5/23 14:53, Mark Cave-Ayland wrote:
>>>>>>> Also change the instantiation of the CPU to use object_initialize_child()
>>>>>>> followed by a separate realisation.
>>>>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>>>>>> ---
>>>>>>>      hw/m68k/q800.c         | 13 ++++++++-----
>>>>>>>      include/hw/m68k/q800.h |  2 ++
>>>>>>>      2 files changed, 10 insertions(+), 5 deletions(-)
>>>>>>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>>>>>>> index 3730b30dd1..c34b2548ca 100644
>>>>>>> --- a/hw/m68k/q800.c
>>>>>>> +++ b/hw/m68k/q800.c
>>>>>>> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>>>>>>>        static void q800_machine_init(MachineState *machine)
>>>>>>>      {
>>>>>>> -    M68kCPU *cpu = NULL;
>>>>>>> +    Q800MachineState *m = Q800_MACHINE(machine);
>>>>>>>          int linux_boot;
>>>>>>>          int32_t kernel_size;
>>>>>>>          uint64_t elf_entry;
>>>>>>> @@ -407,8 +407,10 @@ static void q800_machine_init(MachineState *machine)
>>>>>>>          }
>>>>>>>            /* init CPUs */
>>>>>>> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
>>>>>>> -    qemu_register_reset(main_cpu_reset, cpu);
>>>>>>> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu,
>>>>>>> +                            M68K_CPU_TYPE_NAME("m68040"));
>>>>>>> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
>>>>>>
>>>>>> CPUs are QDev-based, shouldn't we use qdev_realize()?
>>>>>
>>>>> Yes, we should.
>>>>> [...]
>>>>
>>>> Interesting. I remember thinking that CPUs were different, so I'm fairly sure I borrowed this from some similar code in hw/arm :)
>>>>
>>>> Shouldn't the above be directly equivalent to qdev_realize(dev, NULL, &error_fatal) given that the CPU doesn't connect to a bus?
>>>
>>> It's been a while since I worked on this...
>>>
>>> Commit ce189ab230b (qdev: Convert bus-less devices to qdev_realize()
>>> with Coccinelle) looks like you're right.
>>
>> Thanks for the confirmation! Given that this matches existing code that doesn't use cpu_create(), I'm inclined to keep this as-is to avoid creating another pattern for instantiating CPUs.
> 
> Wherever you *can* use qdev_realize(), you should.  The less we access
> property "realized" outside qdev core, the better.

No worries, in that case I will switch it to use qdev_realize() in v4.

> I few accesses have crept in since I converted the tree to
> qdev_realize() & friends.  Another conversion pass would be in order.


ATB,

Mark.



^ permalink raw reply	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2023-06-19 12:29 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-31 12:53 [PATCH v2 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
2023-05-31 13:56   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
2023-05-31 13:35   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
2023-05-31 13:37   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
2023-05-31 13:37   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
2023-05-31 13:40   ` Philippe Mathieu-Daudé
2023-05-31 15:00     ` Markus Armbruster
2023-06-01  8:00       ` Mark Cave-Ayland
2023-06-01  9:00         ` Markus Armbruster
2023-06-03 20:42           ` Mark Cave-Ayland
2023-06-13 11:50             ` Markus Armbruster
2023-06-19 12:28               ` Mark Cave-Ayland
     [not found]   ` <edd9f126-526e-ee57-767b-a1d307008a4d@linaro.org>
2023-06-03 20:36     ` Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
2023-05-31 13:42   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
2023-05-31 13:43   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
2023-05-31 13:45   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 12/23] q800: move VIA2 " Mark Cave-Ayland
2023-05-31 13:47   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
2023-05-31 13:49   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
2023-05-31 13:49   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 15/23] q800: move ESCC " Mark Cave-Ayland
2023-05-31 13:49   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 16/23] q800: move escc_orgate " Mark Cave-Ayland
2023-05-31 13:50   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 17/23] q800: move ESP " Mark Cave-Ayland
2023-05-31 13:51   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 18/23] q800: move SWIM " Mark Cave-Ayland
2023-05-31 13:51   ` Philippe Mathieu-Daudé
2023-05-31 12:53 ` [PATCH v2 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
2023-05-31 13:52   ` Philippe Mathieu-Daudé
2023-06-03 20:22     ` Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
2023-05-31 13:55   ` Philippe Mathieu-Daudé
2023-06-03 20:32     ` Mark Cave-Ayland
2023-05-31 12:53 ` [PATCH v2 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
2023-05-31 12:54 ` [PATCH v2 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.