We don't need to re-create the architectural reset behaviour now it is handled in the core m68k CPU reset code. We do however need to add support for direct kernel booting so we stash that value in env->direct_kernel_boot_pc and enhance m68k_cpu_reset_exit() to use it if set.
Signed-off-by: Alex Bennée <[email protected]> --- v2 - re-write to use proper 3-phase logic, so dropped all tags - favour cpu_reset over resettable_reset(cs) --- target/m68k/cpu.h | 2 ++ hw/m68k/virt.c | 34 ++++++++++------------------------ target/m68k/cpu.c | 5 +++++ 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h index 7911ab9de30..d3b604689ab 100644 --- a/target/m68k/cpu.h +++ b/target/m68k/cpu.h @@ -155,6 +155,8 @@ typedef struct CPUArchState { /* Fields from here on are preserved across CPU reset. */ uint64_t features; + /* Override the normal reset vector with a direct kernel boot */ + uint32_t direct_kernel_boot_pc; } CPUM68KState; /* diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index e67900c727d..b2e651ebcfd 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -87,23 +87,6 @@ #define VIRT_VIRTIO_MMIO_BASE 0xff010000 /* MMIO: 0xff010000 - 0xff01ffff */ #define VIRT_VIRTIO_IRQ_BASE PIC_IRQ(2, 1) /* PIC: 2, 3, 4, 5, IRQ: ALL */ -typedef struct { - M68kCPU *cpu; - hwaddr initial_pc; - hwaddr initial_stack; -} ResetInfo; - -static void main_cpu_reset(void *opaque) -{ - ResetInfo *reset_info = opaque; - M68kCPU *cpu = reset_info->cpu; - CPUState *cs = CPU(cpu); - - cpu_reset(cs); - cpu->env.aregs[7] = reset_info->initial_stack; - cpu->env.pc = reset_info->initial_pc; -} - static void rerandomize_rng_seed(void *opaque) { struct bi_record *rng_seed = opaque; @@ -111,6 +94,14 @@ static void rerandomize_rng_seed(void *opaque) be16_to_cpu(*(uint16_t *)rng_seed->data)); } +static void virt_machine_reset(MachineState *ms, ResetType type) +{ + CPUState *cs = first_cpu; + + qemu_devices_reset(type); + cpu_reset(cs); +} + static void virt_init(MachineState *machine) { M68kCPU *cpu = NULL; @@ -129,7 +120,6 @@ static void virt_init(MachineState *machine) SysBusDevice *sysbus; hwaddr io_base; int i; - ResetInfo *reset_info; uint8_t rng_seed[32]; if (ram_size > 3399672 * KiB) { @@ -142,14 +132,9 @@ static void virt_init(MachineState *machine) exit(1); } - reset_info = g_new0(ResetInfo, 1); - /* init CPUs */ cpu = M68K_CPU(cpu_create(machine->cpu_type)); - reset_info->cpu = cpu; - qemu_register_reset(main_cpu_reset, reset_info); - /* RAM */ memory_region_add_subregion(get_system_memory(), 0, machine->ram); @@ -235,7 +220,7 @@ static void virt_init(MachineState *machine) error_report("could not load kernel '%s'", kernel_filename); exit(1); } - reset_info->initial_pc = elf_entry; + cpu->env.direct_kernel_boot_pc = elf_entry; parameters_base = (high + 1) & ~1; param_ptr = param_blob; @@ -315,6 +300,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data) MachineClass *mc = MACHINE_CLASS(oc); mc->desc = "QEMU M68K Virtual Machine"; mc->init = virt_init; + mc->reset = virt_machine_reset; mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040"); mc->max_cpus = 1; mc->no_floppy = 1; diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c index 0dce8ef282e..71393b9fa19 100644 --- a/target/m68k/cpu.c +++ b/target/m68k/cpu.c @@ -193,6 +193,11 @@ static void m68k_cpu_reset_exit(Object *obj, ResetType type) MEMTXATTRS_UNSPECIFIED, NULL); env->pc = address_space_ldl_be(cs->as, 4, MEMTXATTRS_UNSPECIFIED, NULL); + + /* some machine models support direct kernel boot */ + if (env->direct_kernel_boot_pc) { + env->pc = env->direct_kernel_boot_pc; + } #endif } -- 2.47.3
