qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [RFC 2/2] ARM: arm_cpu_reset: make possible to use high


From: Peter Maydell
Subject: Re: [Qemu-devel] [RFC 2/2] ARM: arm_cpu_reset: make possible to use high vectors for reset_exc
Date: Sat, 7 Dec 2013 21:03:56 +0000

On 7 December 2013 20:49, Antony Pavlov <address@hidden> wrote:
> On Sat, 7 Dec 2013 11:08:40 +1000
> Peter Crosthwaite <address@hidden> wrote:
>
>> On Sat, Dec 7, 2013 at 10:55 AM, Antony Pavlov <address@hidden> wrote:
>> > Signed-off-by: Antony Pavlov <address@hidden>
>> > ---
>> >  target-arm/cpu.c | 4 ++++
>> >  1 file changed, 4 insertions(+)
>> >
>> > diff --git a/target-arm/cpu.c b/target-arm/cpu.c
>> > index f838499..6f548c7 100644
>> > --- a/target-arm/cpu.c
>> > +++ b/target-arm/cpu.c
>> > @@ -126,6 +126,10 @@ static void arm_cpu_reset(CPUState *s)
>> >              env->cp15.c1_sys = c1_sys | (1 << 13);
>> >      }
>> >
>> > +    if (!IS_M(env) && env->cp15.c1_sys & (1 << 13)) {
>> > +            env->regs[15] = 0xFFFF0000;
>>
>> Dont see the need for the second if. This should only be reachable if
>> reset_hivecs == true. Can you just put this line after the above
>> "env->cp15.c1_sys = c1_sys | (1 << 13);" ?
>
> Here we have a small problem.
> On the one hand we have 'reset_hivecs' property, on the other hand we have 
> c1_sys[13].
>
> What we have to do if during reset c1_sys[13] == 1 and 'reset_hivecs' is not 
> set?

See my other mail: on reset you should not care about the value
of reset_hivecs. At realize (ie in arm_cpu_realizefn(), at the top
(so it takes effect before that function calls
register_cp_regs_for_features()) you should do:

    if (cpu->reset_hivecs) {
        cpu->reset_sctlr |= (1 << 13);
    }

This will mean that c1_sys (the SCTLR) will always reset with
the hivecs bit set, which is what we want.

Then the only thing you need to do at reset is:
    if (env->cp15.c1_sys & (1 << 13)) {
        /* hivecs setting also affects the CPU reset address */
        env->regs[15] = 0xffff0000;
    }

(as Peter says we can rely on this never being true for M profile
so no specific check for that is required).

thanks
-- PMM



reply via email to

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