18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#if !defined(_TRACE_KVMMMU_H) || defined(TRACE_HEADER_MULTI_READ) 38c2ecf20Sopenharmony_ci#define _TRACE_KVMMMU_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 68c2ecf20Sopenharmony_ci#include <linux/trace_events.h> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM 98c2ecf20Sopenharmony_ci#define TRACE_SYSTEM kvmmmu 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#define KVM_MMU_PAGE_FIELDS \ 128c2ecf20Sopenharmony_ci __field(__u8, mmu_valid_gen) \ 138c2ecf20Sopenharmony_ci __field(__u64, gfn) \ 148c2ecf20Sopenharmony_ci __field(__u32, role) \ 158c2ecf20Sopenharmony_ci __field(__u32, root_count) \ 168c2ecf20Sopenharmony_ci __field(bool, unsync) 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define KVM_MMU_PAGE_ASSIGN(sp) \ 198c2ecf20Sopenharmony_ci __entry->mmu_valid_gen = sp->mmu_valid_gen; \ 208c2ecf20Sopenharmony_ci __entry->gfn = sp->gfn; \ 218c2ecf20Sopenharmony_ci __entry->role = sp->role.word; \ 228c2ecf20Sopenharmony_ci __entry->root_count = sp->root_count; \ 238c2ecf20Sopenharmony_ci __entry->unsync = sp->unsync; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define KVM_MMU_PAGE_PRINTK() ({ \ 268c2ecf20Sopenharmony_ci const char *saved_ptr = trace_seq_buffer_ptr(p); \ 278c2ecf20Sopenharmony_ci static const char *access_str[] = { \ 288c2ecf20Sopenharmony_ci "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux" \ 298c2ecf20Sopenharmony_ci }; \ 308c2ecf20Sopenharmony_ci union kvm_mmu_page_role role; \ 318c2ecf20Sopenharmony_ci \ 328c2ecf20Sopenharmony_ci role.word = __entry->role; \ 338c2ecf20Sopenharmony_ci \ 348c2ecf20Sopenharmony_ci trace_seq_printf(p, "sp gen %u gfn %llx l%u %u-byte q%u%s %s%s" \ 358c2ecf20Sopenharmony_ci " %snxe %sad root %u %s%c", \ 368c2ecf20Sopenharmony_ci __entry->mmu_valid_gen, \ 378c2ecf20Sopenharmony_ci __entry->gfn, role.level, \ 388c2ecf20Sopenharmony_ci role.gpte_is_8_bytes ? 8 : 4, \ 398c2ecf20Sopenharmony_ci role.quadrant, \ 408c2ecf20Sopenharmony_ci role.direct ? " direct" : "", \ 418c2ecf20Sopenharmony_ci access_str[role.access], \ 428c2ecf20Sopenharmony_ci role.invalid ? " invalid" : "", \ 438c2ecf20Sopenharmony_ci role.nxe ? "" : "!", \ 448c2ecf20Sopenharmony_ci role.ad_disabled ? "!" : "", \ 458c2ecf20Sopenharmony_ci __entry->root_count, \ 468c2ecf20Sopenharmony_ci __entry->unsync ? "unsync" : "sync", 0); \ 478c2ecf20Sopenharmony_ci saved_ptr; \ 488c2ecf20Sopenharmony_ci }) 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define kvm_mmu_trace_pferr_flags \ 518c2ecf20Sopenharmony_ci { PFERR_PRESENT_MASK, "P" }, \ 528c2ecf20Sopenharmony_ci { PFERR_WRITE_MASK, "W" }, \ 538c2ecf20Sopenharmony_ci { PFERR_USER_MASK, "U" }, \ 548c2ecf20Sopenharmony_ci { PFERR_RSVD_MASK, "RSVD" }, \ 558c2ecf20Sopenharmony_ci { PFERR_FETCH_MASK, "F" } 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci/* 588c2ecf20Sopenharmony_ci * A pagetable walk has started 598c2ecf20Sopenharmony_ci */ 608c2ecf20Sopenharmony_ciTRACE_EVENT( 618c2ecf20Sopenharmony_ci kvm_mmu_pagetable_walk, 628c2ecf20Sopenharmony_ci TP_PROTO(u64 addr, u32 pferr), 638c2ecf20Sopenharmony_ci TP_ARGS(addr, pferr), 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci TP_STRUCT__entry( 668c2ecf20Sopenharmony_ci __field(__u64, addr) 678c2ecf20Sopenharmony_ci __field(__u32, pferr) 688c2ecf20Sopenharmony_ci ), 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci TP_fast_assign( 718c2ecf20Sopenharmony_ci __entry->addr = addr; 728c2ecf20Sopenharmony_ci __entry->pferr = pferr; 738c2ecf20Sopenharmony_ci ), 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci TP_printk("addr %llx pferr %x %s", __entry->addr, __entry->pferr, 768c2ecf20Sopenharmony_ci __print_flags(__entry->pferr, "|", kvm_mmu_trace_pferr_flags)) 778c2ecf20Sopenharmony_ci); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci/* We just walked a paging element */ 818c2ecf20Sopenharmony_ciTRACE_EVENT( 828c2ecf20Sopenharmony_ci kvm_mmu_paging_element, 838c2ecf20Sopenharmony_ci TP_PROTO(u64 pte, int level), 848c2ecf20Sopenharmony_ci TP_ARGS(pte, level), 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci TP_STRUCT__entry( 878c2ecf20Sopenharmony_ci __field(__u64, pte) 888c2ecf20Sopenharmony_ci __field(__u32, level) 898c2ecf20Sopenharmony_ci ), 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci TP_fast_assign( 928c2ecf20Sopenharmony_ci __entry->pte = pte; 938c2ecf20Sopenharmony_ci __entry->level = level; 948c2ecf20Sopenharmony_ci ), 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci TP_printk("pte %llx level %u", __entry->pte, __entry->level) 978c2ecf20Sopenharmony_ci); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(kvm_mmu_set_bit_class, 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci TP_PROTO(unsigned long table_gfn, unsigned index, unsigned size), 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci TP_ARGS(table_gfn, index, size), 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1068c2ecf20Sopenharmony_ci __field(__u64, gpa) 1078c2ecf20Sopenharmony_ci ), 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci TP_fast_assign( 1108c2ecf20Sopenharmony_ci __entry->gpa = ((u64)table_gfn << PAGE_SHIFT) 1118c2ecf20Sopenharmony_ci + index * size; 1128c2ecf20Sopenharmony_ci ), 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci TP_printk("gpa %llx", __entry->gpa) 1158c2ecf20Sopenharmony_ci); 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* We set a pte accessed bit */ 1188c2ecf20Sopenharmony_ciDEFINE_EVENT(kvm_mmu_set_bit_class, kvm_mmu_set_accessed_bit, 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci TP_PROTO(unsigned long table_gfn, unsigned index, unsigned size), 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci TP_ARGS(table_gfn, index, size) 1238c2ecf20Sopenharmony_ci); 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci/* We set a pte dirty bit */ 1268c2ecf20Sopenharmony_ciDEFINE_EVENT(kvm_mmu_set_bit_class, kvm_mmu_set_dirty_bit, 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci TP_PROTO(unsigned long table_gfn, unsigned index, unsigned size), 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci TP_ARGS(table_gfn, index, size) 1318c2ecf20Sopenharmony_ci); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ciTRACE_EVENT( 1348c2ecf20Sopenharmony_ci kvm_mmu_walker_error, 1358c2ecf20Sopenharmony_ci TP_PROTO(u32 pferr), 1368c2ecf20Sopenharmony_ci TP_ARGS(pferr), 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1398c2ecf20Sopenharmony_ci __field(__u32, pferr) 1408c2ecf20Sopenharmony_ci ), 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci TP_fast_assign( 1438c2ecf20Sopenharmony_ci __entry->pferr = pferr; 1448c2ecf20Sopenharmony_ci ), 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci TP_printk("pferr %x %s", __entry->pferr, 1478c2ecf20Sopenharmony_ci __print_flags(__entry->pferr, "|", kvm_mmu_trace_pferr_flags)) 1488c2ecf20Sopenharmony_ci); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ciTRACE_EVENT( 1518c2ecf20Sopenharmony_ci kvm_mmu_get_page, 1528c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_mmu_page *sp, bool created), 1538c2ecf20Sopenharmony_ci TP_ARGS(sp, created), 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1568c2ecf20Sopenharmony_ci KVM_MMU_PAGE_FIELDS 1578c2ecf20Sopenharmony_ci __field(bool, created) 1588c2ecf20Sopenharmony_ci ), 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci TP_fast_assign( 1618c2ecf20Sopenharmony_ci KVM_MMU_PAGE_ASSIGN(sp) 1628c2ecf20Sopenharmony_ci __entry->created = created; 1638c2ecf20Sopenharmony_ci ), 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci TP_printk("%s %s", KVM_MMU_PAGE_PRINTK(), 1668c2ecf20Sopenharmony_ci __entry->created ? "new" : "existing") 1678c2ecf20Sopenharmony_ci); 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(kvm_mmu_page_class, 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_mmu_page *sp), 1728c2ecf20Sopenharmony_ci TP_ARGS(sp), 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1758c2ecf20Sopenharmony_ci KVM_MMU_PAGE_FIELDS 1768c2ecf20Sopenharmony_ci ), 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci TP_fast_assign( 1798c2ecf20Sopenharmony_ci KVM_MMU_PAGE_ASSIGN(sp) 1808c2ecf20Sopenharmony_ci ), 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci TP_printk("%s", KVM_MMU_PAGE_PRINTK()) 1838c2ecf20Sopenharmony_ci); 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ciDEFINE_EVENT(kvm_mmu_page_class, kvm_mmu_sync_page, 1868c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_mmu_page *sp), 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci TP_ARGS(sp) 1898c2ecf20Sopenharmony_ci); 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ciDEFINE_EVENT(kvm_mmu_page_class, kvm_mmu_unsync_page, 1928c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_mmu_page *sp), 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci TP_ARGS(sp) 1958c2ecf20Sopenharmony_ci); 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ciDEFINE_EVENT(kvm_mmu_page_class, kvm_mmu_prepare_zap_page, 1988c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_mmu_page *sp), 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci TP_ARGS(sp) 2018c2ecf20Sopenharmony_ci); 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ciTRACE_EVENT( 2048c2ecf20Sopenharmony_ci mark_mmio_spte, 2058c2ecf20Sopenharmony_ci TP_PROTO(u64 *sptep, gfn_t gfn, u64 spte), 2068c2ecf20Sopenharmony_ci TP_ARGS(sptep, gfn, spte), 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2098c2ecf20Sopenharmony_ci __field(void *, sptep) 2108c2ecf20Sopenharmony_ci __field(gfn_t, gfn) 2118c2ecf20Sopenharmony_ci __field(unsigned, access) 2128c2ecf20Sopenharmony_ci __field(unsigned int, gen) 2138c2ecf20Sopenharmony_ci ), 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci TP_fast_assign( 2168c2ecf20Sopenharmony_ci __entry->sptep = sptep; 2178c2ecf20Sopenharmony_ci __entry->gfn = gfn; 2188c2ecf20Sopenharmony_ci __entry->access = spte & ACC_ALL; 2198c2ecf20Sopenharmony_ci __entry->gen = get_mmio_spte_generation(spte); 2208c2ecf20Sopenharmony_ci ), 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci TP_printk("sptep:%p gfn %llx access %x gen %x", __entry->sptep, 2238c2ecf20Sopenharmony_ci __entry->gfn, __entry->access, __entry->gen) 2248c2ecf20Sopenharmony_ci); 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ciTRACE_EVENT( 2278c2ecf20Sopenharmony_ci handle_mmio_page_fault, 2288c2ecf20Sopenharmony_ci TP_PROTO(u64 addr, gfn_t gfn, unsigned access), 2298c2ecf20Sopenharmony_ci TP_ARGS(addr, gfn, access), 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2328c2ecf20Sopenharmony_ci __field(u64, addr) 2338c2ecf20Sopenharmony_ci __field(gfn_t, gfn) 2348c2ecf20Sopenharmony_ci __field(unsigned, access) 2358c2ecf20Sopenharmony_ci ), 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci TP_fast_assign( 2388c2ecf20Sopenharmony_ci __entry->addr = addr; 2398c2ecf20Sopenharmony_ci __entry->gfn = gfn; 2408c2ecf20Sopenharmony_ci __entry->access = access; 2418c2ecf20Sopenharmony_ci ), 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci TP_printk("addr:%llx gfn %llx access %x", __entry->addr, __entry->gfn, 2448c2ecf20Sopenharmony_ci __entry->access) 2458c2ecf20Sopenharmony_ci); 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ciTRACE_EVENT( 2488c2ecf20Sopenharmony_ci fast_page_fault, 2498c2ecf20Sopenharmony_ci TP_PROTO(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 error_code, 2508c2ecf20Sopenharmony_ci u64 *sptep, u64 old_spte, int ret), 2518c2ecf20Sopenharmony_ci TP_ARGS(vcpu, cr2_or_gpa, error_code, sptep, old_spte, ret), 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2548c2ecf20Sopenharmony_ci __field(int, vcpu_id) 2558c2ecf20Sopenharmony_ci __field(gpa_t, cr2_or_gpa) 2568c2ecf20Sopenharmony_ci __field(u32, error_code) 2578c2ecf20Sopenharmony_ci __field(u64 *, sptep) 2588c2ecf20Sopenharmony_ci __field(u64, old_spte) 2598c2ecf20Sopenharmony_ci __field(u64, new_spte) 2608c2ecf20Sopenharmony_ci __field(int, ret) 2618c2ecf20Sopenharmony_ci ), 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci TP_fast_assign( 2648c2ecf20Sopenharmony_ci __entry->vcpu_id = vcpu->vcpu_id; 2658c2ecf20Sopenharmony_ci __entry->cr2_or_gpa = cr2_or_gpa; 2668c2ecf20Sopenharmony_ci __entry->error_code = error_code; 2678c2ecf20Sopenharmony_ci __entry->sptep = sptep; 2688c2ecf20Sopenharmony_ci __entry->old_spte = old_spte; 2698c2ecf20Sopenharmony_ci __entry->new_spte = *sptep; 2708c2ecf20Sopenharmony_ci __entry->ret = ret; 2718c2ecf20Sopenharmony_ci ), 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci TP_printk("vcpu %d gva %llx error_code %s sptep %p old %#llx" 2748c2ecf20Sopenharmony_ci " new %llx spurious %d fixed %d", __entry->vcpu_id, 2758c2ecf20Sopenharmony_ci __entry->cr2_or_gpa, __print_flags(__entry->error_code, "|", 2768c2ecf20Sopenharmony_ci kvm_mmu_trace_pferr_flags), __entry->sptep, 2778c2ecf20Sopenharmony_ci __entry->old_spte, __entry->new_spte, 2788c2ecf20Sopenharmony_ci __entry->ret == RET_PF_SPURIOUS, __entry->ret == RET_PF_FIXED 2798c2ecf20Sopenharmony_ci ) 2808c2ecf20Sopenharmony_ci); 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ciTRACE_EVENT( 2838c2ecf20Sopenharmony_ci kvm_mmu_zap_all_fast, 2848c2ecf20Sopenharmony_ci TP_PROTO(struct kvm *kvm), 2858c2ecf20Sopenharmony_ci TP_ARGS(kvm), 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2888c2ecf20Sopenharmony_ci __field(__u8, mmu_valid_gen) 2898c2ecf20Sopenharmony_ci __field(unsigned int, mmu_used_pages) 2908c2ecf20Sopenharmony_ci ), 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci TP_fast_assign( 2938c2ecf20Sopenharmony_ci __entry->mmu_valid_gen = kvm->arch.mmu_valid_gen; 2948c2ecf20Sopenharmony_ci __entry->mmu_used_pages = kvm->arch.n_used_mmu_pages; 2958c2ecf20Sopenharmony_ci ), 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci TP_printk("kvm-mmu-valid-gen %u used_pages %x", 2988c2ecf20Sopenharmony_ci __entry->mmu_valid_gen, __entry->mmu_used_pages 2998c2ecf20Sopenharmony_ci ) 3008c2ecf20Sopenharmony_ci); 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciTRACE_EVENT( 3048c2ecf20Sopenharmony_ci check_mmio_spte, 3058c2ecf20Sopenharmony_ci TP_PROTO(u64 spte, unsigned int kvm_gen, unsigned int spte_gen), 3068c2ecf20Sopenharmony_ci TP_ARGS(spte, kvm_gen, spte_gen), 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci TP_STRUCT__entry( 3098c2ecf20Sopenharmony_ci __field(unsigned int, kvm_gen) 3108c2ecf20Sopenharmony_ci __field(unsigned int, spte_gen) 3118c2ecf20Sopenharmony_ci __field(u64, spte) 3128c2ecf20Sopenharmony_ci ), 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci TP_fast_assign( 3158c2ecf20Sopenharmony_ci __entry->kvm_gen = kvm_gen; 3168c2ecf20Sopenharmony_ci __entry->spte_gen = spte_gen; 3178c2ecf20Sopenharmony_ci __entry->spte = spte; 3188c2ecf20Sopenharmony_ci ), 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci TP_printk("spte %llx kvm_gen %x spte-gen %x valid %d", __entry->spte, 3218c2ecf20Sopenharmony_ci __entry->kvm_gen, __entry->spte_gen, 3228c2ecf20Sopenharmony_ci __entry->kvm_gen == __entry->spte_gen 3238c2ecf20Sopenharmony_ci ) 3248c2ecf20Sopenharmony_ci); 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ciTRACE_EVENT( 3278c2ecf20Sopenharmony_ci kvm_mmu_set_spte, 3288c2ecf20Sopenharmony_ci TP_PROTO(int level, gfn_t gfn, u64 *sptep), 3298c2ecf20Sopenharmony_ci TP_ARGS(level, gfn, sptep), 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci TP_STRUCT__entry( 3328c2ecf20Sopenharmony_ci __field(u64, gfn) 3338c2ecf20Sopenharmony_ci __field(u64, spte) 3348c2ecf20Sopenharmony_ci __field(u64, sptep) 3358c2ecf20Sopenharmony_ci __field(u8, level) 3368c2ecf20Sopenharmony_ci /* These depend on page entry type, so compute them now. */ 3378c2ecf20Sopenharmony_ci __field(bool, r) 3388c2ecf20Sopenharmony_ci __field(bool, x) 3398c2ecf20Sopenharmony_ci __field(signed char, u) 3408c2ecf20Sopenharmony_ci ), 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci TP_fast_assign( 3438c2ecf20Sopenharmony_ci __entry->gfn = gfn; 3448c2ecf20Sopenharmony_ci __entry->spte = *sptep; 3458c2ecf20Sopenharmony_ci __entry->sptep = virt_to_phys(sptep); 3468c2ecf20Sopenharmony_ci __entry->level = level; 3478c2ecf20Sopenharmony_ci __entry->r = shadow_present_mask || (__entry->spte & PT_PRESENT_MASK); 3488c2ecf20Sopenharmony_ci __entry->x = is_executable_pte(__entry->spte); 3498c2ecf20Sopenharmony_ci __entry->u = shadow_user_mask ? !!(__entry->spte & shadow_user_mask) : -1; 3508c2ecf20Sopenharmony_ci ), 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci TP_printk("gfn %llx spte %llx (%s%s%s%s) level %d at %llx", 3538c2ecf20Sopenharmony_ci __entry->gfn, __entry->spte, 3548c2ecf20Sopenharmony_ci __entry->r ? "r" : "-", 3558c2ecf20Sopenharmony_ci __entry->spte & PT_WRITABLE_MASK ? "w" : "-", 3568c2ecf20Sopenharmony_ci __entry->x ? "x" : "-", 3578c2ecf20Sopenharmony_ci __entry->u == -1 ? "" : (__entry->u ? "u" : "-"), 3588c2ecf20Sopenharmony_ci __entry->level, __entry->sptep 3598c2ecf20Sopenharmony_ci ) 3608c2ecf20Sopenharmony_ci); 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ciTRACE_EVENT( 3638c2ecf20Sopenharmony_ci kvm_mmu_spte_requested, 3648c2ecf20Sopenharmony_ci TP_PROTO(gpa_t addr, int level, kvm_pfn_t pfn), 3658c2ecf20Sopenharmony_ci TP_ARGS(addr, level, pfn), 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ci TP_STRUCT__entry( 3688c2ecf20Sopenharmony_ci __field(u64, gfn) 3698c2ecf20Sopenharmony_ci __field(u64, pfn) 3708c2ecf20Sopenharmony_ci __field(u8, level) 3718c2ecf20Sopenharmony_ci ), 3728c2ecf20Sopenharmony_ci 3738c2ecf20Sopenharmony_ci TP_fast_assign( 3748c2ecf20Sopenharmony_ci __entry->gfn = addr >> PAGE_SHIFT; 3758c2ecf20Sopenharmony_ci __entry->pfn = pfn | (__entry->gfn & (KVM_PAGES_PER_HPAGE(level) - 1)); 3768c2ecf20Sopenharmony_ci __entry->level = level; 3778c2ecf20Sopenharmony_ci ), 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci TP_printk("gfn %llx pfn %llx level %d", 3808c2ecf20Sopenharmony_ci __entry->gfn, __entry->pfn, __entry->level 3818c2ecf20Sopenharmony_ci ) 3828c2ecf20Sopenharmony_ci); 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci#endif /* _TRACE_KVMMMU_H */ 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_PATH 3878c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_PATH mmu 3888c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_FILE 3898c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_FILE mmutrace 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_ci/* This part must be outside protection */ 3928c2ecf20Sopenharmony_ci#include <trace/define_trace.h> 393