// 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 <lib/ktrace.h>

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

#if defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wc99-designator"
#endif
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",
    [VCPU_SERROR_INTERRUPT] = "exit:serror_interrupt",
#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_NOT_SUPPORTED] = "exit:not_supported",
    [VCPU_FAILURE] = "exit:failure",
};
#if defined(__clang__)
#pragma GCC diagnostic pop
#endif
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);
}
