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>
This commit is contained in:
parent
0ed083a1bc
commit
235948bf53
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
@ -152,6 +153,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;
|
||||
@ -228,6 +234,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);
|
||||
|
||||
|
@ -145,6 +145,9 @@ struct ArchCPU {
|
||||
CPUState parent_obj;
|
||||
|
||||
CPUAVRState env;
|
||||
|
||||
/* Initial value of stack pointer */
|
||||
uint32_t init_sp;
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user