};
 
 struct sys_reg_desc {
+       /* Sysreg string for debug */
+       const char *name;
+
        /* MRS/MSR instruction which accesses it. */
        u8      Op0;
        u8      Op1;
 #define Op2(_x)        .Op2 = _x
 
 #define SYS_DESC(reg)                                  \
+       .name = #reg,                                   \
        Op0(sys_reg_Op0(reg)), Op1(sys_reg_Op1(reg)),   \
        CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)),   \
        Op2(sys_reg_Op2(reg))
 
 #define _TRACE_ARM64_KVM_H
 
 #include <linux/tracepoint.h>
+#include "sys_regs.h"
 
 #undef TRACE_SYSTEM
 #define TRACE_SYSTEM kvm
        TP_printk("HSR 0x%08lx", __entry->hsr)
 );
 
+TRACE_EVENT(kvm_sys_access,
+       TP_PROTO(unsigned long vcpu_pc, struct sys_reg_params *params, const struct sys_reg_desc *reg),
+       TP_ARGS(vcpu_pc, params, reg),
+
+       TP_STRUCT__entry(
+               __field(unsigned long,                  vcpu_pc)
+               __field(bool,                           is_write)
+               __field(const char *,                   name)
+               __field(u8,                             Op0)
+               __field(u8,                             Op1)
+               __field(u8,                             CRn)
+               __field(u8,                             CRm)
+               __field(u8,                             Op2)
+       ),
+
+       TP_fast_assign(
+               __entry->vcpu_pc = vcpu_pc;
+               __entry->is_write = params->is_write;
+               __entry->name = reg->name;
+               __entry->Op0 = reg->Op0;
+               __entry->Op0 = reg->Op0;
+               __entry->Op1 = reg->Op1;
+               __entry->CRn = reg->CRn;
+               __entry->CRm = reg->CRm;
+               __entry->Op2 = reg->Op2;
+       ),
+
+       TP_printk("PC: %lx %s (%d,%d,%d,%d,%d) %s",
+                 __entry->vcpu_pc, __entry->name ?: "UNKN",
+                 __entry->Op0, __entry->Op1, __entry->CRn,
+                 __entry->CRm, __entry->Op2,
+                 __entry->is_write ? "write" : "read")
+);
+
 TRACE_EVENT(kvm_set_guest_debug,
        TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
        TP_ARGS(vcpu, guest_debug),