18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM
38c2ecf20Sopenharmony_ci#define TRACE_SYSTEM xen
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#if !defined(_TRACE_XEN_H) || defined(TRACE_HEADER_MULTI_READ)
68c2ecf20Sopenharmony_ci#define _TRACE_XEN_H
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/tracepoint.h>
98c2ecf20Sopenharmony_ci#include <asm/paravirt_types.h>
108c2ecf20Sopenharmony_ci#include <asm/xen/trace_types.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct multicall_entry;
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/* Multicalls */
158c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(xen_mc__batch,
168c2ecf20Sopenharmony_ci	    TP_PROTO(enum paravirt_lazy_mode mode),
178c2ecf20Sopenharmony_ci	    TP_ARGS(mode),
188c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
198c2ecf20Sopenharmony_ci		    __field(enum paravirt_lazy_mode, mode)
208c2ecf20Sopenharmony_ci		    ),
218c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mode = mode),
228c2ecf20Sopenharmony_ci	    TP_printk("start batch LAZY_%s",
238c2ecf20Sopenharmony_ci		      (__entry->mode == PARAVIRT_LAZY_MMU) ? "MMU" :
248c2ecf20Sopenharmony_ci		      (__entry->mode == PARAVIRT_LAZY_CPU) ? "CPU" : "NONE")
258c2ecf20Sopenharmony_ci	);
268c2ecf20Sopenharmony_ci#define DEFINE_XEN_MC_BATCH(name)			\
278c2ecf20Sopenharmony_ci	DEFINE_EVENT(xen_mc__batch, name,		\
288c2ecf20Sopenharmony_ci		TP_PROTO(enum paravirt_lazy_mode mode),	\
298c2ecf20Sopenharmony_ci		     TP_ARGS(mode))
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ciDEFINE_XEN_MC_BATCH(xen_mc_batch);
328c2ecf20Sopenharmony_ciDEFINE_XEN_MC_BATCH(xen_mc_issue);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ciTRACE_DEFINE_SIZEOF(ulong);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_entry,
378c2ecf20Sopenharmony_ci	    TP_PROTO(struct multicall_entry *mc, unsigned nargs),
388c2ecf20Sopenharmony_ci	    TP_ARGS(mc, nargs),
398c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
408c2ecf20Sopenharmony_ci		    __field(unsigned int, op)
418c2ecf20Sopenharmony_ci		    __field(unsigned int, nargs)
428c2ecf20Sopenharmony_ci		    __array(unsigned long, args, 6)
438c2ecf20Sopenharmony_ci		    ),
448c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->op = mc->op;
458c2ecf20Sopenharmony_ci			   __entry->nargs = nargs;
468c2ecf20Sopenharmony_ci			   memcpy(__entry->args, mc->args, sizeof(ulong) * nargs);
478c2ecf20Sopenharmony_ci			   memset(__entry->args + nargs, 0, sizeof(ulong) * (6 - nargs));
488c2ecf20Sopenharmony_ci		    ),
498c2ecf20Sopenharmony_ci	    TP_printk("op %u%s args [%lx, %lx, %lx, %lx, %lx, %lx]",
508c2ecf20Sopenharmony_ci		      __entry->op, xen_hypercall_name(__entry->op),
518c2ecf20Sopenharmony_ci		      __entry->args[0], __entry->args[1], __entry->args[2],
528c2ecf20Sopenharmony_ci		      __entry->args[3], __entry->args[4], __entry->args[5])
538c2ecf20Sopenharmony_ci	);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_entry_alloc,
568c2ecf20Sopenharmony_ci	    TP_PROTO(size_t args),
578c2ecf20Sopenharmony_ci	    TP_ARGS(args),
588c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
598c2ecf20Sopenharmony_ci		    __field(size_t, args)
608c2ecf20Sopenharmony_ci		    ),
618c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->args = args),
628c2ecf20Sopenharmony_ci	    TP_printk("alloc entry %zu arg bytes", __entry->args)
638c2ecf20Sopenharmony_ci	);
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_callback,
668c2ecf20Sopenharmony_ci	    TP_PROTO(xen_mc_callback_fn_t fn, void *data),
678c2ecf20Sopenharmony_ci	    TP_ARGS(fn, data),
688c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
698c2ecf20Sopenharmony_ci		    /*
708c2ecf20Sopenharmony_ci		     * Use field_struct to avoid is_signed_type()
718c2ecf20Sopenharmony_ci		     * comparison of a function pointer.
728c2ecf20Sopenharmony_ci		     */
738c2ecf20Sopenharmony_ci		    __field_struct(xen_mc_callback_fn_t, fn)
748c2ecf20Sopenharmony_ci		    __field(void *, data)
758c2ecf20Sopenharmony_ci		    ),
768c2ecf20Sopenharmony_ci	    TP_fast_assign(
778c2ecf20Sopenharmony_ci		    __entry->fn = fn;
788c2ecf20Sopenharmony_ci		    __entry->data = data;
798c2ecf20Sopenharmony_ci		    ),
808c2ecf20Sopenharmony_ci	    TP_printk("callback %ps, data %p",
818c2ecf20Sopenharmony_ci		      __entry->fn, __entry->data)
828c2ecf20Sopenharmony_ci	);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_flush_reason,
858c2ecf20Sopenharmony_ci	    TP_PROTO(enum xen_mc_flush_reason reason),
868c2ecf20Sopenharmony_ci	    TP_ARGS(reason),
878c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
888c2ecf20Sopenharmony_ci		    __field(enum xen_mc_flush_reason, reason)
898c2ecf20Sopenharmony_ci		    ),
908c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->reason = reason),
918c2ecf20Sopenharmony_ci	    TP_printk("flush reason %s",
928c2ecf20Sopenharmony_ci		      (__entry->reason == XEN_MC_FL_NONE) ? "NONE" :
938c2ecf20Sopenharmony_ci		      (__entry->reason == XEN_MC_FL_BATCH) ? "BATCH" :
948c2ecf20Sopenharmony_ci		      (__entry->reason == XEN_MC_FL_ARGS) ? "ARGS" :
958c2ecf20Sopenharmony_ci		      (__entry->reason == XEN_MC_FL_CALLBACK) ? "CALLBACK" : "??")
968c2ecf20Sopenharmony_ci	);
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_flush,
998c2ecf20Sopenharmony_ci	    TP_PROTO(unsigned mcidx, unsigned argidx, unsigned cbidx),
1008c2ecf20Sopenharmony_ci	    TP_ARGS(mcidx, argidx, cbidx),
1018c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1028c2ecf20Sopenharmony_ci		    __field(unsigned, mcidx)
1038c2ecf20Sopenharmony_ci		    __field(unsigned, argidx)
1048c2ecf20Sopenharmony_ci		    __field(unsigned, cbidx)
1058c2ecf20Sopenharmony_ci		    ),
1068c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mcidx = mcidx;
1078c2ecf20Sopenharmony_ci			   __entry->argidx = argidx;
1088c2ecf20Sopenharmony_ci			   __entry->cbidx = cbidx),
1098c2ecf20Sopenharmony_ci	    TP_printk("flushing %u hypercalls, %u arg bytes, %u callbacks",
1108c2ecf20Sopenharmony_ci		      __entry->mcidx, __entry->argidx, __entry->cbidx)
1118c2ecf20Sopenharmony_ci	);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mc_extend_args,
1148c2ecf20Sopenharmony_ci	    TP_PROTO(unsigned long op, size_t args, enum xen_mc_extend_args res),
1158c2ecf20Sopenharmony_ci	    TP_ARGS(op, args, res),
1168c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1178c2ecf20Sopenharmony_ci		    __field(unsigned int, op)
1188c2ecf20Sopenharmony_ci		    __field(size_t, args)
1198c2ecf20Sopenharmony_ci		    __field(enum xen_mc_extend_args, res)
1208c2ecf20Sopenharmony_ci		    ),
1218c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->op = op;
1228c2ecf20Sopenharmony_ci			   __entry->args = args;
1238c2ecf20Sopenharmony_ci			   __entry->res = res),
1248c2ecf20Sopenharmony_ci	    TP_printk("extending op %u%s by %zu bytes res %s",
1258c2ecf20Sopenharmony_ci		      __entry->op, xen_hypercall_name(__entry->op),
1268c2ecf20Sopenharmony_ci		      __entry->args,
1278c2ecf20Sopenharmony_ci		      __entry->res == XEN_MC_XE_OK ? "OK" :
1288c2ecf20Sopenharmony_ci		      __entry->res == XEN_MC_XE_BAD_OP ? "BAD_OP" :
1298c2ecf20Sopenharmony_ci		      __entry->res == XEN_MC_XE_NO_SPACE ? "NO_SPACE" : "???")
1308c2ecf20Sopenharmony_ci	);
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ciTRACE_DEFINE_SIZEOF(pteval_t);
1338c2ecf20Sopenharmony_ci/* mmu */
1348c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(xen_mmu__set_pte,
1358c2ecf20Sopenharmony_ci	    TP_PROTO(pte_t *ptep, pte_t pteval),
1368c2ecf20Sopenharmony_ci	    TP_ARGS(ptep, pteval),
1378c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1388c2ecf20Sopenharmony_ci		    __field(pte_t *, ptep)
1398c2ecf20Sopenharmony_ci		    __field(pteval_t, pteval)
1408c2ecf20Sopenharmony_ci		    ),
1418c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->ptep = ptep;
1428c2ecf20Sopenharmony_ci			   __entry->pteval = pteval.pte),
1438c2ecf20Sopenharmony_ci	    TP_printk("ptep %p pteval %0*llx (raw %0*llx)",
1448c2ecf20Sopenharmony_ci		      __entry->ptep,
1458c2ecf20Sopenharmony_ci		      (int)sizeof(pteval_t) * 2, (unsigned long long)pte_val(native_make_pte(__entry->pteval)),
1468c2ecf20Sopenharmony_ci		      (int)sizeof(pteval_t) * 2, (unsigned long long)__entry->pteval)
1478c2ecf20Sopenharmony_ci	);
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci#define DEFINE_XEN_MMU_SET_PTE(name)				\
1508c2ecf20Sopenharmony_ci	DEFINE_EVENT(xen_mmu__set_pte, name,			\
1518c2ecf20Sopenharmony_ci		     TP_PROTO(pte_t *ptep, pte_t pteval),	\
1528c2ecf20Sopenharmony_ci		     TP_ARGS(ptep, pteval))
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_SET_PTE(xen_mmu_set_pte);
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ciTRACE_DEFINE_SIZEOF(pmdval_t);
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_set_pmd,
1598c2ecf20Sopenharmony_ci	    TP_PROTO(pmd_t *pmdp, pmd_t pmdval),
1608c2ecf20Sopenharmony_ci	    TP_ARGS(pmdp, pmdval),
1618c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1628c2ecf20Sopenharmony_ci		    __field(pmd_t *, pmdp)
1638c2ecf20Sopenharmony_ci		    __field(pmdval_t, pmdval)
1648c2ecf20Sopenharmony_ci		    ),
1658c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->pmdp = pmdp;
1668c2ecf20Sopenharmony_ci			   __entry->pmdval = pmdval.pmd),
1678c2ecf20Sopenharmony_ci	    TP_printk("pmdp %p pmdval %0*llx (raw %0*llx)",
1688c2ecf20Sopenharmony_ci		      __entry->pmdp,
1698c2ecf20Sopenharmony_ci		      (int)sizeof(pmdval_t) * 2, (unsigned long long)pmd_val(native_make_pmd(__entry->pmdval)),
1708c2ecf20Sopenharmony_ci		      (int)sizeof(pmdval_t) * 2, (unsigned long long)__entry->pmdval)
1718c2ecf20Sopenharmony_ci	);
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_PAE
1748c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_SET_PTE(xen_mmu_set_pte_atomic);
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_pte_clear,
1778c2ecf20Sopenharmony_ci	    TP_PROTO(struct mm_struct *mm, unsigned long addr, pte_t *ptep),
1788c2ecf20Sopenharmony_ci	    TP_ARGS(mm, addr, ptep),
1798c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1808c2ecf20Sopenharmony_ci		    __field(struct mm_struct *, mm)
1818c2ecf20Sopenharmony_ci		    __field(unsigned long, addr)
1828c2ecf20Sopenharmony_ci		    __field(pte_t *, ptep)
1838c2ecf20Sopenharmony_ci		    ),
1848c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mm = mm;
1858c2ecf20Sopenharmony_ci			   __entry->addr = addr;
1868c2ecf20Sopenharmony_ci			   __entry->ptep = ptep),
1878c2ecf20Sopenharmony_ci	    TP_printk("mm %p addr %lx ptep %p",
1888c2ecf20Sopenharmony_ci		      __entry->mm, __entry->addr, __entry->ptep)
1898c2ecf20Sopenharmony_ci	);
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_pmd_clear,
1928c2ecf20Sopenharmony_ci	    TP_PROTO(pmd_t *pmdp),
1938c2ecf20Sopenharmony_ci	    TP_ARGS(pmdp),
1948c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
1958c2ecf20Sopenharmony_ci		    __field(pmd_t *, pmdp)
1968c2ecf20Sopenharmony_ci		    ),
1978c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->pmdp = pmdp),
1988c2ecf20Sopenharmony_ci	    TP_printk("pmdp %p", __entry->pmdp)
1998c2ecf20Sopenharmony_ci	);
2008c2ecf20Sopenharmony_ci#endif
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci#if CONFIG_PGTABLE_LEVELS >= 4
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ciTRACE_DEFINE_SIZEOF(pudval_t);
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_set_pud,
2078c2ecf20Sopenharmony_ci	    TP_PROTO(pud_t *pudp, pud_t pudval),
2088c2ecf20Sopenharmony_ci	    TP_ARGS(pudp, pudval),
2098c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
2108c2ecf20Sopenharmony_ci		    __field(pud_t *, pudp)
2118c2ecf20Sopenharmony_ci		    __field(pudval_t, pudval)
2128c2ecf20Sopenharmony_ci		    ),
2138c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->pudp = pudp;
2148c2ecf20Sopenharmony_ci			   __entry->pudval = native_pud_val(pudval)),
2158c2ecf20Sopenharmony_ci	    TP_printk("pudp %p pudval %0*llx (raw %0*llx)",
2168c2ecf20Sopenharmony_ci		      __entry->pudp,
2178c2ecf20Sopenharmony_ci		      (int)sizeof(pudval_t) * 2, (unsigned long long)pud_val(native_make_pud(__entry->pudval)),
2188c2ecf20Sopenharmony_ci		      (int)sizeof(pudval_t) * 2, (unsigned long long)__entry->pudval)
2198c2ecf20Sopenharmony_ci	);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ciTRACE_DEFINE_SIZEOF(p4dval_t);
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_set_p4d,
2248c2ecf20Sopenharmony_ci	    TP_PROTO(p4d_t *p4dp, p4d_t *user_p4dp, p4d_t p4dval),
2258c2ecf20Sopenharmony_ci	    TP_ARGS(p4dp, user_p4dp, p4dval),
2268c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
2278c2ecf20Sopenharmony_ci		    __field(p4d_t *, p4dp)
2288c2ecf20Sopenharmony_ci		    __field(p4d_t *, user_p4dp)
2298c2ecf20Sopenharmony_ci		    __field(p4dval_t, p4dval)
2308c2ecf20Sopenharmony_ci		    ),
2318c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->p4dp = p4dp;
2328c2ecf20Sopenharmony_ci			   __entry->user_p4dp = user_p4dp;
2338c2ecf20Sopenharmony_ci			   __entry->p4dval = p4d_val(p4dval)),
2348c2ecf20Sopenharmony_ci	    TP_printk("p4dp %p user_p4dp %p p4dval %0*llx (raw %0*llx)",
2358c2ecf20Sopenharmony_ci		      __entry->p4dp, __entry->user_p4dp,
2368c2ecf20Sopenharmony_ci		      (int)sizeof(p4dval_t) * 2, (unsigned long long)pgd_val(native_make_pgd(__entry->p4dval)),
2378c2ecf20Sopenharmony_ci		      (int)sizeof(p4dval_t) * 2, (unsigned long long)__entry->p4dval)
2388c2ecf20Sopenharmony_ci	);
2398c2ecf20Sopenharmony_ci#else
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_set_pud,
2428c2ecf20Sopenharmony_ci	    TP_PROTO(pud_t *pudp, pud_t pudval),
2438c2ecf20Sopenharmony_ci	    TP_ARGS(pudp, pudval),
2448c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
2458c2ecf20Sopenharmony_ci		    __field(pud_t *, pudp)
2468c2ecf20Sopenharmony_ci		    __field(pudval_t, pudval)
2478c2ecf20Sopenharmony_ci		    ),
2488c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->pudp = pudp;
2498c2ecf20Sopenharmony_ci			   __entry->pudval = native_pud_val(pudval)),
2508c2ecf20Sopenharmony_ci	    TP_printk("pudp %p pudval %0*llx (raw %0*llx)",
2518c2ecf20Sopenharmony_ci		      __entry->pudp,
2528c2ecf20Sopenharmony_ci		      (int)sizeof(pudval_t) * 2, (unsigned long long)pgd_val(native_make_pgd(__entry->pudval)),
2538c2ecf20Sopenharmony_ci		      (int)sizeof(pudval_t) * 2, (unsigned long long)__entry->pudval)
2548c2ecf20Sopenharmony_ci	);
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci#endif
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(xen_mmu_ptep_modify_prot,
2598c2ecf20Sopenharmony_ci	    TP_PROTO(struct mm_struct *mm, unsigned long addr,
2608c2ecf20Sopenharmony_ci		     pte_t *ptep, pte_t pteval),
2618c2ecf20Sopenharmony_ci	    TP_ARGS(mm, addr, ptep, pteval),
2628c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
2638c2ecf20Sopenharmony_ci		    __field(struct mm_struct *, mm)
2648c2ecf20Sopenharmony_ci		    __field(unsigned long, addr)
2658c2ecf20Sopenharmony_ci		    __field(pte_t *, ptep)
2668c2ecf20Sopenharmony_ci		    __field(pteval_t, pteval)
2678c2ecf20Sopenharmony_ci		    ),
2688c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mm = mm;
2698c2ecf20Sopenharmony_ci			   __entry->addr = addr;
2708c2ecf20Sopenharmony_ci			   __entry->ptep = ptep;
2718c2ecf20Sopenharmony_ci			   __entry->pteval = pteval.pte),
2728c2ecf20Sopenharmony_ci	    TP_printk("mm %p addr %lx ptep %p pteval %0*llx (raw %0*llx)",
2738c2ecf20Sopenharmony_ci		      __entry->mm, __entry->addr, __entry->ptep,
2748c2ecf20Sopenharmony_ci		      (int)sizeof(pteval_t) * 2, (unsigned long long)pte_val(native_make_pte(__entry->pteval)),
2758c2ecf20Sopenharmony_ci		      (int)sizeof(pteval_t) * 2, (unsigned long long)__entry->pteval)
2768c2ecf20Sopenharmony_ci	);
2778c2ecf20Sopenharmony_ci#define DEFINE_XEN_MMU_PTEP_MODIFY_PROT(name)				\
2788c2ecf20Sopenharmony_ci	DEFINE_EVENT(xen_mmu_ptep_modify_prot, name,			\
2798c2ecf20Sopenharmony_ci		     TP_PROTO(struct mm_struct *mm, unsigned long addr,	\
2808c2ecf20Sopenharmony_ci			      pte_t *ptep, pte_t pteval),		\
2818c2ecf20Sopenharmony_ci		     TP_ARGS(mm, addr, ptep, pteval))
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_PTEP_MODIFY_PROT(xen_mmu_ptep_modify_prot_start);
2848c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_PTEP_MODIFY_PROT(xen_mmu_ptep_modify_prot_commit);
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_alloc_ptpage,
2878c2ecf20Sopenharmony_ci	    TP_PROTO(struct mm_struct *mm, unsigned long pfn, unsigned level, bool pinned),
2888c2ecf20Sopenharmony_ci	    TP_ARGS(mm, pfn, level, pinned),
2898c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
2908c2ecf20Sopenharmony_ci		    __field(struct mm_struct *, mm)
2918c2ecf20Sopenharmony_ci		    __field(unsigned long, pfn)
2928c2ecf20Sopenharmony_ci		    __field(unsigned, level)
2938c2ecf20Sopenharmony_ci		    __field(bool, pinned)
2948c2ecf20Sopenharmony_ci		    ),
2958c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mm = mm;
2968c2ecf20Sopenharmony_ci			   __entry->pfn = pfn;
2978c2ecf20Sopenharmony_ci			   __entry->level = level;
2988c2ecf20Sopenharmony_ci			   __entry->pinned = pinned),
2998c2ecf20Sopenharmony_ci	    TP_printk("mm %p  pfn %lx  level %d  %spinned",
3008c2ecf20Sopenharmony_ci		      __entry->mm, __entry->pfn, __entry->level,
3018c2ecf20Sopenharmony_ci		      __entry->pinned ? "" : "un")
3028c2ecf20Sopenharmony_ci	);
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_release_ptpage,
3058c2ecf20Sopenharmony_ci	    TP_PROTO(unsigned long pfn, unsigned level, bool pinned),
3068c2ecf20Sopenharmony_ci	    TP_ARGS(pfn, level, pinned),
3078c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3088c2ecf20Sopenharmony_ci		    __field(unsigned long, pfn)
3098c2ecf20Sopenharmony_ci		    __field(unsigned, level)
3108c2ecf20Sopenharmony_ci		    __field(bool, pinned)
3118c2ecf20Sopenharmony_ci		    ),
3128c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->pfn = pfn;
3138c2ecf20Sopenharmony_ci			   __entry->level = level;
3148c2ecf20Sopenharmony_ci			   __entry->pinned = pinned),
3158c2ecf20Sopenharmony_ci	    TP_printk("pfn %lx  level %d  %spinned",
3168c2ecf20Sopenharmony_ci		      __entry->pfn, __entry->level,
3178c2ecf20Sopenharmony_ci		      __entry->pinned ? "" : "un")
3188c2ecf20Sopenharmony_ci	);
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(xen_mmu_pgd,
3218c2ecf20Sopenharmony_ci	    TP_PROTO(struct mm_struct *mm, pgd_t *pgd),
3228c2ecf20Sopenharmony_ci	    TP_ARGS(mm, pgd),
3238c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3248c2ecf20Sopenharmony_ci		    __field(struct mm_struct *, mm)
3258c2ecf20Sopenharmony_ci		    __field(pgd_t *, pgd)
3268c2ecf20Sopenharmony_ci		    ),
3278c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->mm = mm;
3288c2ecf20Sopenharmony_ci			   __entry->pgd = pgd),
3298c2ecf20Sopenharmony_ci	    TP_printk("mm %p pgd %p", __entry->mm, __entry->pgd)
3308c2ecf20Sopenharmony_ci	);
3318c2ecf20Sopenharmony_ci#define DEFINE_XEN_MMU_PGD_EVENT(name)				\
3328c2ecf20Sopenharmony_ci	DEFINE_EVENT(xen_mmu_pgd, name,				\
3338c2ecf20Sopenharmony_ci		TP_PROTO(struct mm_struct *mm, pgd_t *pgd),	\
3348c2ecf20Sopenharmony_ci		     TP_ARGS(mm, pgd))
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_PGD_EVENT(xen_mmu_pgd_pin);
3378c2ecf20Sopenharmony_ciDEFINE_XEN_MMU_PGD_EVENT(xen_mmu_pgd_unpin);
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_flush_tlb_one_user,
3408c2ecf20Sopenharmony_ci	    TP_PROTO(unsigned long addr),
3418c2ecf20Sopenharmony_ci	    TP_ARGS(addr),
3428c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3438c2ecf20Sopenharmony_ci		    __field(unsigned long, addr)
3448c2ecf20Sopenharmony_ci		    ),
3458c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->addr = addr),
3468c2ecf20Sopenharmony_ci	    TP_printk("addr %lx", __entry->addr)
3478c2ecf20Sopenharmony_ci	);
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_flush_tlb_others,
3508c2ecf20Sopenharmony_ci	    TP_PROTO(const struct cpumask *cpus, struct mm_struct *mm,
3518c2ecf20Sopenharmony_ci		     unsigned long addr, unsigned long end),
3528c2ecf20Sopenharmony_ci	    TP_ARGS(cpus, mm, addr, end),
3538c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3548c2ecf20Sopenharmony_ci		    __field(unsigned, ncpus)
3558c2ecf20Sopenharmony_ci		    __field(struct mm_struct *, mm)
3568c2ecf20Sopenharmony_ci		    __field(unsigned long, addr)
3578c2ecf20Sopenharmony_ci		    __field(unsigned long, end)
3588c2ecf20Sopenharmony_ci		    ),
3598c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->ncpus = cpumask_weight(cpus);
3608c2ecf20Sopenharmony_ci			   __entry->mm = mm;
3618c2ecf20Sopenharmony_ci			   __entry->addr = addr,
3628c2ecf20Sopenharmony_ci			   __entry->end = end),
3638c2ecf20Sopenharmony_ci	    TP_printk("ncpus %d mm %p addr %lx, end %lx",
3648c2ecf20Sopenharmony_ci		      __entry->ncpus, __entry->mm, __entry->addr, __entry->end)
3658c2ecf20Sopenharmony_ci	);
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ciTRACE_EVENT(xen_mmu_write_cr3,
3688c2ecf20Sopenharmony_ci	    TP_PROTO(bool kernel, unsigned long cr3),
3698c2ecf20Sopenharmony_ci	    TP_ARGS(kernel, cr3),
3708c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3718c2ecf20Sopenharmony_ci		    __field(bool, kernel)
3728c2ecf20Sopenharmony_ci		    __field(unsigned long, cr3)
3738c2ecf20Sopenharmony_ci		    ),
3748c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->kernel = kernel;
3758c2ecf20Sopenharmony_ci			   __entry->cr3 = cr3),
3768c2ecf20Sopenharmony_ci	    TP_printk("%s cr3 %lx",
3778c2ecf20Sopenharmony_ci		      __entry->kernel ? "kernel" : "user", __entry->cr3)
3788c2ecf20Sopenharmony_ci	);
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci/* CPU */
3828c2ecf20Sopenharmony_ciTRACE_EVENT(xen_cpu_write_ldt_entry,
3838c2ecf20Sopenharmony_ci	    TP_PROTO(struct desc_struct *dt, int entrynum, u64 desc),
3848c2ecf20Sopenharmony_ci	    TP_ARGS(dt, entrynum, desc),
3858c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
3868c2ecf20Sopenharmony_ci		    __field(struct desc_struct *, dt)
3878c2ecf20Sopenharmony_ci		    __field(int, entrynum)
3888c2ecf20Sopenharmony_ci		    __field(u64, desc)
3898c2ecf20Sopenharmony_ci		    ),
3908c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->dt = dt;
3918c2ecf20Sopenharmony_ci			   __entry->entrynum = entrynum;
3928c2ecf20Sopenharmony_ci			   __entry->desc = desc;
3938c2ecf20Sopenharmony_ci		    ),
3948c2ecf20Sopenharmony_ci	    TP_printk("dt %p  entrynum %d  entry %016llx",
3958c2ecf20Sopenharmony_ci		      __entry->dt, __entry->entrynum,
3968c2ecf20Sopenharmony_ci		      (unsigned long long)__entry->desc)
3978c2ecf20Sopenharmony_ci	);
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ciTRACE_EVENT(xen_cpu_write_idt_entry,
4008c2ecf20Sopenharmony_ci	    TP_PROTO(gate_desc *dt, int entrynum, const gate_desc *ent),
4018c2ecf20Sopenharmony_ci	    TP_ARGS(dt, entrynum, ent),
4028c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
4038c2ecf20Sopenharmony_ci		    __field(gate_desc *, dt)
4048c2ecf20Sopenharmony_ci		    __field(int, entrynum)
4058c2ecf20Sopenharmony_ci		    ),
4068c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->dt = dt;
4078c2ecf20Sopenharmony_ci			   __entry->entrynum = entrynum;
4088c2ecf20Sopenharmony_ci		    ),
4098c2ecf20Sopenharmony_ci	    TP_printk("dt %p  entrynum %d",
4108c2ecf20Sopenharmony_ci		      __entry->dt, __entry->entrynum)
4118c2ecf20Sopenharmony_ci	);
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ciTRACE_EVENT(xen_cpu_load_idt,
4148c2ecf20Sopenharmony_ci	    TP_PROTO(const struct desc_ptr *desc),
4158c2ecf20Sopenharmony_ci	    TP_ARGS(desc),
4168c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
4178c2ecf20Sopenharmony_ci		    __field(unsigned long, addr)
4188c2ecf20Sopenharmony_ci		    ),
4198c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->addr = desc->address),
4208c2ecf20Sopenharmony_ci	    TP_printk("addr %lx", __entry->addr)
4218c2ecf20Sopenharmony_ci	);
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_ciTRACE_EVENT(xen_cpu_write_gdt_entry,
4248c2ecf20Sopenharmony_ci	    TP_PROTO(struct desc_struct *dt, int entrynum, const void *desc, int type),
4258c2ecf20Sopenharmony_ci	    TP_ARGS(dt, entrynum, desc, type),
4268c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
4278c2ecf20Sopenharmony_ci		    __field(u64, desc)
4288c2ecf20Sopenharmony_ci		    __field(struct desc_struct *, dt)
4298c2ecf20Sopenharmony_ci		    __field(int, entrynum)
4308c2ecf20Sopenharmony_ci		    __field(int, type)
4318c2ecf20Sopenharmony_ci		    ),
4328c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->dt = dt;
4338c2ecf20Sopenharmony_ci			   __entry->entrynum = entrynum;
4348c2ecf20Sopenharmony_ci			   __entry->desc = *(u64 *)desc;
4358c2ecf20Sopenharmony_ci			   __entry->type = type;
4368c2ecf20Sopenharmony_ci		    ),
4378c2ecf20Sopenharmony_ci	    TP_printk("dt %p  entrynum %d  type %d  desc %016llx",
4388c2ecf20Sopenharmony_ci		      __entry->dt, __entry->entrynum, __entry->type,
4398c2ecf20Sopenharmony_ci		      (unsigned long long)__entry->desc)
4408c2ecf20Sopenharmony_ci	);
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ciTRACE_EVENT(xen_cpu_set_ldt,
4438c2ecf20Sopenharmony_ci	    TP_PROTO(const void *addr, unsigned entries),
4448c2ecf20Sopenharmony_ci	    TP_ARGS(addr, entries),
4458c2ecf20Sopenharmony_ci	    TP_STRUCT__entry(
4468c2ecf20Sopenharmony_ci		    __field(const void *, addr)
4478c2ecf20Sopenharmony_ci		    __field(unsigned, entries)
4488c2ecf20Sopenharmony_ci		    ),
4498c2ecf20Sopenharmony_ci	    TP_fast_assign(__entry->addr = addr;
4508c2ecf20Sopenharmony_ci			   __entry->entries = entries),
4518c2ecf20Sopenharmony_ci	    TP_printk("addr %p  entries %u",
4528c2ecf20Sopenharmony_ci		      __entry->addr, __entry->entries)
4538c2ecf20Sopenharmony_ci	);
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci#endif /*  _TRACE_XEN_H */
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci/* This part must be outside protection */
4598c2ecf20Sopenharmony_ci#include <trace/define_trace.h>
460