[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86emul: support {RD,WR}{F,G}SBASE
On 14/12/16 09:37, Jan Beulich wrote: > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/x86_emulate/x86_emulate.c > +++ b/xen/arch/x86/x86_emulate/x86_emulate.c > @@ -432,6 +432,7 @@ typedef union { > #define CR4_OSFXSR (1<<9) > #define CR4_OSXMMEXCPT (1<<10) > #define CR4_UMIP (1<<11) > +#define CR4_FSGSBASE (1<<16) > #define CR4_OSXSAVE (1<<18) > > /* EFLAGS bit definitions. */ > @@ -5205,6 +5206,44 @@ x86_emulate( > } > break; > > + case X86EMUL_OPC_F3(0x0f, 0xae): /* Grp15 */ > + { > + unsigned long cr4; > + > + fail_if(modrm_mod != 3); This should surely be an explicit #UD? The only issue is that we don't yet implement Grp15/F3 instructions with memory operands (as there are none yet defined)? > + generate_exception_if((modrm_reg & 4) || !mode_64bit(), EXC_UD); > + fail_if(!ops->read_cr); > + if ( (rc = ops->read_cr(4, &cr4, ctxt)) != X86EMUL_OKAY ) > + goto done; > + generate_exception_if(!(cr4 & CR4_FSGSBASE), EXC_UD); > + fail_if(!ops->read_segment); seg = modrm_reg & 1 ? x86_seg_gs : x86_seg_fs would avoid the repetition later for write_segment(). > + if ( (rc = ops->read_segment(modrm_reg & 1 ? x86_seg_gs : x86_seg_fs, > + &sreg, ctxt)) != X86EMUL_OKAY ) > + goto done; > + dst.reg = decode_register(modrm_rm, &_regs, 0); > + if ( !(modrm_reg & 2) ) > + { > + /* rd{f,g}sbase */ > + dst.type = OP_REG; > + dst.bytes = (op_bytes == 8) ? 8 : 4; > + dst.val = sreg.base; > + break; > + } > + /* wr{f,g}sbase */ > + if ( op_bytes == 8 ) > + { > + sreg.base = *dst.reg; > + generate_exception_if(!is_canonical_address(sreg.base), EXC_GP, > 0); > + } > + else > + sreg.base = (uint32_t)*dst.reg; > + fail_if(!ops->write_segment); > + if ( (rc = ops->write_segment(modrm_reg & 1 ? x86_seg_gs : > x86_seg_fs, > + &sreg, ctxt)) != X86EMUL_OKAY ) > + goto done; Can I talk you into using a switch statement for this? I know it would only have two or four cases, it but read path exiting midway through took me a while to spot even though I was expecting to find it. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |