[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/2] xen/arm32: implement VFP context switch
On Fri, 2013-05-31 at 16:27 +0100, Julien Grall wrote: > On 05/31/2013 03:12 PM, Ian Campbell wrote: > > > On Thu, 2013-05-30 at 17:01 +0100, Julien Grall wrote: > >> +void vfp_save_state(struct vcpu *v) > >> +{ > >> + uint32_t tmp; > >> + > >> + v->arch.vfp.fpexc = READ_CP32(FPEXC); > > > > The docs seem to call for reading this via an explicit VMRS > > instruction. > > > > Looking at the ARM ARM this seems to be an alias for the encoding of an > > MRC instruction corresponding to reading FPEXC as you have done. Did you > > have a reference for that aliasing? (I'm not finding it in the ARM ARM). > > > I didn't find anything on the aliasing. I looked at the linux VFP > include (arch/arm/include/asm/vfp.h). I wonder if it would be better to do this via VFP specific macros? Probably not. > > Are you avoiding the mnemonic to avoid issues with binutils providing > > the instruction? > > This mnemonic can only be used if VFP is enabled by gcc. I think it's > safer to use mrc if we don't want to use VFP on the other part of XEN. Agreed. > > Do you know what happens to the values of d0..d31 and FPSCR etc when > > > FPEXC.EN is disabled? I'm wondering if we can avoid saving the registers > > in that case, we'd still need to restore to prevent leaking the last > > guests state if the VCPU enabled exceptions. I suppose it's not worth it > > unless we implement a more full featured lazy saving regime. > > > I didn't find something about the state of the registers when VFP is > disabled. I think the registers is not clobbered. > Linux seems to save vfp registers at each context switch only if VFP is > enabled. But we cannot rely on that for the other distributions. Linux likely traps if the process then goes on to use VFP, at which point it can clear/restore the registers as necessary. We could do something similar using HCPTR -- that's what I meant by lazy saving (and restore). > > >> +} > >> + > >> +void vfp_restore_state(struct vcpu *v) > >> +{ > > > > Some of the same comments (tmps, barriers etc) apply to restore as to > > save. > > > > Is there any chance that any of these loads could cause an FP fault? > > e.g. if the guest had an FP exception pending when we saved it, could > > reloading the register retrigger it? > > I don't know. Hrm :-/ If there are no invalid encodings for d0..d31 then it should just be a case of checking the ARM ARM for FPINST* and FPSCR. > >> @@ -106,6 +114,7 @@ > >> #define NSACR p15,0,c1,c1,2 /* Non-Secure Access Control > >> Register */ > >> #define HSCTLR p15,4,c1,c0,0 /* Hyp. System Control Register */ > >> #define HCR p15,4,c1,c1,0 /* Hyp. Configuration Register */ > >> +#define HCPTR p15,4,c1,c1,2 /* Hyp. Coprocessor Trap Register > >> */ > > > > Is this intentionally unused? I don't mind adding unused register > > definitions, just wanted to check there wasn't a hunk missing or > > anything. > > > Another lost when I have created the patch. I was using it to trap VFP > when I tested the context switch. OK. > > > The register resets to 0x0 which is OK but it might be wise to trap all > > accesses the coprocessors which we haven't implemented ctx switching > > for? So at least we find out about missing ones instead of silently > > leaking information between guests and/or corrupting their state. > > > What about sending an undefined instruction to the guest if the > coprocessor is not implemented? > It seems that some software (sshd, ntpdate) which are using libcrypto, > are trying to access to the cryptographic coprocessor even if it doesn't > exist. Urk. We should either ctx switch it properly or we should hide it properly (from all the feature registers) and inject undef. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |