// Copyright 2018 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#include <hypervisor/ktrace.h>
#include <kernel/thread.h>
#include <lib/ktrace.h>

static const char* const vcpu_meta[] = {
        [VCPU_INTERRUPT] = "wait:interrupt",
        [VCPU_PORT] = "wait:port",
};
static_assert((sizeof(vcpu_meta) / sizeof(vcpu_meta[0])) == VCPU_META_COUNT,
              "vcpu_meta array must match enum VcpuMeta");

static const char* const vcpu_exit[] = {
#if ARCH_ARM64
        [VCPU_UNDERFLOW_MAINTENANCE_INTERRUPT] = "exit:underflow_maintenance_interrupt",
        [VCPU_PHYSICAL_INTERRUPT] = "exit:physical_interrupt",
        [VCPU_WFI_INSTRUCTION] = "exit:wfi_instruction",
        [VCPU_WFE_INSTRUCTION] = "exit:wfe_instruction",
        [VCPU_SMC_INSTRUCTION] = "exit:smc_instruction",
        [VCPU_SYSTEM_INSTRUCTION] = "exit:system_instruction",
        [VCPU_INSTRUCTION_ABORT] = "exit:instruction_abort",
        [VCPU_DATA_ABORT] = "exit:data_abort",
#elif ARCH_X86
        [VCPU_EXTERNAL_INTERRUPT] = "exit:external_interrupt",
        [VCPU_INTERRUPT_WINDOW] = "exit:interrupt_window",
        [VCPU_CPUID] = "exit:cpuid",
        [VCPU_HLT] = "exit:hlt",
        [VCPU_CONTROL_REGISTER_ACCESS] = "exit:control_register_access",
        [VCPU_IO_INSTRUCTION] = "exit:io_instruction",
        [VCPU_RDMSR] = "exit:rdmsr",
        [VCPU_WRMSR] = "exit:wrmsr",
        [VCPU_VM_ENTRY_FAILURE] = "exit:vm_entry_failure",
        [VCPU_EPT_VIOLATION] = "exit:ept_violation",
        [VCPU_XSETBV] = "exit:xsetbv",
        [VCPU_PAUSE] = "exit:pause",
        [VCPU_VMCALL] = "exit:vmcall",
#endif
        [VCPU_UNKNOWN] = "exit:unknown",
        [VCPU_FAILURE] = "exit:failure",
};
static_assert((sizeof(vcpu_exit) / sizeof(vcpu_exit[0])) == VCPU_EXIT_COUNT,
              "vcpu_exit array must match enum VcpuExit");

void ktrace_report_vcpu_meta() {
    for (uint32_t i = 0; i != VCPU_META_COUNT; i++) {
        ktrace_name_etc(TAG_VCPU_META, i, 0, vcpu_meta[i], true);
    }
    for (uint32_t i = 0; i != VCPU_EXIT_COUNT; i++) {
        ktrace_name_etc(TAG_VCPU_EXIT_META, i, 0, vcpu_exit[i], true);
    }
}

void ktrace_vcpu(uint32_t tag, VcpuMeta meta) {
    ktrace(tag, meta, 0, 0, 0);
}

void ktrace_vcpu_exit(VcpuExit exit, uint64_t exit_address) {
    ktrace(TAG_VCPU_EXIT, exit, static_cast<uint32_t>(exit_address),
           static_cast<uint32_t>(exit_address >> 32), 0);
}