aboutsummaryrefslogtreecommitdiff
path: root/hw/m68k
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-01-02 13:01:50 +0100
committerLaurent Vivier <laurent@vivier.eu>2020-01-07 13:35:53 +0100
commite24e58e8acdee80ecd5ee8279d56df53b0232a26 (patch)
tree2465cce8f1c5b8bffce25e906bc1bf21fa57efe6 /hw/m68k
parenteb064db94ccd62f054019f41fb8be3f268463a13 (diff)
downloadqemu-e24e58e8acdee80ecd5ee8279d56df53b0232a26.zip
qemu-e24e58e8acdee80ecd5ee8279d56df53b0232a26.tar.gz
qemu-e24e58e8acdee80ecd5ee8279d56df53b0232a26.tar.bz2
q800: implement mac rom reset function for BIOS-less mode
On Linux, calling `reboot(RB_AUTOBOOT);` will result in arch/m68k/mac/misc.c's mac_reset function being called. That in turn looks at the rombase (or uses 0x40800000 is there's no rombase), adds 0xa, and jumps to that address. At the moment, there's nothing there, so the kernel just crashes when trying to reboot. So, this commit adds a very simple implementation at that location, which just writes to via2 to power down. We also correct the value of ROMBASE while we're at it. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20200102120150.281082-1-Jason@zx2c4.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'hw/m68k')
-rw-r--r--hw/m68k/q800.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 0c445c7..0e5a08f 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -47,7 +47,7 @@
#include "sysemu/runstate.h"
#include "sysemu/reset.h"
-#define MACROM_ADDR 0x40000000
+#define MACROM_ADDR 0x40800000
#define MACROM_SIZE 0x00100000
#define MACROM_FILENAME "MacROM.bin"
@@ -128,6 +128,27 @@ static void main_cpu_reset(void *opaque)
cpu->env.pc = ldl_phys(cs->as, 4);
}
+static uint8_t fake_mac_rom[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ /* offset: 0xa - mac_reset */
+
+ /* via2[vDirB] |= VIA2B_vPower */
+ 0x20, 0x7C, 0x50, 0xF0, 0x24, 0x00, /* moveal VIA2_BASE+vDirB,%a0 */
+ 0x10, 0x10, /* moveb %a0@,%d0 */
+ 0x00, 0x00, 0x00, 0x04, /* orib #4,%d0 */
+ 0x10, 0x80, /* moveb %d0,%a0@ */
+
+ /* via2[vBufB] &= ~VIA2B_vPower */
+ 0x20, 0x7C, 0x50, 0xF0, 0x20, 0x00, /* moveal VIA2_BASE+vBufB,%a0 */
+ 0x10, 0x10, /* moveb %a0@,%d0 */
+ 0x02, 0x00, 0xFF, 0xFB, /* andib #-5,%d0 */
+ 0x10, 0x80, /* moveb %d0,%a0@ */
+
+ /* while (true) ; */
+ 0x60, 0xFE /* bras [self] */
+};
+
static void q800_init(MachineState *machine)
{
M68kCPU *cpu = NULL;
@@ -346,6 +367,12 @@ static void q800_init(MachineState *machine)
(graphic_width * graphic_depth + 7) / 8);
BOOTINFO1(cs->as, parameters_base, BI_MAC_SCCBASE, SCC_BASE);
+ rom = g_malloc(sizeof(*rom));
+ memory_region_init_ram_ptr(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);
+
if (kernel_cmdline) {
BOOTINFOSTR(cs->as, parameters_base, BI_COMMAND_LINE,
kernel_cmdline);