|
[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 at 13:36, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 14/12/16 09:37, Jan Beulich wrote:
>> @@ -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)?
If there weren't any, I probably would have used #UD here. But
there are - ptwrite is even in the normal SDM already (but it looks
to be missing from the opcode map).
>> + 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().
Will do.
>> + 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.
I was specifically trying to avoid another nested switch here. Would
it be sufficient if I just made the write path the "else" to that "if"?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |