On 7 December 2013 20:49, Antony Pavlov <antonynpav...@gmail.com> wrote:
> On Sat, 7 Dec 2013 11:08:40 +1000
> Peter Crosthwaite <peter.crosthwa...@xilinx.com> wrote:
>
>> On Sat, Dec 7, 2013 at 10:55 AM, Antony Pavlov <antonynpav...@gmail.com> 
>> wrote:
>> > Signed-off-by: Antony Pavlov <antonynpav...@gmail.com>
>> > ---
>> >  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