qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Point where target instructions are read


From: Richard Henderson
Subject: Re: Point where target instructions are read
Date: Wed, 3 Apr 2024 12:40:36 -1000
User-agent: Mozilla Thunderbird

On 4/3/24 08:15, Gautam Bhat wrote:
On Tue, Apr 2, 2024 at 2:01 AM Richard Henderson
<richard.henderson@linaro.org> wrote:

The boot process must cooperate somehow.

When using loader, you must link the image such that it loads at the pc reset 
address
defined by the architecture manual.


r~

I changed my loading options to the following now to have better control:

./qemu-system-msp430 -machine msp430-launchpad -device
loader,file=simple_test.bin,addr=0xFFFE,cpu-num=0,force
-raw=on -d in_asm,out_asm

Here simple_test.bin is the raw binary file converted using objcopy.
addr=0xFFFE is the vector location where the PC will load with the
starting address.

Now how do I load the address in that reset vector location and set my
PC? Is there some example code that I can look at?

Hmm. I can't find an example. I see a TODO for m68k which *should* be loading the pc from the reset vector on reset.

What I think should work is something like

void msp430_cpu_reset_hold(Object *obj)
{
    standard stuff, mostly zeroing registers.
}

void msp430_cpu_reset_exit(Object *obj)
{
    MSP430CPUClass *mcc = MSP430_CPU_GET_CLASS(obj);
    CPUState *cs = CPU(obj);
    CPUMSP430State *env = cpu_env(cs);
    MemTxResult res;

    if (mcc->parent_phases.exit) {
        mvv->parent_phases.exit(obj);
    }

    /* Load PC from the Hard Reset interrupt vector. */
    env->pc = address_space_lduw(cs->as, 0xfffe, MEMTXATTRS_UNSPECIFIED, &res);
    assert(res == MEMTX_OK);
}

void msp430_cpu_class_init(ObjectClass *c, void *data)
{
    MSP430CPUClass *mcc = MSP430_CPU_CLASS(c);
    ResettableClass *rc = RESETTABLE_CLASS(c);

    resettable_class_set_parent_phases(rc, NULL,
                                       msp430_cpu_reset_hold,
                                       msp430_cpu_reset_exit,
                                       &mcc->parent_phases);
}

The loader device populates ram during the reset hold phase, so I believe you need to wait until after that is complete to perform the load, thus the reset_exit hook.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]