The current implementation initializes the stack pointer of AVR devices to 0, but it should be set to RAMEND according to the specs.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1525 Signed-off-by: Gihun Nam <gihun....@outlook.com> --- hw/avr/atmega.c | 3 +++ target/avr/cpu.c | 2 +- target/avr/cpu.h | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c index a34803e642..3a8caccf99 100644 --- a/hw/avr/atmega.c +++ b/hw/avr/atmega.c @@ -233,6 +233,9 @@ static void atmega_realize(DeviceState *dev, Error **errp) /* CPU */ object_initialize_child(OBJECT(dev), "cpu", &s->cpu, mc->cpu_type); + + s->cpu.init_sp = mc->io_size + mc->sram_size - 1; + 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 44de1e18d1..1da7d7dbf3 100644 --- a/target/avr/cpu.c +++ b/target/avr/cpu.c @@ -95,7 +95,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; diff --git a/target/avr/cpu.h b/target/avr/cpu.h index 8a17862737..7960c5c57a 100644 --- a/target/avr/cpu.h +++ b/target/avr/cpu.h @@ -145,6 +145,9 @@ struct ArchCPU { CPUState parent_obj; CPUAVRState env; + + /* Initial value of stack pointer */ + uint32_t init_sp; }; /** -- 2.39.2