Commit e8f85d78 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: x86: Don't treat ENTER and LEAVE as branches, because they aren't



Remove the IsBranch flag from ENTER and LEAVE in KVM's emulator, as ENTER
and LEAVE are stack operations, not branches.  Add forced emulation of
said instructions to the PMU counters test to prove that KVM diverges from
hardware, and to guard against regressions.

Opportunistically add a missing "1 MOV" to the selftest comment regarding
the number of instructions per loop, which commit 7803339f ("KVM:
selftests: Use data load to trigger LLC references/misses in Intel PMU")
forgot to add.

Fixes: 018d70ff ("KVM: x86: Update vPMCs when retiring branch instructions")
Cc: Jim Mattson <jmattson@google.com>
Reviewed-by: default avatarJim Mattson <jmattson@google.com>
Reviewed-by: default avatarChao Gao <chao.gao@intel.com>
Link: https://lore.kernel.org/r/20250919004639.1360453-1-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent c49aa983
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4330,8 +4330,8 @@ static const struct opcode opcode_table[256] = {
	I(DstReg | SrcMemFAddr | ModRM | No64 | Src2DS, em_lseg),
	G(ByteOp, group11), G(0, group11),
	/* 0xC8 - 0xCF */
	I(Stack | SrcImmU16 | Src2ImmByte | IsBranch, em_enter),
	I(Stack | IsBranch, em_leave),
	I(Stack | SrcImmU16 | Src2ImmByte, em_enter),
	I(Stack, em_leave),
	I(ImplicitOps | SrcImmU16 | IsBranch, em_ret_far_imm),
	I(ImplicitOps | IsBranch, em_ret_far),
	D(ImplicitOps | IsBranch), DI(SrcImmByte | IsBranch, intn),
+5 −3
Original line number Diff line number Diff line
@@ -14,10 +14,10 @@
#define NUM_BRANCH_INSNS_RETIRED	(NUM_LOOPS)

/*
 * Number of instructions in each loop. 1 CLFLUSH/CLFLUSHOPT/NOP, 1 MFENCE,
 * 1 LOOP.
 * Number of instructions in each loop. 1 ENTER, 1 CLFLUSH/CLFLUSHOPT/NOP,
 * 1 MFENCE, 1 MOV, 1 LEAVE, 1 LOOP.
 */
#define NUM_INSNS_PER_LOOP		4
#define NUM_INSNS_PER_LOOP		6

/*
 * Number of "extra" instructions that will be counted, i.e. the number of
@@ -210,9 +210,11 @@ do { \
	__asm__ __volatile__("wrmsr\n\t"					\
			     " mov $" __stringify(NUM_LOOPS) ", %%ecx\n\t"	\
			     "1:\n\t"						\
			     FEP "enter $0, $0\n\t"				\
			     clflush "\n\t"					\
			     "mfence\n\t"					\
			     "mov %[m], %%eax\n\t"				\
			     FEP "leave\n\t"					\
			     FEP "loop 1b\n\t"					\
			     FEP "mov %%edi, %%ecx\n\t"				\
			     FEP "xor %%eax, %%eax\n\t"				\