[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2] q800: implement mac rom reset function for BIOS-less mode
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v2] q800: implement mac rom reset function for BIOS-less mode |
Date: |
Thu, 2 Jan 2020 15:13:54 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.3.1 |
Le 02/01/2020 à 13:01, Jason A. Donenfeld a écrit :
> 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 <address@hidden>
> ---
> hw/m68k/q800.c | 29 ++++++++++++++++++++++++++++-
> 1 file changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 4ca8678007..f03679e24c 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;
> @@ -340,6 +361,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);
>
Reviewed-by: Laurent Vivier <address@hidden>