Skip to content

Commit 7443b05

Browse files
author
Jinrong Liang
committed
KVM: x86/PVM: Add PVM hypercalls exit reason handling
Add PVM exit reasons for various hypercall scenarios. The new exit reasons cover various PVM hypercall types, including IRQ_WIN, IRQ_HALT, LOAD_PGTBL, TLB_FLUSH, TLB_FLUSH_CURRENT, TLB_INVLPG, LOAD_GS, RDMSR, WRMSR, and LOAD_TLS. Improve the handling of exit reasons for PVM by adding PVM hypercall exit reasons. This change benefits performance analysis tools, such as perf, by allowing them to provide more detailed information about the execution of PVM hypercalls. Suggested-by: Like Xu <likexu@tencent.com> Signed-off-by: Jinrong Liang <cloudliang@tencent.com>
1 parent 819c84c commit 7443b05

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

arch/x86/kvm/pvm/pvm.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2441,6 +2441,34 @@ static u32 pvm_get_syscall_exit_reason(struct kvm_vcpu *vcpu)
24412441
return PVM_EXIT_REASONS_SYSCALL;
24422442
}
24432443

2444+
static u64 pvm_get_hypercall_exit_reason(struct kvm_vcpu *vcpu)
2445+
{
2446+
switch (kvm_rax_read(vcpu)) {
2447+
case PVM_HC_IRQ_WIN:
2448+
return PVM_EXIT_REASONS_HC_IRQ_WIN;
2449+
case PVM_HC_IRQ_HALT:
2450+
return PVM_EXIT_REASONS_HC_IRQ_HALT;
2451+
case PVM_HC_LOAD_PGTBL:
2452+
return PVM_EXIT_REASONS_HC_LOAD_PGTBL;
2453+
case PVM_HC_TLB_FLUSH:
2454+
return PVM_EXIT_REASONS_HC_TLB_FLUSH;
2455+
case PVM_HC_TLB_FLUSH_CURRENT:
2456+
return PVM_EXIT_REASONS_HC_TLB_FLUSH_CURRENT;
2457+
case PVM_HC_TLB_INVLPG:
2458+
return PVM_EXIT_REASONS_HC_TLB_INVLPG;
2459+
case PVM_HC_LOAD_GS:
2460+
return PVM_EXIT_REASONS_HC_LOAD_GS;
2461+
case PVM_HC_RDMSR:
2462+
return PVM_EXIT_REASONS_HC_RDMSR;
2463+
case PVM_HC_WRMSR:
2464+
return PVM_EXIT_REASONS_HC_WRMSR;
2465+
case PVM_HC_LOAD_TLS:
2466+
return PVM_EXIT_REASONS_HC_LOAD_TLS;
2467+
default:
2468+
return 0;
2469+
}
2470+
}
2471+
24442472
static void pvm_get_exit_info(struct kvm_vcpu *vcpu, u32 *reason, u64 *info1, u64 *info2,
24452473
u32 *intr_info, u32 *error_code)
24462474
{
@@ -2459,6 +2487,9 @@ static void pvm_get_exit_info(struct kvm_vcpu *vcpu, u32 *reason, u64 *info1, u6
24592487
*info2 = pvm->exit_error_code;
24602488
*intr_info = pvm->exit_vector;
24612489
*error_code = pvm->exit_error_code;
2490+
2491+
if (*reason == PVM_EXIT_REASONS_HYPERCALL)
2492+
*info2 = pvm_get_hypercall_exit_reason(vcpu);
24622493
}
24632494

24642495
static void pvm_handle_exit_irqoff(struct kvm_vcpu *vcpu)

arch/x86/kvm/pvm/pvm.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@
3636
#define PVM_EXIT_REASONS_INTERRUPT (5UL << PVM_EXIT_REASONS_SHIFT)
3737
#define PVM_EXIT_REASONS_INT80 (6UL << PVM_EXIT_REASONS_SHIFT)
3838

39+
#define PVM_EXIT_REASONS_HC_IRQ_WIN (PVM_EXIT_REASONS_HYPERCALL + 1)
40+
#define PVM_EXIT_REASONS_HC_IRQ_HALT (PVM_EXIT_REASONS_HYPERCALL + 2)
41+
#define PVM_EXIT_REASONS_HC_LOAD_PGTBL (PVM_EXIT_REASONS_HYPERCALL + 3)
42+
#define PVM_EXIT_REASONS_HC_TLB_FLUSH (PVM_EXIT_REASONS_HYPERCALL + 4)
43+
#define PVM_EXIT_REASONS_HC_TLB_FLUSH_CURRENT (PVM_EXIT_REASONS_HYPERCALL + 5)
44+
#define PVM_EXIT_REASONS_HC_TLB_INVLPG (PVM_EXIT_REASONS_HYPERCALL + 6)
45+
#define PVM_EXIT_REASONS_HC_LOAD_GS (PVM_EXIT_REASONS_HYPERCALL + 7)
46+
#define PVM_EXIT_REASONS_HC_RDMSR (PVM_EXIT_REASONS_HYPERCALL + 8)
47+
#define PVM_EXIT_REASONS_HC_WRMSR (PVM_EXIT_REASONS_HYPERCALL + 9)
48+
#define PVM_EXIT_REASONS_HC_LOAD_TLS (PVM_EXIT_REASONS_HYPERCALL + 10)
49+
3950
#define PVM_EXIT_REASONS \
4051
{ DE_VECTOR, "DE excp" }, \
4152
{ DB_VECTOR, "DB excp" }, \
@@ -61,6 +72,16 @@
6172
{ PVM_EXIT_REASONS_ERETS, "ERETS" }, \
6273
{ PVM_EXIT_REASONS_INTERRUPT, "INTERRUPT" }, \
6374
{ PVM_EXIT_REASONS_INT80, "INT80" }, \
75+
{ PVM_EXIT_REASONS_HC_IRQ_WIN, "HC_IRQ_WIN" }, \
76+
{ PVM_EXIT_REASONS_HC_IRQ_HALT, "HC_IRQ_HALT" }, \
77+
{ PVM_EXIT_REASONS_HC_LOAD_PGTBL, "HC_LOAD_PGTBL" }, \
78+
{ PVM_EXIT_REASONS_HC_TLB_FLUSH, "HC_TLB_FLUSH" }, \
79+
{ PVM_EXIT_REASONS_HC_TLB_FLUSH_CURRENT, "HC_TLB_FLUSH_CURRENT" },\
80+
{ PVM_EXIT_REASONS_HC_TLB_INVLPG, "HC_TLB_INVLPG" }, \
81+
{ PVM_EXIT_REASONS_HC_LOAD_GS, "HC_LOAD_GS" }, \
82+
{ PVM_EXIT_REASONS_HC_RDMSR, "HC_RDMSR" }, \
83+
{ PVM_EXIT_REASONS_HC_WRMSR, "HC_WRMSR" }, \
84+
{ PVM_EXIT_REASONS_HC_LOAD_TLS, "HC_LOAD_TLS" }, \
6485
{ PVM_FAILED_VMENTRY_VECTOR, "FAILED_VMENTRY" }
6586

6687
#define PT_L4_SHIFT 39

0 commit comments

Comments
 (0)