diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2022-01-20 11:43:28 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2022-01-20 11:43:28 +0000 |
commit | 47fa1ad5349bee5c2b47f8b1dc3be13f180c89ba (patch) | |
tree | 7ef4edd2caa8a8bd72d97c1101081e76dc1afde9 /hw | |
parent | b10d00d8811fa4eed4862963273d7353ce310c82 (diff) | |
parent | e48b140eef9775986cc18038c7bc68f8d2b7fe1d (diff) | |
download | qemu-47fa1ad5349bee5c2b47f8b1dc3be13f180c89ba.zip qemu-47fa1ad5349bee5c2b47f8b1dc3be13f180c89ba.tar.gz qemu-47fa1ad5349bee5c2b47f8b1dc3be13f180c89ba.tar.bz2 |
Merge remote-tracking branch 'remotes/vivier/tags/m68k-for-7.0-pull-request' into staging
m68k pull request 20220120
Fix virt-m68k reboot
# gpg: Signature made Thu 20 Jan 2022 08:35:50 GMT
# gpg: using RSA key CD2F75DDC8E3A4DC2E4F5173F30C38BD3F2FBE3C
# gpg: issuer "laurent@vivier.eu"
# gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" [full]
# gpg: aka "Laurent Vivier <laurent@vivier.eu>" [full]
# gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" [full]
# Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C
* remotes/vivier/tags/m68k-for-7.0-pull-request:
m68k: virt: correctly set the initial PC
hw/elf_ops: clear uninitialized segment space
exec/memory: Extract address_space_set() from dma_memory_set()
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/core/loader.c | 4 | ||||
-rw-r--r-- | hw/m68k/virt.c | 22 |
2 files changed, 21 insertions, 5 deletions
diff --git a/hw/core/loader.c b/hw/core/loader.c index 052a0fd..19edb92 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -1164,9 +1164,13 @@ static void rom_reset(void *unused) if (rom->mr) { void *host = memory_region_get_ram_ptr(rom->mr); memcpy(host, rom->data, rom->datasize); + memset(host + rom->datasize, 0, rom->romsize - rom->datasize); } else { address_space_write_rom(rom->as, rom->addr, MEMTXATTRS_UNSPECIFIED, rom->data, rom->datasize); + address_space_set(rom->as, rom->addr + rom->datasize, 0, + rom->romsize - rom->datasize, + MEMTXATTRS_UNSPECIFIED); } if (rom->isrom) { /* rom needs to be written only once */ diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index 78e926a..bbaf630 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -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) @@ -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) { /* @@ -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); @@ -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); |