Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: x86 emulator: expand decode flags to 64 bits

Unifiying the operands means not taking advantage of the fact that some
operand types can only go into certain operands (for example, DI can only
be used by the destination), so we need more bits to hold the operand type.

Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

+20 -20
+1 -1
arch/x86/include/asm/kvm_emulate.h
··· 262 262 struct operand dst; 263 263 bool has_seg_override; 264 264 u8 seg_override; 265 - unsigned int d; 265 + u64 d; 266 266 int (*execute)(struct x86_emulate_ctxt *ctxt); 267 267 int (*check_perm)(struct x86_emulate_ctxt *ctxt); 268 268 /* modrm */
+19 -19
arch/x86/kvm/emulate.c
··· 31 31 /* 32 32 * Operand types 33 33 */ 34 - #define OpNone 0 35 - #define OpImplicit 1 /* No generic decode */ 36 - #define OpReg 2 /* Register */ 37 - #define OpMem 3 /* Memory */ 38 - #define OpAcc 4 /* Accumulator: AL/AX/EAX/RAX */ 39 - #define OpDI 5 /* ES:DI/EDI/RDI */ 40 - #define OpMem64 6 /* Memory, 64-bit */ 41 - #define OpImmUByte 7 /* Zero-extended 8-bit immediate */ 42 - #define OpDX 8 /* DX register */ 34 + #define OpNone 0ull 35 + #define OpImplicit 1ull /* No generic decode */ 36 + #define OpReg 2ull /* Register */ 37 + #define OpMem 3ull /* Memory */ 38 + #define OpAcc 4ull /* Accumulator: AL/AX/EAX/RAX */ 39 + #define OpDI 5ull /* ES:DI/EDI/RDI */ 40 + #define OpMem64 6ull /* Memory, 64-bit */ 41 + #define OpImmUByte 7ull /* Zero-extended 8-bit immediate */ 42 + #define OpDX 8ull /* DX register */ 43 43 44 44 #define OpBits 4 /* Width of operand field */ 45 - #define OpMask ((1 << OpBits) - 1) 45 + #define OpMask ((1ull << OpBits) - 1) 46 46 47 47 /* 48 48 * Opcode effective-address decode tables. ··· 108 108 #define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */ 109 109 #define No64 (1<<28) 110 110 /* Source 2 operand type */ 111 - #define Src2None (0<<29) 112 - #define Src2CL (1<<29) 113 - #define Src2ImmByte (2<<29) 114 - #define Src2One (3<<29) 115 - #define Src2Imm (4<<29) 116 - #define Src2Mask (7<<29) 111 + #define Src2None (0u<<29) 112 + #define Src2CL (1u<<29) 113 + #define Src2ImmByte (2u<<29) 114 + #define Src2One (3u<<29) 115 + #define Src2Imm (4u<<29) 116 + #define Src2Mask (7u<<29) 117 117 118 118 #define X2(x...) x, x 119 119 #define X3(x...) X2(x), x ··· 125 125 #define X16(x...) X8(x), X8(x) 126 126 127 127 struct opcode { 128 - u32 flags; 129 - u8 intercept; 128 + u64 flags : 56; 129 + u64 intercept : 8; 130 130 union { 131 131 int (*execute)(struct x86_emulate_ctxt *ctxt); 132 132 struct opcode *group; ··· 3530 3530 return EMULATION_FAILED; 3531 3531 } 3532 3532 3533 - ctxt->d &= ~GroupMask; 3533 + ctxt->d &= ~(u64)GroupMask; 3534 3534 ctxt->d |= opcode.flags; 3535 3535 } 3536 3536