Skip to content

Commit d5ae7ce

Browse files
Xiao Guangrongavikivity
authored andcommitted
KVM: x86: tag the instructions which are used to write page table
The idea is from Avi: | tag instructions that are typically used to modify the page tables, and | drop shadow if any other instruction is used. | The list would include, I'd guess, and, or, bts, btc, mov, xchg, cmpxchg, | and cmpxchg8b. This patch is used to tag the instructions and in the later path, shadow page is dropped if it is written by other instructions Signed-off-by: Xiao Guangrong <[email protected]> Signed-off-by: Avi Kivity <[email protected]>
1 parent f759e2b commit d5ae7ce

File tree

1 file changed

+21
-16
lines changed

1 file changed

+21
-16
lines changed

arch/x86/kvm/emulate.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,9 @@
125125
#define Lock (1<<26) /* lock prefix is allowed for the instruction */
126126
#define Priv (1<<27) /* instruction generates #GP if current CPL != 0 */
127127
#define No64 (1<<28)
128+
#define PageTable (1 << 29) /* instruction used to write page table */
128129
/* Source 2 operand type */
129-
#define Src2Shift (29)
130+
#define Src2Shift (30)
130131
#define Src2None (OpNone << Src2Shift)
131132
#define Src2CL (OpCL << Src2Shift)
132133
#define Src2ImmByte (OpImmByte << Src2Shift)
@@ -3033,10 +3034,10 @@ static struct opcode group7_rm7[] = {
30333034

30343035
static struct opcode group1[] = {
30353036
I(Lock, em_add),
3036-
I(Lock, em_or),
3037+
I(Lock | PageTable, em_or),
30373038
I(Lock, em_adc),
30383039
I(Lock, em_sbb),
3039-
I(Lock, em_and),
3040+
I(Lock | PageTable, em_and),
30403041
I(Lock, em_sub),
30413042
I(Lock, em_xor),
30423043
I(0, em_cmp),
@@ -3096,18 +3097,21 @@ static struct group_dual group7 = { {
30963097

30973098
static struct opcode group8[] = {
30983099
N, N, N, N,
3099-
D(DstMem | SrcImmByte | ModRM), D(DstMem | SrcImmByte | ModRM | Lock),
3100-
D(DstMem | SrcImmByte | ModRM | Lock), D(DstMem | SrcImmByte | ModRM | Lock),
3100+
D(DstMem | SrcImmByte | ModRM),
3101+
D(DstMem | SrcImmByte | ModRM | Lock | PageTable),
3102+
D(DstMem | SrcImmByte | ModRM | Lock),
3103+
D(DstMem | SrcImmByte | ModRM | Lock | PageTable),
31013104
};
31023105

31033106
static struct group_dual group9 = { {
3104-
N, D(DstMem64 | ModRM | Lock), N, N, N, N, N, N,
3107+
N, D(DstMem64 | ModRM | Lock | PageTable), N, N, N, N, N, N,
31053108
}, {
31063109
N, N, N, N, N, N, N, N,
31073110
} };
31083111

31093112
static struct opcode group11[] = {
3110-
I(DstMem | SrcImm | ModRM | Mov, em_mov), X7(D(Undefined)),
3113+
I(DstMem | SrcImm | ModRM | Mov | PageTable, em_mov),
3114+
X7(D(Undefined)),
31113115
};
31123116

31133117
static struct gprefix pfx_0f_6f_0f_7f = {
@@ -3120,7 +3124,7 @@ static struct opcode opcode_table[256] = {
31203124
I(ImplicitOps | Stack | No64 | Src2ES, em_push_sreg),
31213125
I(ImplicitOps | Stack | No64 | Src2ES, em_pop_sreg),
31223126
/* 0x08 - 0x0F */
3123-
I6ALU(Lock, em_or),
3127+
I6ALU(Lock | PageTable, em_or),
31243128
I(ImplicitOps | Stack | No64 | Src2CS, em_push_sreg),
31253129
N,
31263130
/* 0x10 - 0x17 */
@@ -3132,7 +3136,7 @@ static struct opcode opcode_table[256] = {
31323136
I(ImplicitOps | Stack | No64 | Src2DS, em_push_sreg),
31333137
I(ImplicitOps | Stack | No64 | Src2DS, em_pop_sreg),
31343138
/* 0x20 - 0x27 */
3135-
I6ALU(Lock, em_and), N, N,
3139+
I6ALU(Lock | PageTable, em_and), N, N,
31363140
/* 0x28 - 0x2F */
31373141
I6ALU(Lock, em_sub), N, I(ByteOp | DstAcc | No64, em_das),
31383142
/* 0x30 - 0x37 */
@@ -3165,11 +3169,11 @@ static struct opcode opcode_table[256] = {
31653169
G(ByteOp | DstMem | SrcImm | ModRM | No64 | Group, group1),
31663170
G(DstMem | SrcImmByte | ModRM | Group, group1),
31673171
I2bv(DstMem | SrcReg | ModRM, em_test),
3168-
I2bv(DstMem | SrcReg | ModRM | Lock, em_xchg),
3172+
I2bv(DstMem | SrcReg | ModRM | Lock | PageTable, em_xchg),
31693173
/* 0x88 - 0x8F */
3170-
I2bv(DstMem | SrcReg | ModRM | Mov, em_mov),
3174+
I2bv(DstMem | SrcReg | ModRM | Mov | PageTable, em_mov),
31713175
I2bv(DstReg | SrcMem | ModRM | Mov, em_mov),
3172-
I(DstMem | SrcNone | ModRM | Mov, em_mov_rm_sreg),
3176+
I(DstMem | SrcNone | ModRM | Mov | PageTable, em_mov_rm_sreg),
31733177
D(ModRM | SrcMem | NoAccess | DstReg),
31743178
I(ImplicitOps | SrcMem16 | ModRM, em_mov_sreg_rm),
31753179
G(0, group1A),
@@ -3182,7 +3186,7 @@ static struct opcode opcode_table[256] = {
31823186
II(ImplicitOps | Stack, em_popf, popf), N, N,
31833187
/* 0xA0 - 0xA7 */
31843188
I2bv(DstAcc | SrcMem | Mov | MemAbs, em_mov),
3185-
I2bv(DstMem | SrcAcc | Mov | MemAbs, em_mov),
3189+
I2bv(DstMem | SrcAcc | Mov | MemAbs | PageTable, em_mov),
31863190
I2bv(SrcSI | DstDI | Mov | String, em_mov),
31873191
I2bv(SrcSI | DstDI | String, em_cmp),
31883192
/* 0xA8 - 0xAF */
@@ -3280,20 +3284,21 @@ static struct opcode twobyte_table[256] = {
32803284
D(DstMem | SrcReg | Src2CL | ModRM), N, N,
32813285
/* 0xA8 - 0xAF */
32823286
I(Stack | Src2GS, em_push_sreg), I(Stack | Src2GS, em_pop_sreg),
3283-
DI(ImplicitOps, rsm), D(DstMem | SrcReg | ModRM | BitOp | Lock),
3287+
DI(ImplicitOps, rsm),
3288+
D(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable),
32843289
D(DstMem | SrcReg | Src2ImmByte | ModRM),
32853290
D(DstMem | SrcReg | Src2CL | ModRM),
32863291
D(ModRM), I(DstReg | SrcMem | ModRM, em_imul),
32873292
/* 0xB0 - 0xB7 */
3288-
D2bv(DstMem | SrcReg | ModRM | Lock),
3293+
D2bv(DstMem | SrcReg | ModRM | Lock | PageTable),
32893294
I(DstReg | SrcMemFAddr | ModRM | Src2SS, em_lseg),
32903295
D(DstMem | SrcReg | ModRM | BitOp | Lock),
32913296
I(DstReg | SrcMemFAddr | ModRM | Src2FS, em_lseg),
32923297
I(DstReg | SrcMemFAddr | ModRM | Src2GS, em_lseg),
32933298
D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov),
32943299
/* 0xB8 - 0xBF */
32953300
N, N,
3296-
G(BitOp, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock),
3301+
G(BitOp, group8), D(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable),
32973302
D(DstReg | SrcMem | ModRM), D(DstReg | SrcMem | ModRM),
32983303
D(ByteOp | DstReg | SrcMem | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov),
32993304
/* 0xC0 - 0xCF */

0 commit comments

Comments
 (0)