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 11static const char* const vcpu_meta[] = { 12 [VCPU_INTERRUPT] = "wait:interrupt", 13 [VCPU_PORT] = "wait:port", 14}; 15static_assert((sizeof(vcpu_meta) / sizeof(vcpu_meta[0])) == VCPU_META_COUNT, 16 "vcpu_meta array must match enum VcpuMeta"); 17 18static 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}; 46static_assert((sizeof(vcpu_exit) / sizeof(vcpu_exit[0])) == VCPU_EXIT_COUNT, 47 "vcpu_exit array must match enum VcpuExit"); 48 49void 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 58void ktrace_vcpu(uint32_t tag, VcpuMeta meta) { 59 ktrace(tag, meta, 0, 0, 0); 60} 61 62void 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}