On 12/6/19 10:41 AM, Peter Maydell wrote:
> On Fri, 6 Dec 2019 at 18:36, Richard Henderson
> <richard.hender...@linaro.org> wrote:
> 
>>>> +static void el2_e2h_write(CPUARMState *env, const ARMCPRegInfo *ri,
>>>> +                          uint64_t value)
>>>> +{
>>>> +    CPWriteFn *writefn;
>>>> +
>>>> +    if (redirect_for_e2h(env)) {
>>>> +        /* Switch to the saved EL2 version of the register.  */
>>>> +        ri = ri->opaque;
>>>> +        writefn = ri->writefn;
>>>> +    } else {
>>>> +        writefn = ri->orig_writefn;
>>>> +    }
>>>> +    if (writefn == NULL) {
>>>> +        writefn = raw_write;
>>>> +    }
>>>> +    writefn(env, ri, value);
>>>> +}
>>>
>>> I see how this works when we have a readfn or writefn,
>>> but how does the redirection work where the access
>>> goes directly via .fieldoffset ?
>>
>> When there is no .writefn, we use raw_write, which uses fieldoffset.
> 
> Yes, that's what I mean. There's no 'if redirect then this
> fieldoffset else that fieldoffset' codepath, so how does
> it update the right field?

Oh, for the redirected system registers, there will *always* be a .writefn --
el2_e2h_write.  What there will not necessarily be is a .orig_writefn -- in
which case we'll use raw_write.


r~


Reply via email to