|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/emul: Simplfy L{ES, DS, SS, FS, GS} handling
>>> On 14.12.16 at 12:20, <andrew.cooper3@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
> @@ -2765,6 +2765,7 @@ x86_emulate(
> if ( mode_64bit() && (op_bytes == 4) )
> op_bytes = 8;
> seg = (b >> 3) & 7;
> + ASSERT(is_x86_user_segment(seg));
Kind of pointless, don't you think? It's guaranteed by the set of
case statements ahead of here.
> @@ -3393,25 +3394,32 @@ x86_emulate(
> _regs.eip = dst.val;
> break;
>
> - case 0xc4: /* les */ {
> + case 0xc4: /* les */
> + case 0xc5: /* lds */
> + {
> unsigned long sel;
Since you're touching this anyway, and since you're eliminating the
use of dst.val here, may I ask that you eliminate this local variable
at once, using dst.val instead?
> - dst.val = x86_seg_es;
> - les: /* dst.val identifies the segment */
> - generate_exception_if(mode_64bit() && !ext, EXC_UD);
> +
> + generate_exception_if(mode_64bit(), EXC_UD);
> + seg = (b & 1) * 3; /* es = 0, ds = 3 */
> + goto les;
> +
> + case X86EMUL_OPC(0x0f, 0xb2): /* lss */
> + case X86EMUL_OPC(0x0f, 0xb4): /* lfs */
> + case X86EMUL_OPC(0x0f, 0xb5): /* lgs */
> + seg = b & 7;
> +
> + les:
My general line of thinking about where to place case labels was
- next to each other for opcodes sharing all of their code, or allowing
plain fall-through,
- in numeric order when plain fall-through is not possible.
Hence I'd prefer if the three could stay at the place where LSS was.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |