248 lines
8.1 KiB
C
248 lines
8.1 KiB
C
#if !defined(_KVM_GUEST_TRACE_COPY_HW_STACKS_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _KVM_GUEST_TRACE_COPY_HW_STACKS_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/hugetlb.h>
|
|
|
|
#include <asm/trace-defs.h>
|
|
#include <asm/trace_pgtable-v2.h>
|
|
#include <asm/trace_pgtable-v6.h>
|
|
#include <asm/pgtable_def.h>
|
|
#include <asm/kvm/guest/trace-defs.h>
|
|
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM guest
|
|
|
|
TRACE_EVENT(
|
|
guest_copy_hw_stack,
|
|
|
|
TP_PROTO(void *dst, void *src, unsigned long size, bool is_chain),
|
|
|
|
TP_ARGS(dst, src, size, is_chain),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( void *, dst )
|
|
__field( void *, src )
|
|
__field( u64, size )
|
|
__field( bool, is_chain )
|
|
__field( pgdval_t, dst_pgd )
|
|
__field( pudval_t, dst_pud )
|
|
__field( pmdval_t, dst_pmd )
|
|
__field( pteval_t, dst_pte )
|
|
__field( int, dst_pt_level )
|
|
__field( pgdval_t, src_pgd )
|
|
__field( pudval_t, src_pud )
|
|
__field( pmdval_t, src_pmd )
|
|
__field( pteval_t, src_pte )
|
|
__field( int, src_pt_level )
|
|
__field( pgdval_t, dst_spt_pgd )
|
|
__field( pudval_t, dst_spt_pud )
|
|
__field( pmdval_t, dst_spt_pmd )
|
|
__field( pteval_t, dst_spt_pte )
|
|
__field( int, dst_spt_level )
|
|
__field( pgdval_t, src_spt_pgd )
|
|
__field( pudval_t, src_spt_pud )
|
|
__field( pmdval_t, src_spt_pmd )
|
|
__field( pteval_t, src_spt_pte )
|
|
__field( int, src_spt_level )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->dst = dst;
|
|
__entry->src = src;
|
|
__entry->size = size;
|
|
__entry->is_chain = is_chain;
|
|
|
|
trace_get_va_translation(current->mm, (e2k_addr_t)dst,
|
|
&__entry->dst_pgd, &__entry->dst_pud, &__entry->dst_pmd,
|
|
&__entry->dst_pte, &__entry->dst_pt_level);
|
|
trace_kvm_get_gva_spt_translation((e2k_addr_t)dst,
|
|
&__entry->dst_spt_pgd, &__entry->dst_spt_pud,
|
|
&__entry->dst_spt_pmd, &__entry->dst_spt_pte,
|
|
&__entry->dst_spt_level);
|
|
|
|
trace_get_va_translation(current->mm, (e2k_addr_t)src,
|
|
&__entry->src_pgd, &__entry->src_pud, &__entry->src_pmd,
|
|
&__entry->src_pte, &__entry->src_pt_level);
|
|
trace_kvm_get_gva_spt_translation((e2k_addr_t)src,
|
|
&__entry->src_spt_pgd, &__entry->src_spt_pud,
|
|
&__entry->src_spt_pmd, &__entry->src_spt_pte,
|
|
&__entry->src_spt_level);
|
|
),
|
|
|
|
TP_printk("copy %s stack guest user <- guest kernel: dst %px "
|
|
"src %px size %llx\n"
|
|
" user guest dst %px : pgd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pud 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pmd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pte 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" user guest dst spt %px : pgd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pud 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pmd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pte 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" kernel guest src %px : pgd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pud 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pmd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pte 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" kernel guest src spt %px : pgd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pud 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pmd 0x%016lx : %s\n"
|
|
" Access mode: %s%s\n"
|
|
" pte 0x%016lx : %s\n"
|
|
" Access mode: %s%s",
|
|
(__entry->is_chain) ? "chain" : "procedure",
|
|
__entry->dst,
|
|
__entry->src,
|
|
__entry->size,
|
|
__entry->dst,
|
|
(__entry->dst_pt_level <= E2K_PGD_LEVEL_NUM) ?
|
|
__entry->dst_pgd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_pgd,
|
|
__entry->dst_pt_level <= E2K_PGD_LEVEL_NUM),
|
|
(__entry->dst_pt_level <= E2K_PUD_LEVEL_NUM) ?
|
|
__entry->dst_pud : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_pud,
|
|
__entry->dst_pt_level <= E2K_PUD_LEVEL_NUM),
|
|
(__entry->dst_pt_level <= E2K_PMD_LEVEL_NUM) ?
|
|
__entry->dst_pmd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_pmd,
|
|
__entry->dst_pt_level <= E2K_PMD_LEVEL_NUM),
|
|
(__entry->dst_pt_level <= E2K_PTE_LEVEL_NUM) ?
|
|
__entry->dst_pte : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_pte,
|
|
__entry->dst_pt_level <= E2K_PTE_LEVEL_NUM),
|
|
__entry->dst,
|
|
(__entry->dst_spt_level <= E2K_PGD_LEVEL_NUM) ?
|
|
__entry->dst_spt_pgd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_spt_pgd,
|
|
__entry->dst_spt_level <= E2K_PGD_LEVEL_NUM),
|
|
(__entry->dst_spt_level <= E2K_PUD_LEVEL_NUM) ?
|
|
__entry->dst_spt_pud : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_spt_pud,
|
|
__entry->dst_spt_level <= E2K_PUD_LEVEL_NUM),
|
|
(__entry->dst_spt_level <= E2K_PMD_LEVEL_NUM) ?
|
|
__entry->dst_spt_pmd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_spt_pmd,
|
|
__entry->dst_spt_level <= E2K_PMD_LEVEL_NUM),
|
|
(__entry->dst_spt_level <= E2K_PTE_LEVEL_NUM) ?
|
|
__entry->dst_spt_pte : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->dst_spt_pte,
|
|
__entry->dst_spt_level <= E2K_PTE_LEVEL_NUM),
|
|
__entry->src,
|
|
(__entry->src_pt_level <= E2K_PGD_LEVEL_NUM) ?
|
|
__entry->src_pgd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_pgd,
|
|
__entry->src_pt_level <= E2K_PGD_LEVEL_NUM),
|
|
(__entry->src_pt_level <= E2K_PUD_LEVEL_NUM) ?
|
|
__entry->src_pud : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_pud,
|
|
__entry->src_pt_level <= E2K_PUD_LEVEL_NUM),
|
|
(__entry->src_pt_level <= E2K_PMD_LEVEL_NUM) ?
|
|
__entry->src_pmd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_pmd,
|
|
__entry->src_pt_level <= E2K_PMD_LEVEL_NUM),
|
|
(__entry->src_pt_level <= E2K_PTE_LEVEL_NUM) ?
|
|
__entry->src_pte : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_pte,
|
|
__entry->src_pt_level <= E2K_PTE_LEVEL_NUM),
|
|
__entry->src,
|
|
(__entry->src_spt_level <= E2K_PGD_LEVEL_NUM) ?
|
|
__entry->src_spt_pgd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_spt_pgd,
|
|
__entry->src_spt_level <= E2K_PGD_LEVEL_NUM),
|
|
(__entry->src_spt_level <= E2K_PUD_LEVEL_NUM) ?
|
|
__entry->src_spt_pud : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_spt_pud,
|
|
__entry->src_spt_level <= E2K_PUD_LEVEL_NUM),
|
|
(__entry->src_spt_level <= E2K_PMD_LEVEL_NUM) ?
|
|
__entry->src_spt_pmd : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_spt_pmd,
|
|
__entry->src_spt_level <= E2K_PMD_LEVEL_NUM),
|
|
(__entry->src_spt_level <= E2K_PTE_LEVEL_NUM) ?
|
|
__entry->src_spt_pte : -1UL,
|
|
E2K_TRACE_PRINT_PT_FLAGS(__entry->src_spt_pte,
|
|
__entry->src_spt_level <= E2K_PTE_LEVEL_NUM)
|
|
)
|
|
);
|
|
|
|
TRACE_EVENT(
|
|
guest_proc_stack_frame,
|
|
|
|
TP_PROTO(kernel_mem_ps_t *ps_base, kernel_mem_ps_t *ps_frame),
|
|
|
|
TP_ARGS(ps_base, ps_frame),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( kernel_mem_ps_t *, ps_base )
|
|
__field_struct( kernel_mem_ps_t, ps_frame )
|
|
__field( pgprotval_t, dtlb_entry )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->ps_base = ps_base;
|
|
__entry->ps_frame = *ps_frame;
|
|
__entry->dtlb_entry = HYPERVISOR_mmu_probe((e2k_addr_t)ps_base,
|
|
KVM_MMU_PROBE_ENTRY);
|
|
),
|
|
|
|
TP_printk(" %px (dtlb 0x%016lx) : 0x%016lx 0x%016lx",
|
|
__entry->ps_base, __entry->dtlb_entry,
|
|
__entry->ps_frame.word_lo,
|
|
__entry->ps_frame.word_hi)
|
|
);
|
|
|
|
TRACE_EVENT(
|
|
guest_chain_stack_frame,
|
|
|
|
TP_PROTO(e2k_mem_crs_t *pcs_base, e2k_mem_crs_t *pcs_frame),
|
|
|
|
TP_ARGS(pcs_base, pcs_frame),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( e2k_mem_crs_t *, pcs_base )
|
|
__field_struct( e2k_mem_crs_t, pcs_frame )
|
|
__field( pgprotval_t, dtlb_entry )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->pcs_base = pcs_base;
|
|
__entry->pcs_frame = *pcs_frame;
|
|
__entry->dtlb_entry = HYPERVISOR_mmu_probe((e2k_addr_t)pcs_base,
|
|
KVM_MMU_PROBE_ENTRY);
|
|
),
|
|
|
|
TP_printk(" %px (dtlb 0x%016lx) : 0x%016llx 0x%016llx "
|
|
"0x%016llx 0x%016llx",
|
|
__entry->pcs_base, __entry->dtlb_entry,
|
|
__entry->pcs_frame.cr0_lo.CR0_lo_half,
|
|
__entry->pcs_frame.cr0_hi.CR0_hi_half,
|
|
__entry->pcs_frame.cr1_lo.CR1_lo_half,
|
|
__entry->pcs_frame.cr1_hi.CR1_hi_half)
|
|
);
|
|
|
|
#include <asm/kvm/guest/trace-tlb-state.h>
|
|
|
|
#endif /* _KVM_GUEST_TRACE_COPY_HW_STACKS_H */
|
|
|
|
#undef TRACE_INCLUDE_PATH
|
|
#define TRACE_INCLUDE_PATH ../../arch/e2k/include/asm/kvm/guest
|
|
#undef TRACE_INCLUDE_FILE
|
|
#define TRACE_INCLUDE_FILE trace-hw-stacks
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|