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 <gihun.nam@outlook.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <PH0P222MB0010877445B594724D40C924DEBDA@PH0P222MB0010.NAMP222.PROD.OUTLOOK.COM>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
(cherry picked from commit 235948bf53860a1e2df5134eae7b0a30a971a124)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
Gihun Nam 2023-11-27 11:54:20 +09:00 committed by Michael Tokarev
parent fbca2cbbef
commit 66f14b70fe
3 changed files with 16 additions and 1 deletions

View file

@ -233,6 +233,10 @@ static void atmega_realize(DeviceState *dev, Error **errp)
/* CPU */ /* CPU */
object_initialize_child(OBJECT(dev), "cpu", &s->cpu, mc->cpu_type); 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); qdev_realize(DEVICE(&s->cpu), NULL, &error_abort);
cpudev = DEVICE(&s->cpu); cpudev = DEVICE(&s->cpu);

View file

@ -25,6 +25,7 @@
#include "cpu.h" #include "cpu.h"
#include "disas/dis-asm.h" #include "disas/dis-asm.h"
#include "tcg/debug-assert.h" #include "tcg/debug-assert.h"
#include "hw/qdev-properties.h"
static void avr_cpu_set_pc(CPUState *cs, vaddr value) 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->rampY = 0;
env->rampZ = 0; env->rampZ = 0;
env->eind = 0; env->eind = 0;
env->sp = 0; env->sp = cpu->init_sp;
env->skip = 0; env->skip = 0;
@ -154,6 +155,11 @@ static void avr_cpu_initfn(Object *obj)
sizeof(cpu->env.intsrc) * 8); 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) static ObjectClass *avr_cpu_class_by_name(const char *cpu_model)
{ {
ObjectClass *oc; 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_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, resettable_class_set_parent_phases(rc, NULL, avr_cpu_reset_hold, NULL,
&mcc->parent_phases); &mcc->parent_phases);

View file

@ -150,6 +150,9 @@ struct ArchCPU {
CPUNegativeOffsetState neg; CPUNegativeOffsetState neg;
CPUAVRState env; CPUAVRState env;
/* Initial value of stack pointer */
uint32_t init_sp;
}; };
extern const struct VMStateDescription vms_avr_cpu; extern const struct VMStateDescription vms_avr_cpu;