Skip to content

Commit

Permalink
hw/avr/atmega: Fix wrong initial value of stack pointer
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Gihun Nam authored and philmd committed Nov 28, 2023
1 parent 0ed083a commit 235948b
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
3 changes: 3 additions & 0 deletions target/avr/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ struct ArchCPU {
CPUState parent_obj;

CPUAVRState env;

/* Initial value of stack pointer */
uint32_t init_sp;
};

/**
Expand Down

0 comments on commit 235948b

Please sign in to comment.