// 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>

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);
}
