Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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 235948b)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
  • Loading branch information
Gihun Nam authored and Michael Tokarev committed Dec 5, 2023
1 parent fbca2cb commit 66f14b7
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
4 changes: 4 additions & 0 deletions hw/avr/atmega.c
Expand Up @@ -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);

Expand Down
10 changes: 9 additions & 1 deletion target/avr/cpu.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
3 changes: 3 additions & 0 deletions target/avr/cpu.h
Expand Up @@ -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;
Expand Down

0 comments on commit 66f14b7

Please sign in to comment.