1 // Copyright 2018 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6
7 #include <hypervisor/ktrace.h>
8 #include <kernel/thread.h>
9 #include <lib/ktrace.h>
10
11 static const char* const vcpu_meta[] = {
12 [VCPU_INTERRUPT] = "wait:interrupt",
13 [VCPU_PORT] = "wait:port",
14 };
15 static_assert((sizeof(vcpu_meta) / sizeof(vcpu_meta[0])) == VCPU_META_COUNT,
16 "vcpu_meta array must match enum VcpuMeta");
17
18 static const char* const vcpu_exit[] = {
19 #if ARCH_ARM64
20 [VCPU_UNDERFLOW_MAINTENANCE_INTERRUPT] = "exit:underflow_maintenance_interrupt",
21 [VCPU_PHYSICAL_INTERRUPT] = "exit:physical_interrupt",
22 [VCPU_WFI_INSTRUCTION] = "exit:wfi_instruction",
23 [VCPU_WFE_INSTRUCTION] = "exit:wfe_instruction",
24 [VCPU_SMC_INSTRUCTION] = "exit:smc_instruction",
25 [VCPU_SYSTEM_INSTRUCTION] = "exit:system_instruction",
26 [VCPU_INSTRUCTION_ABORT] = "exit:instruction_abort",
27 [VCPU_DATA_ABORT] = "exit:data_abort",
28 #elif ARCH_X86
29 [VCPU_EXTERNAL_INTERRUPT] = "exit:external_interrupt",
30 [VCPU_INTERRUPT_WINDOW] = "exit:interrupt_window",
31 [VCPU_CPUID] = "exit:cpuid",
32 [VCPU_HLT] = "exit:hlt",
33 [VCPU_CONTROL_REGISTER_ACCESS] = "exit:control_register_access",
34 [VCPU_IO_INSTRUCTION] = "exit:io_instruction",
35 [VCPU_RDMSR] = "exit:rdmsr",
36 [VCPU_WRMSR] = "exit:wrmsr",
37 [VCPU_VM_ENTRY_FAILURE] = "exit:vm_entry_failure",
38 [VCPU_EPT_VIOLATION] = "exit:ept_violation",
39 [VCPU_XSETBV] = "exit:xsetbv",
40 [VCPU_PAUSE] = "exit:pause",
41 [VCPU_VMCALL] = "exit:vmcall",
42 #endif
43 [VCPU_UNKNOWN] = "exit:unknown",
44 [VCPU_FAILURE] = "exit:failure",
45 };
46 static_assert((sizeof(vcpu_exit) / sizeof(vcpu_exit[0])) == VCPU_EXIT_COUNT,
47 "vcpu_exit array must match enum VcpuExit");
48
ktrace_report_vcpu_meta()49 void ktrace_report_vcpu_meta() {
50 for (uint32_t i = 0; i != VCPU_META_COUNT; i++) {
51 ktrace_name_etc(TAG_VCPU_META, i, 0, vcpu_meta[i], true);
52 }
53 for (uint32_t i = 0; i != VCPU_EXIT_COUNT; i++) {
54 ktrace_name_etc(TAG_VCPU_EXIT_META, i, 0, vcpu_exit[i], true);
55 }
56 }
57
ktrace_vcpu(uint32_t tag,VcpuMeta meta)58 void ktrace_vcpu(uint32_t tag, VcpuMeta meta) {
59 ktrace(tag, meta, 0, 0, 0);
60 }
61
ktrace_vcpu_exit(VcpuExit exit,uint64_t exit_address)62 void ktrace_vcpu_exit(VcpuExit exit, uint64_t exit_address) {
63 ktrace(TAG_VCPU_EXIT, exit, static_cast<uint32_t>(exit_address),
64 static_cast<uint32_t>(exit_address >> 32), 0);
65 }