From: Gihun Nam Date: Mon, 27 Nov 2023 02:54:20 +0000 (+0900) Subject: hw/avr/atmega: Fix wrong initial value of stack pointer X-Git-Tag: v8.1.4~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=66f14b70fe1b23ccf72a17c3324d95b38ee45a21;p=thirdparty%2Fqemu.git hw/avr/atmega: Fix wrong initial value of stack pointer The current implementation initializes the stack pointer of AVR devices to 0. Although older AVR devices used to be like that, newer ones set it to RAMEND. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1525 Signed-off-by: Gihun Nam Reviewed-by: Philippe Mathieu-Daudé Message-ID: Signed-off-by: Philippe Mathieu-Daudé (cherry picked from commit 235948bf53860a1e2df5134eae7b0a30a971a124) Signed-off-by: Michael Tokarev --- diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c index a34803e6427..31c8992d750 100644 --- a/hw/avr/atmega.c +++ b/hw/avr/atmega.c @@ -233,6 +233,10 @@ static void atmega_realize(DeviceState *dev, Error **errp) /* CPU */ object_initialize_child(OBJECT(dev), "cpu", &s->cpu, mc->cpu_type); + + object_property_set_uint(OBJECT(&s->cpu), "init-sp", + mc->io_size + mc->sram_size - 1, &error_abort); + qdev_realize(DEVICE(&s->cpu), NULL, &error_abort); cpudev = DEVICE(&s->cpu); diff --git a/target/avr/cpu.c b/target/avr/cpu.c index 8f741f258c6..02d58484bb5 100644 --- a/target/avr/cpu.c +++ b/target/avr/cpu.c @@ -25,6 +25,7 @@ #include "cpu.h" #include "disas/dis-asm.h" #include "tcg/debug-assert.h" +#include "hw/qdev-properties.h" static void avr_cpu_set_pc(CPUState *cs, vaddr value) { @@ -95,7 +96,7 @@ static void avr_cpu_reset_hold(Object *obj) env->rampY = 0; env->rampZ = 0; env->eind = 0; - env->sp = 0; + env->sp = cpu->init_sp; env->skip = 0; @@ -154,6 +155,11 @@ static void avr_cpu_initfn(Object *obj) sizeof(cpu->env.intsrc) * 8); } +static Property avr_cpu_properties[] = { + DEFINE_PROP_UINT32("init-sp", AVRCPU, init_sp, 0), + DEFINE_PROP_END_OF_LIST() +}; + static ObjectClass *avr_cpu_class_by_name(const char *cpu_model) { ObjectClass *oc; @@ -231,6 +237,8 @@ static void avr_cpu_class_init(ObjectClass *oc, void *data) device_class_set_parent_realize(dc, avr_cpu_realizefn, &mcc->parent_realize); + device_class_set_props(dc, avr_cpu_properties); + resettable_class_set_parent_phases(rc, NULL, avr_cpu_reset_hold, NULL, &mcc->parent_phases); diff --git a/target/avr/cpu.h b/target/avr/cpu.h index 72251746681..b73547deb2d 100644 --- a/target/avr/cpu.h +++ b/target/avr/cpu.h @@ -150,6 +150,9 @@ struct ArchCPU { CPUNegativeOffsetState neg; CPUAVRState env; + + /* Initial value of stack pointer */ + uint32_t init_sp; }; extern const struct VMStateDescription vms_avr_cpu;