Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Linux-DSM-4.18/arch/x86/kvm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -3995,11 +3995,15 @@ int kvm_handle_page_fault(struct kvm_vcpu *vcpu, u64 error_code,
u64 fault_address, char *insn, int insn_len)
{
int r = 1;
int i;
unsigned long regs[NR_VCPU_REGS];

vcpu->arch.l1tf_flush_l1d = true;
switch (vcpu->arch.apf.host_apf_reason) {
default:
trace_kvm_page_fault(fault_address, error_code);
for (i = VCPU_REGS_RAX; i < NR_VCPU_REGS; i++)
regs[i] = kvm_register_read(vcpu, i);
trace_kvm_page_fault(fault_address, error_code, regs);

if (kvm_event_needs_reinjection(vcpu))
kvm_mmu_unprotect_page_virt(vcpu, fault_address);
Expand Down
39 changes: 34 additions & 5 deletions Linux-DSM-4.18/arch/x86/kvm/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#define _TRACE_KVM_H

#include <linux/tracepoint.h>
#include <linux/kvm_host.h>
#include <asm/vmx.h>
#include <asm/svm.h>
#include <asm/clocksource.h>
Expand Down Expand Up @@ -303,21 +304,49 @@ TRACE_EVENT(kvm_inj_exception,
* Tracepoint for page fault.
*/
TRACE_EVENT(kvm_page_fault,
TP_PROTO(unsigned long fault_address, unsigned int error_code),
TP_ARGS(fault_address, error_code),
TP_PROTO(unsigned long fault_address, unsigned int error_code, unsigned long *regs),
TP_ARGS(fault_address, error_code, regs),

TP_STRUCT__entry(
__field( unsigned long, fault_address )
__field( unsigned int, error_code )
__array( unsigned long, regs, NR_VCPU_REGS )
),

TP_fast_assign(
__entry->fault_address = fault_address;
__entry->error_code = error_code;
memcpy(__entry->regs, regs, sizeof(unsigned long)*NR_VCPU_REGS)
),

TP_printk("address %lx error_code %x",
__entry->fault_address, __entry->error_code)
#ifdef CONFIG_X86_64
TP_printk("address %lx error_code %x "\
"rax %lx rcx %lx rdx %lx rbx %lx "\
"rsp %lx rbp %lx rsi %lx rdi %lx "\
"r8 %lx r9 %lx r10 %lx r11 %lx "\
"r12 %lx r13 %lx r14 %lx r15 %lx "\
"rip %lx",
__entry->fault_address, __entry->error_code,
__entry->regs[VCPU_REGS_RAX], __entry->regs[VCPU_REGS_RCX],
__entry->regs[VCPU_REGS_RDX], __entry->regs[VCPU_REGS_RBX],
__entry->regs[VCPU_REGS_RSP], __entry->regs[VCPU_REGS_RBP],
__entry->regs[VCPU_REGS_RSI], __entry->regs[VCPU_REGS_RDI],
__entry->regs[VCPU_REGS_R8], __entry->regs[VCPU_REGS_R9],
__entry->regs[VCPU_REGS_R10], __entry->regs[VCPU_REGS_R11],
__entry->regs[VCPU_REGS_R12], __entry->regs[VCPU_REGS_R13],
__entry->regs[VCPU_REGS_R14], __entry->regs[VCPU_REGS_R15],
__entry->regs[VCPU_REGS_RIP])
#else
TP_printk("address %lx error_code %x "\
"eax %lx ecx %lx edx %lx ebx %lx "\
"esp %lx ebp %lx esi %lx edi %lx "\
"eip %lx",
__entry->fault_address, __entry->error_code,
__entry->regs[VCPU_REGS_RAX], __entry->regs[VCPU_REGS_RCX],
__entry->regs[VCPU_REGS_RDX], __entry->regs[VCPU_REGS_RBX],
__entry->regs[VCPU_REGS_RSP], __entry->regs[VCPU_REGS_RBP],
__entry->regs[VCPU_REGS_RSI], __entry->regs[VCPU_REGS_RDI],
__entry->regs[VCPU_REGS_RIP])
#endif
);

/*
Expand Down
7 changes: 6 additions & 1 deletion Linux-DSM-4.18/arch/x86/kvm/vmx.c
Original file line number Diff line number Diff line change
Expand Up @@ -7474,6 +7474,8 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
unsigned long exit_qualification;
gpa_t gpa;
u64 error_code;
int i;
unsigned long regs[NR_VCPU_REGS];

exit_qualification = vmcs_readl(EXIT_QUALIFICATION);

Expand All @@ -7488,8 +7490,11 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
(exit_qualification & INTR_INFO_UNBLOCK_NMI))
vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, GUEST_INTR_STATE_NMI);

for (i = VCPU_REGS_RAX; i < NR_VCPU_REGS; i++)
regs[i] = kvm_register_read(vcpu, i);

gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
trace_kvm_page_fault(gpa, exit_qualification);
trace_kvm_page_fault(gpa, exit_qualification, regs);

/* Is it a read fault? */
error_code = (exit_qualification & EPT_VIOLATION_ACC_READ)
Expand Down