xref: /aosp_15_r20/external/bcc/examples/tracing/kvm_hypercall.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python
2*387f9dfdSAndroid Build Coastguard Worker#
3*387f9dfdSAndroid Build Coastguard Worker# kvm_hypercall.py
4*387f9dfdSAndroid Build Coastguard Worker#
5*387f9dfdSAndroid Build Coastguard Worker# Demonstrates stateful kvm_entry and kvm_exit recording along with the
6*387f9dfdSAndroid Build Coastguard Worker# associated hypercall when exit_reason is VMCALL. See kvm_hypercall.txt
7*387f9dfdSAndroid Build Coastguard Worker# for usage
8*387f9dfdSAndroid Build Coastguard Worker#
9*387f9dfdSAndroid Build Coastguard Worker# REQUIRES: Linux 4.7+ (BPF_PROG_TYPE_TRACEPOINT support)
10*387f9dfdSAndroid Build Coastguard Worker#
11*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2017 ShiftLeft Inc.
12*387f9dfdSAndroid Build Coastguard Worker#
13*387f9dfdSAndroid Build Coastguard Worker# Author(s):
14*387f9dfdSAndroid Build Coastguard Worker#   Suchakrapani Sharma <[email protected]>
15*387f9dfdSAndroid Build Coastguard Worker
16*387f9dfdSAndroid Build Coastguard Worker
17*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function
18*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Worker# load BPF program
21*387f9dfdSAndroid Build Coastguard Workerb = BPF(text="""
22*387f9dfdSAndroid Build Coastguard Worker#define EXIT_REASON 18
23*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, u8, u8);
24*387f9dfdSAndroid Build Coastguard Worker
25*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(kvm, kvm_exit) {
26*387f9dfdSAndroid Build Coastguard Worker    u8 e = EXIT_REASON;
27*387f9dfdSAndroid Build Coastguard Worker    u8 one = 1;
28*387f9dfdSAndroid Build Coastguard Worker    if (args->exit_reason == EXIT_REASON) {
29*387f9dfdSAndroid Build Coastguard Worker        bpf_trace_printk("KVM_EXIT exit_reason : %d\\n", args->exit_reason);
30*387f9dfdSAndroid Build Coastguard Worker        start.update(&e, &one);
31*387f9dfdSAndroid Build Coastguard Worker    }
32*387f9dfdSAndroid Build Coastguard Worker    return 0;
33*387f9dfdSAndroid Build Coastguard Worker}
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(kvm, kvm_entry) {
36*387f9dfdSAndroid Build Coastguard Worker    u8 e = EXIT_REASON;
37*387f9dfdSAndroid Build Coastguard Worker    u8 zero = 0;
38*387f9dfdSAndroid Build Coastguard Worker    u8 *s = start.lookup(&e);
39*387f9dfdSAndroid Build Coastguard Worker    if (s != NULL && *s == 1) {
40*387f9dfdSAndroid Build Coastguard Worker        bpf_trace_printk("KVM_ENTRY vcpu_id : %u\\n", args->vcpu_id);
41*387f9dfdSAndroid Build Coastguard Worker        start.update(&e, &zero);
42*387f9dfdSAndroid Build Coastguard Worker    }
43*387f9dfdSAndroid Build Coastguard Worker    return 0;
44*387f9dfdSAndroid Build Coastguard Worker}
45*387f9dfdSAndroid Build Coastguard Worker
46*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(kvm, kvm_hypercall) {
47*387f9dfdSAndroid Build Coastguard Worker    u8 e = EXIT_REASON;
48*387f9dfdSAndroid Build Coastguard Worker    u8 zero = 0;
49*387f9dfdSAndroid Build Coastguard Worker    u8 *s = start.lookup(&e);
50*387f9dfdSAndroid Build Coastguard Worker    if (s != NULL && *s == 1) {
51*387f9dfdSAndroid Build Coastguard Worker        bpf_trace_printk("HYPERCALL nr : %d\\n", args->nr);
52*387f9dfdSAndroid Build Coastguard Worker    }
53*387f9dfdSAndroid Build Coastguard Worker    return 0;
54*387f9dfdSAndroid Build Coastguard Worker};
55*387f9dfdSAndroid Build Coastguard Worker""")
56*387f9dfdSAndroid Build Coastguard Worker
57*387f9dfdSAndroid Build Coastguard Worker# header
58*387f9dfdSAndroid Build Coastguard Workerprint("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "EVENT"))
59*387f9dfdSAndroid Build Coastguard Worker
60*387f9dfdSAndroid Build Coastguard Worker# format output
61*387f9dfdSAndroid Build Coastguard Workerwhile 1:
62*387f9dfdSAndroid Build Coastguard Worker    try:
63*387f9dfdSAndroid Build Coastguard Worker        (task, pid, cpu, flags, ts, msg) = b.trace_fields()
64*387f9dfdSAndroid Build Coastguard Worker    except ValueError:
65*387f9dfdSAndroid Build Coastguard Worker        continue
66*387f9dfdSAndroid Build Coastguard Worker    print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))
67*387f9dfdSAndroid Build Coastguard Worker
68