Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * This file is subject to the terms and conditions of the GNU General Public
0003  * License.  See the file "COPYING" in the main directory of this archive
0004  * for more details.
0005  *
0006  * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
0007  * Authors: Sanjay Lal <sanjayl@kymasys.com>
0008  */
0009 
0010 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
0011 #define _TRACE_KVM_H
0012 
0013 #include <linux/tracepoint.h>
0014 
0015 #undef TRACE_SYSTEM
0016 #define TRACE_SYSTEM kvm
0017 #define TRACE_INCLUDE_PATH .
0018 #define TRACE_INCLUDE_FILE trace
0019 
0020 /*
0021  * arch/mips/kvm/mips.c
0022  */
0023 extern bool kvm_trace_guest_mode_change;
0024 int kvm_guest_mode_change_trace_reg(void);
0025 void kvm_guest_mode_change_trace_unreg(void);
0026 
0027 /*
0028  * Tracepoints for VM enters
0029  */
0030 DECLARE_EVENT_CLASS(kvm_transition,
0031     TP_PROTO(struct kvm_vcpu *vcpu),
0032     TP_ARGS(vcpu),
0033     TP_STRUCT__entry(
0034         __field(unsigned long, pc)
0035     ),
0036 
0037     TP_fast_assign(
0038         __entry->pc = vcpu->arch.pc;
0039     ),
0040 
0041     TP_printk("PC: 0x%08lx",
0042           __entry->pc)
0043 );
0044 
0045 DEFINE_EVENT(kvm_transition, kvm_enter,
0046          TP_PROTO(struct kvm_vcpu *vcpu),
0047          TP_ARGS(vcpu));
0048 
0049 DEFINE_EVENT(kvm_transition, kvm_reenter,
0050          TP_PROTO(struct kvm_vcpu *vcpu),
0051          TP_ARGS(vcpu));
0052 
0053 DEFINE_EVENT(kvm_transition, kvm_out,
0054          TP_PROTO(struct kvm_vcpu *vcpu),
0055          TP_ARGS(vcpu));
0056 
0057 /* The first 32 exit reasons correspond to Cause.ExcCode */
0058 #define KVM_TRACE_EXIT_INT       0
0059 #define KVM_TRACE_EXIT_TLBMOD        1
0060 #define KVM_TRACE_EXIT_TLBMISS_LD    2
0061 #define KVM_TRACE_EXIT_TLBMISS_ST    3
0062 #define KVM_TRACE_EXIT_ADDRERR_LD    4
0063 #define KVM_TRACE_EXIT_ADDRERR_ST    5
0064 #define KVM_TRACE_EXIT_SYSCALL       8
0065 #define KVM_TRACE_EXIT_BREAK_INST    9
0066 #define KVM_TRACE_EXIT_RESVD_INST   10
0067 #define KVM_TRACE_EXIT_COP_UNUSABLE 11
0068 #define KVM_TRACE_EXIT_TRAP_INST    13
0069 #define KVM_TRACE_EXIT_MSA_FPE      14
0070 #define KVM_TRACE_EXIT_FPE      15
0071 #define KVM_TRACE_EXIT_MSA_DISABLED 21
0072 #define KVM_TRACE_EXIT_GUEST_EXIT   27
0073 /* Further exit reasons */
0074 #define KVM_TRACE_EXIT_WAIT     32
0075 #define KVM_TRACE_EXIT_CACHE        33
0076 #define KVM_TRACE_EXIT_SIGNAL       34
0077 /* 32 exit reasons correspond to GuestCtl0.GExcCode (VZ) */
0078 #define KVM_TRACE_EXIT_GEXCCODE_BASE    64
0079 #define KVM_TRACE_EXIT_GPSI     64  /*  0 */
0080 #define KVM_TRACE_EXIT_GSFC     65  /*  1 */
0081 #define KVM_TRACE_EXIT_HC       66  /*  2 */
0082 #define KVM_TRACE_EXIT_GRR      67  /*  3 */
0083 #define KVM_TRACE_EXIT_GVA      72  /*  8 */
0084 #define KVM_TRACE_EXIT_GHFC     73  /*  9 */
0085 #define KVM_TRACE_EXIT_GPA      74  /* 10 */
0086 
0087 /* Tracepoints for VM exits */
0088 #define kvm_trace_symbol_exit_types             \
0089     { KVM_TRACE_EXIT_INT,       "Interrupt" },      \
0090     { KVM_TRACE_EXIT_TLBMOD,    "TLB Mod" },        \
0091     { KVM_TRACE_EXIT_TLBMISS_LD,    "TLB Miss (LD)" },  \
0092     { KVM_TRACE_EXIT_TLBMISS_ST,    "TLB Miss (ST)" },  \
0093     { KVM_TRACE_EXIT_ADDRERR_LD,    "Address Error (LD)" }, \
0094     { KVM_TRACE_EXIT_ADDRERR_ST,    "Address Err (ST)" },   \
0095     { KVM_TRACE_EXIT_SYSCALL,   "System Call" },    \
0096     { KVM_TRACE_EXIT_BREAK_INST,    "Break Inst" },     \
0097     { KVM_TRACE_EXIT_RESVD_INST,    "Reserved Inst" },  \
0098     { KVM_TRACE_EXIT_COP_UNUSABLE,  "COP0/1 Unusable" },    \
0099     { KVM_TRACE_EXIT_TRAP_INST, "Trap Inst" },      \
0100     { KVM_TRACE_EXIT_MSA_FPE,   "MSA FPE" },        \
0101     { KVM_TRACE_EXIT_FPE,       "FPE" },        \
0102     { KVM_TRACE_EXIT_MSA_DISABLED,  "MSA Disabled" },   \
0103     { KVM_TRACE_EXIT_GUEST_EXIT,    "Guest Exit" },     \
0104     { KVM_TRACE_EXIT_WAIT,      "WAIT" },       \
0105     { KVM_TRACE_EXIT_CACHE,     "CACHE" },      \
0106     { KVM_TRACE_EXIT_SIGNAL,    "Signal" },     \
0107     { KVM_TRACE_EXIT_GPSI,      "GPSI" },       \
0108     { KVM_TRACE_EXIT_GSFC,      "GSFC" },       \
0109     { KVM_TRACE_EXIT_HC,        "HC" },         \
0110     { KVM_TRACE_EXIT_GRR,       "GRR" },        \
0111     { KVM_TRACE_EXIT_GVA,       "GVA" },        \
0112     { KVM_TRACE_EXIT_GHFC,      "GHFC" },       \
0113     { KVM_TRACE_EXIT_GPA,       "GPA" }
0114 
0115 TRACE_EVENT(kvm_exit,
0116         TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
0117         TP_ARGS(vcpu, reason),
0118         TP_STRUCT__entry(
0119             __field(unsigned long, pc)
0120             __field(unsigned int, reason)
0121         ),
0122 
0123         TP_fast_assign(
0124             __entry->pc = vcpu->arch.pc;
0125             __entry->reason = reason;
0126         ),
0127 
0128         TP_printk("[%s]PC: 0x%08lx",
0129               __print_symbolic(__entry->reason,
0130                        kvm_trace_symbol_exit_types),
0131               __entry->pc)
0132 );
0133 
0134 #define KVM_TRACE_MFC0      0
0135 #define KVM_TRACE_MTC0      1
0136 #define KVM_TRACE_DMFC0     2
0137 #define KVM_TRACE_DMTC0     3
0138 #define KVM_TRACE_RDHWR     4
0139 
0140 #define KVM_TRACE_HWR_COP0  0
0141 #define KVM_TRACE_HWR_HWR   1
0142 
0143 #define KVM_TRACE_COP0(REG, SEL)    ((KVM_TRACE_HWR_COP0 << 8) |    \
0144                      ((REG) << 3) | (SEL))
0145 #define KVM_TRACE_HWR(REG, SEL)     ((KVM_TRACE_HWR_HWR  << 8) |    \
0146                      ((REG) << 3) | (SEL))
0147 
0148 #define kvm_trace_symbol_hwr_ops                \
0149     { KVM_TRACE_MFC0,       "MFC0" },       \
0150     { KVM_TRACE_MTC0,       "MTC0" },       \
0151     { KVM_TRACE_DMFC0,      "DMFC0" },      \
0152     { KVM_TRACE_DMTC0,      "DMTC0" },      \
0153     { KVM_TRACE_RDHWR,      "RDHWR" }
0154 
0155 #define kvm_trace_symbol_hwr_cop                \
0156     { KVM_TRACE_HWR_COP0,       "COP0" },       \
0157     { KVM_TRACE_HWR_HWR,        "HWR" }
0158 
0159 #define kvm_trace_symbol_hwr_regs               \
0160     { KVM_TRACE_COP0( 0, 0),    "Index" },      \
0161     { KVM_TRACE_COP0( 2, 0),    "EntryLo0" },       \
0162     { KVM_TRACE_COP0( 3, 0),    "EntryLo1" },       \
0163     { KVM_TRACE_COP0( 4, 0),    "Context" },        \
0164     { KVM_TRACE_COP0( 4, 2),    "UserLocal" },      \
0165     { KVM_TRACE_COP0( 5, 0),    "PageMask" },       \
0166     { KVM_TRACE_COP0( 6, 0),    "Wired" },      \
0167     { KVM_TRACE_COP0( 7, 0),    "HWREna" },     \
0168     { KVM_TRACE_COP0( 8, 0),    "BadVAddr" },       \
0169     { KVM_TRACE_COP0( 9, 0),    "Count" },      \
0170     { KVM_TRACE_COP0(10, 0),    "EntryHi" },        \
0171     { KVM_TRACE_COP0(11, 0),    "Compare" },        \
0172     { KVM_TRACE_COP0(12, 0),    "Status" },     \
0173     { KVM_TRACE_COP0(12, 1),    "IntCtl" },     \
0174     { KVM_TRACE_COP0(12, 2),    "SRSCtl" },     \
0175     { KVM_TRACE_COP0(13, 0),    "Cause" },      \
0176     { KVM_TRACE_COP0(14, 0),    "EPC" },        \
0177     { KVM_TRACE_COP0(15, 0),    "PRId" },       \
0178     { KVM_TRACE_COP0(15, 1),    "EBase" },      \
0179     { KVM_TRACE_COP0(16, 0),    "Config" },     \
0180     { KVM_TRACE_COP0(16, 1),    "Config1" },        \
0181     { KVM_TRACE_COP0(16, 2),    "Config2" },        \
0182     { KVM_TRACE_COP0(16, 3),    "Config3" },        \
0183     { KVM_TRACE_COP0(16, 4),    "Config4" },        \
0184     { KVM_TRACE_COP0(16, 5),    "Config5" },        \
0185     { KVM_TRACE_COP0(16, 7),    "Config7" },        \
0186     { KVM_TRACE_COP0(17, 1),    "MAAR" },       \
0187     { KVM_TRACE_COP0(17, 2),    "MAARI" },      \
0188     { KVM_TRACE_COP0(26, 0),    "ECC" },        \
0189     { KVM_TRACE_COP0(30, 0),    "ErrorEPC" },       \
0190     { KVM_TRACE_COP0(31, 2),    "KScratch1" },      \
0191     { KVM_TRACE_COP0(31, 3),    "KScratch2" },      \
0192     { KVM_TRACE_COP0(31, 4),    "KScratch3" },      \
0193     { KVM_TRACE_COP0(31, 5),    "KScratch4" },      \
0194     { KVM_TRACE_COP0(31, 6),    "KScratch5" },      \
0195     { KVM_TRACE_COP0(31, 7),    "KScratch6" },      \
0196     { KVM_TRACE_HWR( 0, 0),     "CPUNum" },     \
0197     { KVM_TRACE_HWR( 1, 0),     "SYNCI_Step" },     \
0198     { KVM_TRACE_HWR( 2, 0),     "CC" },         \
0199     { KVM_TRACE_HWR( 3, 0),     "CCRes" },      \
0200     { KVM_TRACE_HWR(29, 0),     "ULR" }
0201 
0202 TRACE_EVENT(kvm_hwr,
0203         TP_PROTO(struct kvm_vcpu *vcpu, unsigned int op, unsigned int reg,
0204              unsigned long val),
0205         TP_ARGS(vcpu, op, reg, val),
0206         TP_STRUCT__entry(
0207             __field(unsigned long, val)
0208             __field(u16, reg)
0209             __field(u8, op)
0210         ),
0211 
0212         TP_fast_assign(
0213             __entry->val = val;
0214             __entry->reg = reg;
0215             __entry->op = op;
0216         ),
0217 
0218         TP_printk("%s %s (%s:%u:%u) 0x%08lx",
0219               __print_symbolic(__entry->op,
0220                        kvm_trace_symbol_hwr_ops),
0221               __print_symbolic(__entry->reg,
0222                        kvm_trace_symbol_hwr_regs),
0223               __print_symbolic(__entry->reg >> 8,
0224                        kvm_trace_symbol_hwr_cop),
0225               (__entry->reg >> 3) & 0x1f,
0226               __entry->reg & 0x7,
0227               __entry->val)
0228 );
0229 
0230 #define KVM_TRACE_AUX_RESTORE       0
0231 #define KVM_TRACE_AUX_SAVE      1
0232 #define KVM_TRACE_AUX_ENABLE        2
0233 #define KVM_TRACE_AUX_DISABLE       3
0234 #define KVM_TRACE_AUX_DISCARD       4
0235 
0236 #define KVM_TRACE_AUX_FPU       1
0237 #define KVM_TRACE_AUX_MSA       2
0238 #define KVM_TRACE_AUX_FPU_MSA       3
0239 
0240 #define kvm_trace_symbol_aux_op     \
0241     { KVM_TRACE_AUX_RESTORE, "restore" },   \
0242     { KVM_TRACE_AUX_SAVE,    "save" },  \
0243     { KVM_TRACE_AUX_ENABLE,  "enable" },    \
0244     { KVM_TRACE_AUX_DISABLE, "disable" },   \
0245     { KVM_TRACE_AUX_DISCARD, "discard" }
0246 
0247 #define kvm_trace_symbol_aux_state      \
0248     { KVM_TRACE_AUX_FPU,     "FPU" },   \
0249     { KVM_TRACE_AUX_MSA,     "MSA" },   \
0250     { KVM_TRACE_AUX_FPU_MSA, "FPU & MSA" }
0251 
0252 TRACE_EVENT(kvm_aux,
0253         TP_PROTO(struct kvm_vcpu *vcpu, unsigned int op,
0254              unsigned int state),
0255         TP_ARGS(vcpu, op, state),
0256         TP_STRUCT__entry(
0257             __field(unsigned long, pc)
0258             __field(u8, op)
0259             __field(u8, state)
0260         ),
0261 
0262         TP_fast_assign(
0263             __entry->pc = vcpu->arch.pc;
0264             __entry->op = op;
0265             __entry->state = state;
0266         ),
0267 
0268         TP_printk("%s %s PC: 0x%08lx",
0269               __print_symbolic(__entry->op,
0270                        kvm_trace_symbol_aux_op),
0271               __print_symbolic(__entry->state,
0272                        kvm_trace_symbol_aux_state),
0273               __entry->pc)
0274 );
0275 
0276 TRACE_EVENT(kvm_asid_change,
0277         TP_PROTO(struct kvm_vcpu *vcpu, unsigned int old_asid,
0278              unsigned int new_asid),
0279         TP_ARGS(vcpu, old_asid, new_asid),
0280         TP_STRUCT__entry(
0281             __field(unsigned long, pc)
0282             __field(u8, old_asid)
0283             __field(u8, new_asid)
0284         ),
0285 
0286         TP_fast_assign(
0287             __entry->pc = vcpu->arch.pc;
0288             __entry->old_asid = old_asid;
0289             __entry->new_asid = new_asid;
0290         ),
0291 
0292         TP_printk("PC: 0x%08lx old: 0x%02x new: 0x%02x",
0293               __entry->pc,
0294               __entry->old_asid,
0295               __entry->new_asid)
0296 );
0297 
0298 TRACE_EVENT(kvm_guestid_change,
0299         TP_PROTO(struct kvm_vcpu *vcpu, unsigned int guestid),
0300         TP_ARGS(vcpu, guestid),
0301         TP_STRUCT__entry(
0302             __field(unsigned int, guestid)
0303         ),
0304 
0305         TP_fast_assign(
0306             __entry->guestid = guestid;
0307         ),
0308 
0309         TP_printk("GuestID: 0x%02x",
0310               __entry->guestid)
0311 );
0312 
0313 TRACE_EVENT_FN(kvm_guest_mode_change,
0314         TP_PROTO(struct kvm_vcpu *vcpu),
0315         TP_ARGS(vcpu),
0316         TP_STRUCT__entry(
0317             __field(unsigned long, epc)
0318             __field(unsigned long, pc)
0319             __field(unsigned long, badvaddr)
0320             __field(unsigned int, status)
0321             __field(unsigned int, cause)
0322         ),
0323 
0324         TP_fast_assign(
0325             __entry->epc = kvm_read_c0_guest_epc(vcpu->arch.cop0);
0326             __entry->pc = vcpu->arch.pc;
0327             __entry->badvaddr = kvm_read_c0_guest_badvaddr(vcpu->arch.cop0);
0328             __entry->status = kvm_read_c0_guest_status(vcpu->arch.cop0);
0329             __entry->cause = kvm_read_c0_guest_cause(vcpu->arch.cop0);
0330         ),
0331 
0332         TP_printk("EPC: 0x%08lx PC: 0x%08lx Status: 0x%08x Cause: 0x%08x BadVAddr: 0x%08lx",
0333               __entry->epc,
0334               __entry->pc,
0335               __entry->status,
0336               __entry->cause,
0337               __entry->badvaddr),
0338 
0339         kvm_guest_mode_change_trace_reg,
0340         kvm_guest_mode_change_trace_unreg
0341 );
0342 
0343 #endif /* _TRACE_KVM_H */
0344 
0345 /* This part must be outside protection */
0346 #include <trace/define_trace.h>