[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 11/12] fuzz/x86_emulate: Set and fuzz more CPU state
>>> On 10.10.17 at 18:20, <george.dunlap@xxxxxxxxxx> wrote: > --- a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c > +++ b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c > @@ -40,6 +40,8 @@ struct fuzz_state > uint64_t msr[MSR_INDEX_MAX]; > struct segment_register segments[SEG_NUM]; > struct cpu_user_regs regs; > + char fxsave[512] __attribute__((aligned(16))); > + > > /* Fuzzer's input data. */ No double blank lines please. > @@ -596,6 +598,54 @@ static const struct x86_emulate_ops all_fuzzer_ops = { > }; > #undef SET > > +/* > + * This funciton will read or write fxsave to the fpu. When writing, > + * it 'sanitizes' the state: It will mask off the appropriate bits in > + * the mxcsr, 'restore' the state to the fpu, then 'save' it again so > + * that the data in fxsave reflects what's actually in the FPU. > + * > + * TODO: Extend state beyond just FPU (ymm registers, &c) > + */ > +static void _set_fpu_state(char *fxsave, bool write) > +{ > + if ( cpu_has_fxsr ) > + { > + static union __attribute__((__aligned__(16))) { > + char x[512]; > + struct { > + uint32_t other[6]; > + uint32_t mxcsr; > + uint32_t mxcsr_mask; > + /* ... */ > + }; > + } *fxs; > + > + fxs = (typeof(fxs)) fxsave; Stray blank after the cast. > + if ( write ) > + { > + char null[512] __attribute__((aligned(16))) = { }; > + > + fxs->mxcsr &= mxcsr_mask; > + > + asm volatile( "fxrstor %0" :: "m" (*null) ); > + asm volatile( "fxrstor %0" :: "m" (*fxs) ); Without a comment I still don't really understand what good this double load is intended to do. In particular I don't think there are any state components that the first may alter but the second won't. Quite the opposite, on AMD I think you may end up not altering FIP/FDP/FOP despite this double load (iirc they're being loaded only when an exception is indicated to be pending in the status word; see fpu_fxrstor() in the hypervisor). > @@ -737,6 +791,18 @@ static void setup_state(struct x86_emulate_ctxt *ctxt) > printf("Setting cpu_user_regs offset %x\n", offset); > continue; > } > + offset -= sizeof(struct cpu_user_regs); > + > + /* Fuzz fxsave state */ > + if ( offset < 128 ) sizeof(s->fxsave) / 4 Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |