Skip to content

Commit

Permalink
q800: allow accesses to RAM area even if less memory is available
Browse files Browse the repository at this point in the history
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>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-ID: <20231004083806.757242-7-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
  • Loading branch information
mcayland authored and vivier committed Oct 6, 2023
1 parent bdc2c77 commit 6997f26
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
30 changes: 29 additions & 1 deletion hw/m68k/q800.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -218,6 +221,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);
Expand Down Expand Up @@ -262,7 +286,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, OBJECT(machine), &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
Expand Down
1 change: 1 addition & 0 deletions include/hw/m68k/q800.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ struct Q800MachineState {
MacfbNubusState macfb;
DJMEMCState djmemc;
IOSBState iosb;
MemoryRegion ramio;
MemoryRegion macio;
MemoryRegion macio_alias;
MemoryRegion machine_id;
Expand Down

0 comments on commit 6997f26

Please sign in to comment.