From 41cd09d2d592ae1c651d1c3f01e83d46d39d2a51 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Tue, 27 Aug 2024 13:49:15 -0700 Subject: [PATCH] kvm: add vmcall/vmmcall benchmark PiperOrigin-RevId: 668124123 --- pkg/sentry/platform/kvm/kvm_amd64_test.go | 18 ++++++++++++++++++ pkg/sentry/platform/kvm/kvm_amd64_test.s | 12 ++++++++++++ 2 files changed, 30 insertions(+) diff --git a/pkg/sentry/platform/kvm/kvm_amd64_test.go b/pkg/sentry/platform/kvm/kvm_amd64_test.go index 8c1df11f3..343e9ddf1 100644 --- a/pkg/sentry/platform/kvm/kvm_amd64_test.go +++ b/pkg/sentry/platform/kvm/kvm_amd64_test.go @@ -53,6 +53,24 @@ func TestSegments(t *testing.T) { }) } +func vmcall(ax uintptr) uintptr +func vmmcall(ax uintptr) uintptr + +func BenchmarkVMCall(b *testing.B) { + vmcallIsSupported := cpuid.HostFeatureSet().Intel() + kvmTest(b, nil, func(c *vCPU) bool { + for i := 0; i < b.N; i++ { + bluepill(c) + if vmcallIsSupported { + vmcall(0) + } else { + vmmcall(0) + } + } + return false + }) +} + // stmxcsr reads the MXCSR control and status register. func stmxcsr(addr *uint32) diff --git a/pkg/sentry/platform/kvm/kvm_amd64_test.s b/pkg/sentry/platform/kvm/kvm_amd64_test.s index 6838b42a8..2981c72d7 100644 --- a/pkg/sentry/platform/kvm/kvm_amd64_test.s +++ b/pkg/sentry/platform/kvm/kvm_amd64_test.s @@ -19,3 +19,15 @@ TEXT ·stmxcsr(SB),NOSPLIT|NOFRAME,$0-8 MOVQ addr+0(FP), SI STMXCSR (SI) RET + +TEXT ·vmcall(SB),NOSPLIT,$0-16 + MOVQ $ax+0(FP), AX + BYTE $0x0F; BYTE $0x01; BYTE $0xC1; // vmcall + MOVQ AX, ret+8(FP) + RET + +TEXT ·vmmcall(SB),NOSPLIT,$0-16 + MOVQ $ax+0(FP), AX + BYTE $0x0F; BYTE $0x01; BYTE $0xD9; // vmmcall + MOVQ AX, ret+8(FP) + RET