On Thu, 28 Nov 2019 at 17:49, Marc Zyngier <maz@xxxxxxxxxx> wrote: > > Hi Peter, > > Thanks for having a look at this. > > On 2019-11-28 16:43, Peter Maydell wrote: > > On Thu, 28 Nov 2019 at 16:17, Marc Zyngier <maz@xxxxxxxxxx> wrote: > >> > >> HCR_EL2.TID3 requires that AArch32 reads of MVFR[012] are trapped to > >> EL2, and that HCR_EL2.TID0 does the same for reads of FPSID. > >> In order to handle this, introduce a new TCG helper function that > >> checks for these control bits before executing the VMRC instruction. > >> > >> Tested with a hacked-up version of KVM/arm64 that sets the control > >> bits for 32bit guests. > >> > >> Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > > Since the syndrome value depends only on these two things, > > you might as well generate the full syndrome value at > > translate time rather than doing it at runtime; then > > you only need to pass one thing through to the helper rather > > than two. > > OK. This means that the register check in check_hcr_el2_trap > will need to extract the register value from the syndrome. > Not a big deal, but maybe slightly less readable. Oops, I hadn't noticed that we were switching on reg. Yeah, you might as well leave it as is. (We could have a separate helper for each of TID0 and TID3 but that seems like overkill.) > On a vaguely tangential subject, how are conditional instructions > JIT-ed? I could perfectly imagine a conditional VMRS instruction, > but none of the code I looked at seem to care about it. Or is > that done before the access itself is actually emitted? Arm conditional instructions are handled at a pretty high level in the decode, because they all work the same way. In disas_arm_insn() we have: if (cond != 0xe) { /* if not always execute, we generate a conditional jump to next instruction */ arm_skip_unless(s, cond); } and there's something similar in thumb_tr_translate_insn() which puts in a branch based on the thumb condexec bits. The target of the branch is a label whose position is set either in arm_post_translate_insn() after the code for the insn is emitted, or in arm_tr_tb_stop() if the insn is the last in the TB (always true for branch or trap insns). thanks -- PMM _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm