kvm_hypercall.php 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. $prog = <<<EOT
  3. #define EXIT_REASON 18
  4. BPF_HASH(start, u8, u8);
  5. TRACEPOINT_PROBE(kvm, kvm_exit) {
  6. u8 e = EXIT_REASON;
  7. u8 one = 1;
  8. if (args->exit_reason == EXIT_REASON) {
  9. bpf_trace_printk("KVM_EXIT exit_reason : %d\\n", args->exit_reason);
  10. start.update(&e, &one);
  11. }
  12. return 0;
  13. }
  14. TRACEPOINT_PROBE(kvm, kvm_entry) {
  15. u8 e = EXIT_REASON;
  16. u8 zero = 0;
  17. u8 *s = start.lookup(&e);
  18. if (s != NULL && *s == 1) {
  19. bpf_trace_printk("KVM_ENTRY vcpu_id : %u\\n", args->vcpu_id);
  20. start.update(&e, &zero);
  21. }
  22. return 0;
  23. }
  24. TRACEPOINT_PROBE(kvm, kvm_hypercall) {
  25. u8 e = EXIT_REASON;
  26. u8 zero = 0;
  27. u8 *s = start.lookup(&e);
  28. if (s != NULL && *s == 1) {
  29. bpf_trace_printk("HYPERCALL nr : %d\\n", args->nr);
  30. }
  31. return 0;
  32. };
  33. EOT;
  34. # load BPF program
  35. $b = new Bpf(["text" => $prog]);
  36. # header
  37. printf("%-18s %-16s %-6s %s\n", "TIME(s)", "COMM", "PID", "EVENT");
  38. # format output
  39. while (true) {
  40. try {
  41. list($task, $pid, $cpu, $flags, $ts, $msg) = $b->trace_fields();
  42. printf("%-18.9f %-16s %-6d %s\n", $ts, $task, $pid, $msg);
  43. flush();
  44. } catch (Exception $e) {
  45. exit();
  46. }
  47. }