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~