Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
0003 #define _TRACE_KVM_H
0004 
0005 #include <linux/tracepoint.h>
0006 #include <asm/sie.h>
0007 #include <asm/debug.h>
0008 #include <asm/dis.h>
0009 
0010 #undef TRACE_SYSTEM
0011 #define TRACE_SYSTEM kvm
0012 #define TRACE_INCLUDE_PATH .
0013 #undef TRACE_INCLUDE_FILE
0014 #define TRACE_INCLUDE_FILE trace
0015 
0016 /*
0017  * Helpers for vcpu-specific tracepoints containing the same information
0018  * as s390dbf VCPU_EVENTs.
0019  */
0020 #define VCPU_PROTO_COMMON struct kvm_vcpu *vcpu
0021 #define VCPU_ARGS_COMMON vcpu
0022 #define VCPU_FIELD_COMMON __field(int, id)          \
0023     __field(unsigned long, pswmask)             \
0024     __field(unsigned long, pswaddr)
0025 #define VCPU_ASSIGN_COMMON do {                     \
0026     __entry->id = vcpu->vcpu_id;                    \
0027     __entry->pswmask = vcpu->arch.sie_block->gpsw.mask;     \
0028     __entry->pswaddr = vcpu->arch.sie_block->gpsw.addr;     \
0029     } while (0);
0030 #define VCPU_TP_PRINTK(p_str, p_args...)                \
0031     TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id,       \
0032           __entry->pswmask, __entry->pswaddr, p_args)
0033 
0034 TRACE_EVENT(kvm_s390_skey_related_inst,
0035         TP_PROTO(VCPU_PROTO_COMMON),
0036         TP_ARGS(VCPU_ARGS_COMMON),
0037 
0038         TP_STRUCT__entry(
0039             VCPU_FIELD_COMMON
0040             ),
0041 
0042         TP_fast_assign(
0043             VCPU_ASSIGN_COMMON
0044             ),
0045         VCPU_TP_PRINTK("%s", "storage key related instruction")
0046     );
0047 
0048 TRACE_EVENT(kvm_s390_major_guest_pfault,
0049         TP_PROTO(VCPU_PROTO_COMMON),
0050         TP_ARGS(VCPU_ARGS_COMMON),
0051 
0052         TP_STRUCT__entry(
0053             VCPU_FIELD_COMMON
0054             ),
0055 
0056         TP_fast_assign(
0057             VCPU_ASSIGN_COMMON
0058             ),
0059         VCPU_TP_PRINTK("%s", "major fault, maybe applicable for pfault")
0060     );
0061 
0062 TRACE_EVENT(kvm_s390_pfault_init,
0063         TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
0064         TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
0065 
0066         TP_STRUCT__entry(
0067             VCPU_FIELD_COMMON
0068             __field(long, pfault_token)
0069             ),
0070 
0071         TP_fast_assign(
0072             VCPU_ASSIGN_COMMON
0073             __entry->pfault_token = pfault_token;
0074             ),
0075         VCPU_TP_PRINTK("init pfault token %ld", __entry->pfault_token)
0076     );
0077 
0078 TRACE_EVENT(kvm_s390_pfault_done,
0079         TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
0080         TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
0081 
0082         TP_STRUCT__entry(
0083             VCPU_FIELD_COMMON
0084             __field(long, pfault_token)
0085             ),
0086 
0087         TP_fast_assign(
0088             VCPU_ASSIGN_COMMON
0089             __entry->pfault_token = pfault_token;
0090             ),
0091         VCPU_TP_PRINTK("done pfault token %ld", __entry->pfault_token)
0092     );
0093 
0094 /*
0095  * Tracepoints for SIE entry and exit.
0096  */
0097 TRACE_EVENT(kvm_s390_sie_enter,
0098         TP_PROTO(VCPU_PROTO_COMMON, int cpuflags),
0099         TP_ARGS(VCPU_ARGS_COMMON, cpuflags),
0100 
0101         TP_STRUCT__entry(
0102             VCPU_FIELD_COMMON
0103             __field(int, cpuflags)
0104             ),
0105 
0106         TP_fast_assign(
0107             VCPU_ASSIGN_COMMON
0108             __entry->cpuflags = cpuflags;
0109             ),
0110 
0111         VCPU_TP_PRINTK("entering sie flags %x", __entry->cpuflags)
0112     );
0113 
0114 TRACE_EVENT(kvm_s390_sie_fault,
0115         TP_PROTO(VCPU_PROTO_COMMON),
0116         TP_ARGS(VCPU_ARGS_COMMON),
0117 
0118         TP_STRUCT__entry(
0119             VCPU_FIELD_COMMON
0120             ),
0121 
0122         TP_fast_assign(
0123             VCPU_ASSIGN_COMMON
0124             ),
0125 
0126         VCPU_TP_PRINTK("%s", "fault in sie instruction")
0127     );
0128 
0129 TRACE_EVENT(kvm_s390_sie_exit,
0130         TP_PROTO(VCPU_PROTO_COMMON, u8 icptcode),
0131         TP_ARGS(VCPU_ARGS_COMMON, icptcode),
0132 
0133         TP_STRUCT__entry(
0134             VCPU_FIELD_COMMON
0135             __field(u8, icptcode)
0136             ),
0137 
0138         TP_fast_assign(
0139             VCPU_ASSIGN_COMMON
0140             __entry->icptcode = icptcode;
0141             ),
0142 
0143         VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry->icptcode,
0144                __print_symbolic(__entry->icptcode,
0145                         sie_intercept_code))
0146     );
0147 
0148 /*
0149  * Trace point for intercepted instructions.
0150  */
0151 TRACE_EVENT(kvm_s390_intercept_instruction,
0152         TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
0153         TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
0154 
0155         TP_STRUCT__entry(
0156             VCPU_FIELD_COMMON
0157             __field(__u64, instruction)
0158             ),
0159 
0160         TP_fast_assign(
0161             VCPU_ASSIGN_COMMON
0162             __entry->instruction = ((__u64)ipa << 48) |
0163             ((__u64)ipb << 16);
0164             ),
0165 
0166         VCPU_TP_PRINTK("intercepted instruction %016llx (%s)",
0167                __entry->instruction,
0168                __print_symbolic(icpt_insn_decoder(__entry->instruction),
0169                         icpt_insn_codes))
0170     );
0171 
0172 /*
0173  * Trace point for intercepted program interruptions.
0174  */
0175 TRACE_EVENT(kvm_s390_intercept_prog,
0176         TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
0177         TP_ARGS(VCPU_ARGS_COMMON, code),
0178 
0179         TP_STRUCT__entry(
0180             VCPU_FIELD_COMMON
0181             __field(__u16, code)
0182             ),
0183 
0184         TP_fast_assign(
0185             VCPU_ASSIGN_COMMON
0186             __entry->code = code;
0187             ),
0188 
0189         VCPU_TP_PRINTK("intercepted program interruption %04x (%s)",
0190                __entry->code,
0191                __print_symbolic(__entry->code,
0192                         icpt_prog_codes))
0193     );
0194 
0195 /*
0196  * Trace point for validity intercepts.
0197  */
0198 TRACE_EVENT(kvm_s390_intercept_validity,
0199         TP_PROTO(VCPU_PROTO_COMMON, __u16 viwhy),
0200         TP_ARGS(VCPU_ARGS_COMMON, viwhy),
0201 
0202         TP_STRUCT__entry(
0203             VCPU_FIELD_COMMON
0204             __field(__u16, viwhy)
0205             ),
0206 
0207         TP_fast_assign(
0208             VCPU_ASSIGN_COMMON
0209             __entry->viwhy = viwhy;
0210             ),
0211 
0212         VCPU_TP_PRINTK("got validity intercept %04x", __entry->viwhy)
0213     );
0214 
0215 /*
0216  * Trace points for instructions that are of special interest.
0217  */
0218 
0219 TRACE_EVENT(kvm_s390_handle_sigp,
0220         TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr, \
0221              __u32 parameter),
0222         TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr, parameter),
0223 
0224         TP_STRUCT__entry(
0225             VCPU_FIELD_COMMON
0226             __field(__u8, order_code)
0227             __field(__u16, cpu_addr)
0228             __field(__u32, parameter)
0229             ),
0230 
0231         TP_fast_assign(
0232             VCPU_ASSIGN_COMMON
0233             __entry->order_code = order_code;
0234             __entry->cpu_addr = cpu_addr;
0235             __entry->parameter = parameter;
0236             ),
0237 
0238         VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
0239                "parameter %08x", __entry->order_code,
0240                __print_symbolic(__entry->order_code,
0241                         sigp_order_codes),
0242                __entry->cpu_addr, __entry->parameter)
0243     );
0244 
0245 TRACE_EVENT(kvm_s390_handle_sigp_pei,
0246         TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr),
0247         TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr),
0248 
0249         TP_STRUCT__entry(
0250             VCPU_FIELD_COMMON
0251             __field(__u8, order_code)
0252             __field(__u16, cpu_addr)
0253             ),
0254 
0255         TP_fast_assign(
0256             VCPU_ASSIGN_COMMON
0257             __entry->order_code = order_code;
0258             __entry->cpu_addr = cpu_addr;
0259             ),
0260 
0261         VCPU_TP_PRINTK("handle sigp pei order %02x (%s), cpu address %04x",
0262                __entry->order_code,
0263                __print_symbolic(__entry->order_code,
0264                         sigp_order_codes),
0265                __entry->cpu_addr)
0266     );
0267 
0268 TRACE_EVENT(kvm_s390_handle_diag,
0269         TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
0270         TP_ARGS(VCPU_ARGS_COMMON, code),
0271 
0272         TP_STRUCT__entry(
0273             VCPU_FIELD_COMMON
0274             __field(__u16, code)
0275             ),
0276 
0277         TP_fast_assign(
0278             VCPU_ASSIGN_COMMON
0279             __entry->code = code;
0280             ),
0281 
0282         VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry->code,
0283                __print_symbolic(__entry->code, diagnose_codes))
0284     );
0285 
0286 TRACE_EVENT(kvm_s390_handle_lctl,
0287         TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
0288         TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
0289 
0290         TP_STRUCT__entry(
0291             VCPU_FIELD_COMMON
0292             __field(int, g)
0293             __field(int, reg1)
0294             __field(int, reg3)
0295             __field(u64, addr)
0296             ),
0297 
0298         TP_fast_assign(
0299             VCPU_ASSIGN_COMMON
0300             __entry->g = g;
0301             __entry->reg1 = reg1;
0302             __entry->reg3 = reg3;
0303             __entry->addr = addr;
0304             ),
0305 
0306         VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
0307                __entry->g ? "lctlg" : "lctl",
0308                __entry->reg1, __entry->reg3, __entry->addr)
0309     );
0310 
0311 TRACE_EVENT(kvm_s390_handle_stctl,
0312         TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
0313         TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
0314 
0315         TP_STRUCT__entry(
0316             VCPU_FIELD_COMMON
0317             __field(int, g)
0318             __field(int, reg1)
0319             __field(int, reg3)
0320             __field(u64, addr)
0321             ),
0322 
0323         TP_fast_assign(
0324             VCPU_ASSIGN_COMMON
0325             __entry->g = g;
0326             __entry->reg1 = reg1;
0327             __entry->reg3 = reg3;
0328             __entry->addr = addr;
0329             ),
0330 
0331         VCPU_TP_PRINTK("%s: storing cr %x-%x to %016llx",
0332                __entry->g ? "stctg" : "stctl",
0333                __entry->reg1, __entry->reg3, __entry->addr)
0334     );
0335 
0336 TRACE_EVENT(kvm_s390_handle_prefix,
0337         TP_PROTO(VCPU_PROTO_COMMON, int set, u32 address),
0338         TP_ARGS(VCPU_ARGS_COMMON, set, address),
0339 
0340         TP_STRUCT__entry(
0341             VCPU_FIELD_COMMON
0342             __field(int, set)
0343             __field(u32, address)
0344             ),
0345 
0346         TP_fast_assign(
0347             VCPU_ASSIGN_COMMON
0348             __entry->set = set;
0349             __entry->address = address;
0350             ),
0351 
0352         VCPU_TP_PRINTK("%s prefix to %08x",
0353                __entry->set ? "setting" : "storing",
0354                __entry->address)
0355     );
0356 
0357 TRACE_EVENT(kvm_s390_handle_stap,
0358         TP_PROTO(VCPU_PROTO_COMMON, u64 address),
0359         TP_ARGS(VCPU_ARGS_COMMON, address),
0360 
0361         TP_STRUCT__entry(
0362             VCPU_FIELD_COMMON
0363             __field(u64, address)
0364             ),
0365 
0366         TP_fast_assign(
0367             VCPU_ASSIGN_COMMON
0368             __entry->address = address;
0369             ),
0370 
0371         VCPU_TP_PRINTK("storing cpu address to %016llx",
0372                __entry->address)
0373     );
0374 
0375 TRACE_EVENT(kvm_s390_handle_stfl,
0376         TP_PROTO(VCPU_PROTO_COMMON, unsigned int facility_list),
0377         TP_ARGS(VCPU_ARGS_COMMON, facility_list),
0378 
0379         TP_STRUCT__entry(
0380             VCPU_FIELD_COMMON
0381             __field(unsigned int, facility_list)
0382             ),
0383 
0384         TP_fast_assign(
0385             VCPU_ASSIGN_COMMON
0386             __entry->facility_list = facility_list;
0387             ),
0388 
0389         VCPU_TP_PRINTK("store facility list value %08x",
0390                __entry->facility_list)
0391     );
0392 
0393 TRACE_EVENT(kvm_s390_handle_stsi,
0394         TP_PROTO(VCPU_PROTO_COMMON, int fc, int sel1, int sel2, u64 addr),
0395         TP_ARGS(VCPU_ARGS_COMMON, fc, sel1, sel2, addr),
0396 
0397         TP_STRUCT__entry(
0398             VCPU_FIELD_COMMON
0399             __field(int, fc)
0400             __field(int, sel1)
0401             __field(int, sel2)
0402             __field(u64, addr)
0403             ),
0404 
0405         TP_fast_assign(
0406             VCPU_ASSIGN_COMMON
0407             __entry->fc = fc;
0408             __entry->sel1 = sel1;
0409             __entry->sel2 = sel2;
0410             __entry->addr = addr;
0411             ),
0412 
0413         VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
0414                __entry->fc, __entry->sel1, __entry->sel2,
0415                __entry->addr)
0416     );
0417 
0418 TRACE_EVENT(kvm_s390_handle_operexc,
0419         TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
0420         TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
0421 
0422         TP_STRUCT__entry(
0423             VCPU_FIELD_COMMON
0424             __field(__u64, instruction)
0425             ),
0426 
0427         TP_fast_assign(
0428             VCPU_ASSIGN_COMMON
0429             __entry->instruction = ((__u64)ipa << 48) |
0430             ((__u64)ipb << 16);
0431             ),
0432 
0433         VCPU_TP_PRINTK("operation exception on instruction %016llx (%s)",
0434                __entry->instruction,
0435                __print_symbolic(icpt_insn_decoder(__entry->instruction),
0436                         icpt_insn_codes))
0437     );
0438 
0439 TRACE_EVENT(kvm_s390_handle_sthyi,
0440         TP_PROTO(VCPU_PROTO_COMMON, u64 code, u64 addr),
0441         TP_ARGS(VCPU_ARGS_COMMON, code, addr),
0442 
0443         TP_STRUCT__entry(
0444             VCPU_FIELD_COMMON
0445             __field(u64, code)
0446             __field(u64, addr)
0447             ),
0448 
0449         TP_fast_assign(
0450             VCPU_ASSIGN_COMMON
0451             __entry->code = code;
0452             __entry->addr = addr;
0453             ),
0454 
0455         VCPU_TP_PRINTK("STHYI fc: %llu addr: %016llx",
0456                __entry->code, __entry->addr)
0457     );
0458 
0459 #endif /* _TRACE_KVM_H */
0460 
0461 /* This part must be outside protection */
0462 #include <trace/define_trace.h>