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