Skip to content

Commit

Permalink
m68k: virt: correctly set the initial PC
Browse files Browse the repository at this point in the history
According to QEMU parameter, set initial PC to the entry of
the loaded kernel.

Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20220115203725.3834712-4-laurent@vivier.eu>
  • Loading branch information
vivier committed Jan 20, 2022
1 parent b4c4c1f commit e48b140
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions hw/m68k/virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,21 @@
#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)
{
M68kCPU *cpu = opaque;
ResetInfo *reset_info = opaque;
M68kCPU *cpu = reset_info->cpu;
CPUState *cs = CPU(cpu);

cpu_reset(cs);
cpu->env.aregs[7] = ldl_phys(cs->as, 0);
cpu->env.pc = ldl_phys(cs->as, 4);
cpu->env.aregs[7] = reset_info->initial_stack;
cpu->env.pc = reset_info->initial_pc;
}

static void virt_init(MachineState *machine)
Expand All @@ -113,6 +120,7 @@ static void virt_init(MachineState *machine)
SysBusDevice *sysbus;
hwaddr io_base;
int i;
ResetInfo *reset_info;

if (ram_size > 3399672 * KiB) {
/*
Expand All @@ -124,9 +132,13 @@ static void virt_init(MachineState *machine)
exit(1);
}

reset_info = g_malloc0(sizeof(ResetInfo));

/* init CPUs */
cpu = M68K_CPU(cpu_create(machine->cpu_type));
qemu_register_reset(main_cpu_reset, cpu);

reset_info->cpu = cpu;
qemu_register_reset(main_cpu_reset, reset_info);

/* RAM */
memory_region_add_subregion(get_system_memory(), 0, machine->ram);
Expand Down Expand Up @@ -206,7 +218,7 @@ static void virt_init(MachineState *machine)
error_report("could not load kernel '%s'", kernel_filename);
exit(1);
}
stl_phys(cs->as, 4, elf_entry); /* reset initial PC */
reset_info->initial_pc = elf_entry;
parameters_base = (high + 1) & ~1;

BOOTINFO1(cs->as, parameters_base, BI_MACHTYPE, MACH_VIRT);
Expand Down

0 comments on commit e48b140

Please sign in to comment.