[PATCH 13/30] q800: allow accesses to RAM area even if less memory is available

Mark Cave-Ayland posted 30 patches 1 year, 3 months ago
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>, Laurent Vivier <laurent@vivier.eu>, Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>
[PATCH 13/30] q800: allow accesses to RAM area even if less memory is available
Posted by Mark Cave-Ayland 1 year, 3 months ago
MacOS attempts a series of writes and reads over the entire RAM area in order
to determine the amount of RAM within the machine. Allow accesses to the
entire RAM area ignoring writes and always reading zero for areas where there
is no physical RAM installed to allow MacOS to detect the memory size without
faulting.

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

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 8310670ec2..d12aeaa20e 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -86,6 +86,9 @@
 
 #define MAC_CLOCK  3686418
 
+/* Size of whole RAM area */
+#define RAM_SIZE              0x40000000
+
 /*
  * Slot 0x9 is reserved for use by the in-built framebuffer whilst only
  * slots 0xc, 0xd and 0xe physically exist on the Quadra 800
@@ -452,6 +455,27 @@ static const MemoryRegionOps machine_id_ops = {
     },
 };
 
+static uint64_t ramio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    return 0x0;
+}
+
+static void ramio_write(void *opaque, hwaddr addr, uint64_t val,
+                        unsigned size)
+{
+    return;
+}
+
+static const MemoryRegionOps ramio_ops = {
+    .read = ramio_read,
+    .write = ramio_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);
@@ -497,7 +521,11 @@ static void q800_machine_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, m->cpu);
 
     /* RAM */
-    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
+    memory_region_init_io(&m->ramio, NULL, &ramio_ops, &m->ramio,
+                          "ram", RAM_SIZE);
+    memory_region_add_subregion(get_system_memory(), 0x0, &m->ramio);
+
+    memory_region_add_subregion(&m->ramio, 0, machine->ram);
 
     /*
      * Create container for all IO devices
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index e57aec849a..0602d07d3d 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -34,6 +34,7 @@ struct Q800MachineState {
     MemoryRegion rom;
     DeviceState *glue;
     DeviceState *djmemc;
+    MemoryRegion ramio;
 
     MemoryRegion macio;
     MemoryRegion macio_alias;
-- 
2.30.2
Re: [PATCH 13/30] q800: allow accesses to RAM area even if less memory is available
Posted by Laurent Vivier 1 year, 3 months ago
Le 24/05/2023 à 23:10, Mark Cave-Ayland a écrit :
> MacOS attempts a series of writes and reads over the entire RAM area in order
> to determine the amount of RAM within the machine. Allow accesses to the
> entire RAM area ignoring writes and always reading zero for areas where there
> is no physical RAM installed to allow MacOS to detect the memory size without
> faulting.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 30 +++++++++++++++++++++++++++++-
>   include/hw/m68k/q800.h |  1 +
>   2 files changed, 30 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 8310670ec2..d12aeaa20e 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -86,6 +86,9 @@
>   
>   #define MAC_CLOCK  3686418
>   
> +/* Size of whole RAM area */
> +#define RAM_SIZE              0x40000000
> +
>   /*
>    * Slot 0x9 is reserved for use by the in-built framebuffer whilst only
>    * slots 0xc, 0xd and 0xe physically exist on the Quadra 800
> @@ -452,6 +455,27 @@ static const MemoryRegionOps machine_id_ops = {
>       },
>   };
>   
> +static uint64_t ramio_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    return 0x0;
> +}
> +
> +static void ramio_write(void *opaque, hwaddr addr, uint64_t val,
> +                        unsigned size)
> +{
> +    return;
> +}
> +
> +static const MemoryRegionOps ramio_ops = {
> +    .read = ramio_read,
> +    .write = ramio_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);
> @@ -497,7 +521,11 @@ static void q800_machine_init(MachineState *machine)
>       qemu_register_reset(main_cpu_reset, m->cpu);
>   
>       /* RAM */
> -    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> +    memory_region_init_io(&m->ramio, NULL, &ramio_ops, &m->ramio,
> +                          "ram", RAM_SIZE);
> +    memory_region_add_subregion(get_system_memory(), 0x0, &m->ramio);
> +
> +    memory_region_add_subregion(&m->ramio, 0, machine->ram);
>   
>       /*
>        * Create container for all IO devices
> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> index e57aec849a..0602d07d3d 100644
> --- a/include/hw/m68k/q800.h
> +++ b/include/hw/m68k/q800.h
> @@ -34,6 +34,7 @@ struct Q800MachineState {
>       MemoryRegion rom;
>       DeviceState *glue;
>       DeviceState *djmemc;
> +    MemoryRegion ramio;
>   
>       MemoryRegion macio;
>       MemoryRegion macio_alias;

Reviewed-by: Laurent Vivier <laurent@vivier.eu>


Re: [PATCH 13/30] q800: allow accesses to RAM area even if less memory is available
Posted by Philippe Mathieu-Daudé 1 year, 3 months ago
On 24/5/23 23:10, Mark Cave-Ayland wrote:
> MacOS attempts a series of writes and reads over the entire RAM area in order
> to determine the amount of RAM within the machine. Allow accesses to the
> entire RAM area ignoring writes and always reading zero for areas where there
> is no physical RAM installed to allow MacOS to detect the memory size without
> faulting.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 30 +++++++++++++++++++++++++++++-
>   include/hw/m68k/q800.h |  1 +
>   2 files changed, 30 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 8310670ec2..d12aeaa20e 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -86,6 +86,9 @@
>   
>   #define MAC_CLOCK  3686418
>   
> +/* Size of whole RAM area */
> +#define RAM_SIZE              0x40000000
> +
>   /*
>    * Slot 0x9 is reserved for use by the in-built framebuffer whilst only
>    * slots 0xc, 0xd and 0xe physically exist on the Quadra 800
> @@ -452,6 +455,27 @@ static const MemoryRegionOps machine_id_ops = {
>       },
>   };
>   
> +static uint64_t ramio_read(void *opaque, hwaddr addr, unsigned size)
> +{

Similar to empty_slot_init().

Personally I like to follow firmware detection using trace events here.

Maybe s/ramio/ram/.

> +    return 0x0;
> +}


>   static void q800_machine_init(MachineState *machine)
>   {
>       Q800MachineState *m = Q800_MACHINE(machine);
> @@ -497,7 +521,11 @@ static void q800_machine_init(MachineState *machine)
>       qemu_register_reset(main_cpu_reset, m->cpu);
>   
>       /* RAM */
> -    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> +    memory_region_init_io(&m->ramio, NULL, &ramio_ops, &m->ramio,
> +                          "ram", RAM_SIZE);
> +    memory_region_add_subregion(get_system_memory(), 0x0, &m->ramio);
> +
> +    memory_region_add_subregion(&m->ramio, 0, machine->ram);

Yes!

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