/*
 * Copyright 2019 The Hafnium Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "feature_id.h"

#include "hf/check.h"
#include "hf/dlog.h"
#include "hf/types.h"
#include "hf/vm.h"

#include "msr.h"
#include "sysregs.h"

/* clang-format off */

/**
 * Definitions of read-only feature ID (group 3) registers' encodings.
 * See Arm Architecture Reference Manual Armv8-A, Table D1-52 and D12-2.
 * NAME, op0, op1, crn, crm, op2
 */
#define FEATURE_ID_REGISTERS_READ              \
	X(ID_PFR0_EL1       , 3, 0,  0,  1, 0) \
	X(ID_PFR1_EL1       , 3, 0,  0,  1, 1) \
	X(ID_DFR0_EL1       , 3, 0,  0,  1, 2) \
	X(ID_AFR0_EL1       , 3, 0,  0,  1, 3) \
	X(ID_MMFR0_EL1      , 3, 0,  0,  1, 4) \
	X(ID_MMFR1_EL1      , 3, 0,  0,  1, 5) \
	X(ID_MMFR2_EL1      , 3, 0,  0,  1, 6) \
	X(ID_MMFR3_EL1      , 3, 0,  0,  1, 7) \
	X(ID_ISAR0_EL1      , 3, 0,  0,  2, 0) \
	X(ID_ISAR1_EL1      , 3, 0,  0,  2, 1) \
	X(ID_ISAR2_EL1      , 3, 0,  0,  2, 2) \
	X(ID_ISAR3_EL1      , 3, 0,  0,  2, 3) \
	X(ID_ISAR4_EL1      , 3, 0,  0,  2, 4) \
	X(ID_ISAR5_EL1      , 3, 0,  0,  2, 5) \
	X(ID_MMFR4_EL1      , 3, 0,  0,  2, 6) \
	\
	X(MVFR0_EL1         , 3, 0,  0,  3, 0) \
	X(MVFR1_EL1         , 3, 0,  0,  3, 1) \
	X(MVFR2_EL1         , 3, 0,  0,  3, 2) \
	\
	X(ID_AA64PFR0_EL1   , 3, 0,  0,  4, 0) \
	X(ID_AA64PFR1_EL1   , 3, 0,  0,  4, 1) \
	\
	X(ID_AA64DFR0_EL1   , 3, 0,  0,  5, 0) \
	X(ID_AA64DFR1_EL1   , 3, 0,  0,  5, 1) \
	\
	X(ID_AA64AFR0_EL1   , 3, 0,  0,  5, 4) \
	X(ID_AA64AFR1_EL1   , 3, 0,  0,  5, 5) \
	\
	X(ID_AA64ISAR0_EL1  , 3, 0,  0,  6, 0) \
	X(ID_AA64ISAR1_EL1  , 3, 0,  0,  6, 1) \
	\
	X(ID_AA64MMFR0_EL1  , 3, 0,  0,  7, 0) \
	X(ID_AA64MMFR1_EL1  , 3, 0,  0,  7, 1) \
	X(ID_AA64MMFR2_EL1  , 3, 0,  0,  7, 2)

/* clang-format on */

enum {
#define X(reg_name, op0, op1, crn, crm, op2) \
	reg_name##_ENC = GET_ISS_ENCODING(op0, op1, crn, crm, op2),
	FEATURE_ID_REGISTERS_READ
#undef X
};

/**
 * Returns true if the ESR register shows an access to a feature ID group 3
 * register.
 */
bool feature_id_is_register_access(uintreg_t esr)
{
	uintreg_t op0 = GET_ISS_OP0(esr);
	uintreg_t op1 = GET_ISS_OP1(esr);
	uintreg_t crn = GET_ISS_CRN(esr);
	uintreg_t crm = GET_ISS_CRM(esr);

	/* From the Arm Architecture Reference Manual Table D12-2. */
	return op0 == 3 && op1 == 0 && crn == 0 && crm >= 1 && crm <= 7;
}

/**
 * RAS-related. RES0 when RAS is not implemented.
 */
#define ID_AA64MMFR1_EL1_SPEC_SEI (UINT64_C(0xf) << 24)

/**
 * Indicates support for LORegions.
 */
#define ID_AA64MMFR1_EL1_LO (UINT64_C(0xf) << 24)

/**
 * RAS Extension version.
 */
#define ID_AA64PFR0_EL1_RAS (UINT64_C(0xf) << 28)

/**
 * Self-hosted Trace Extension Version
 */
#define ID_AA64DFR0_EL1_TRACE_FILT (UINT64_C(0xf) << 40)

/**
 * OS Double Lock implemented.
 */
#define ID_AA64DFR0_EL1_DOUBLE_LOCK (UINT64_C(0xf) << 36)

/**
 * Statistical Profiling Extension version.
 */
#define ID_AA64DFR0_EL1_PMS_VER (UINT64_C(0xf) << 32)

/**
 * Performance Monitors Extension version.
 */
#define ID_AA64DFR0_EL1_PMU_VER (UINT64_C(0xf) << 8)

/**
 * Indicates whether System register interface to trace unit is implemented.
 */
#define ID_AA64DFR0_EL1_TRACE_VER (UINT64_C(0xf) << 4)

/**
 * Debug architecture version.
 */
#define ID_AA64DFR0_EL1_DEBUG_VER (UINT64_C(0xf))

/**
 * PAuth: whether an implementation defined algorithm for generic code
 * authentication is implemented.
 */
#define ID_AA64ISAR1_EL1_GPI (UINT64_C(0xf) << 28)

/**
 * PAuth: whether QARMA or Architected algorithm for generic code authentication
 * is implemented.
 */
#define ID_AA64ISAR1_EL1_GPA (UINT64_C(0xf) << 24)

/**
 * PAuth: whether an implementation defined algorithm for address authentication
 * is implemented.
 */
#define ID_AA64ISAR1_EL1_API (UINT64_C(0xf) << 8)

/**
 * PAuth: whether QARMA or Architected algorithm for address authentication is
 * implemented.
 */
#define ID_AA64ISAR1_EL1_APA (UINT64_C(0xf) << 24)

void feature_set_traps(struct vm *vm, struct arch_regs *regs)
{
	arch_features_t features = vm->arch.trapped_features;

	if (features & ~HF_FEATURE_ALL) {
		panic("features has undefined bits 0x%x", features);
	}

	/* By default do not mask out any features. */
	vm->arch.tid3_masks.id_aa64mmfr1_el1 = ~0ULL;
	vm->arch.tid3_masks.id_aa64pfr0_el1 = ~0ULL;
	vm->arch.tid3_masks.id_aa64dfr0_el1 = ~0ULL;
	vm->arch.tid3_masks.id_aa64isar1_el1 = ~0ULL;

	if (features & HF_FEATURE_RAS) {
		regs->lazy.hcr_el2 |= HCR_EL2_TERR;
		vm->arch.tid3_masks.id_aa64mmfr1_el1 &=
			~ID_AA64MMFR1_EL1_SPEC_SEI;
		vm->arch.tid3_masks.id_aa64pfr0_el1 &= ~ID_AA64PFR0_EL1_RAS;
	}

	if (features & HF_FEATURE_SPE) {
		/*
		 * Trap VM accesses to Statistical Profiling Extension (SPE)
		 * registers.
		 */
		regs->lazy.mdcr_el2 |= MDCR_EL2_TPMS;

		/*
		 * Set E2PB to 0b00. This ensures that accesses to Profiling
		 * Buffer controls at EL1 are trapped to EL2.
		 */
		regs->lazy.mdcr_el2 &= ~MDCR_EL2_E2PB;

		vm->arch.tid3_masks.id_aa64dfr0_el1 &= ~ID_AA64DFR0_EL1_PMS_VER;
	}

	if (features & HF_FEATURE_DEBUG) {
		regs->lazy.mdcr_el2 |=
			MDCR_EL2_TDRA | MDCR_EL2_TDOSA | MDCR_EL2_TDA;

		vm->arch.tid3_masks.id_aa64dfr0_el1 &=
			~ID_AA64DFR0_EL1_DOUBLE_LOCK;
	}

	if (features & HF_FEATURE_TRACE) {
		regs->lazy.mdcr_el2 |= MDCR_EL2_TTRF;

		vm->arch.tid3_masks.id_aa64dfr0_el1 &=
			~ID_AA64DFR0_EL1_TRACE_FILT;
		vm->arch.tid3_masks.id_aa64dfr0_el1 &=
			~ID_AA64DFR0_EL1_TRACE_VER;
	}

	if (features & HF_FEATURE_PERFMON) {
		regs->lazy.mdcr_el2 |= MDCR_EL2_TPM | MDCR_EL2_TPMCR;

		vm->arch.tid3_masks.id_aa64dfr0_el1 &= ~ID_AA64DFR0_EL1_PMU_VER;
	}

	if (features & HF_FEATURE_LOR) {
		regs->lazy.hcr_el2 |= HCR_EL2_TLOR;

		vm->arch.tid3_masks.id_aa64mmfr1_el1 &= ~ID_AA64MMFR1_EL1_LO;
	}

	if (features & HF_FEATURE_PAUTH) {
		/* APK and API bits *enable* trapping when cleared. */
		regs->lazy.hcr_el2 &= ~(HCR_EL2_APK | HCR_EL2_API);

		vm->arch.tid3_masks.id_aa64isar1_el1 &= ~ID_AA64ISAR1_EL1_GPI;
		vm->arch.tid3_masks.id_aa64isar1_el1 &= ~ID_AA64ISAR1_EL1_GPA;
		vm->arch.tid3_masks.id_aa64isar1_el1 &= ~ID_AA64ISAR1_EL1_API;
		vm->arch.tid3_masks.id_aa64isar1_el1 &= ~ID_AA64ISAR1_EL1_APA;
	}
}

/**
 * Processes an access (mrs) to a feature ID register.
 * Returns true if the access was allowed and performed, false otherwise.
 */
bool feature_id_process_access(struct vcpu *vcpu, uintreg_t esr)
{
	const struct vm *vm = vcpu->vm;
	uintreg_t sys_register = GET_ISS_SYSREG(esr);
	uintreg_t rt_register = GET_ISS_RT(esr);
	uintreg_t value;

	/* +1 because Rt can access register XZR */
	CHECK(rt_register < NUM_GP_REGS + 1);

	if (!ISS_IS_READ(esr)) {
		dlog_notice(
			"Unsupported feature ID register write: "
			"op0=%d, op1=%d, crn=%d, crm=%d, op2=%d, rt=%d.\n",
			GET_ISS_OP0(esr), GET_ISS_OP1(esr), GET_ISS_CRN(esr),
			GET_ISS_CRM(esr), GET_ISS_OP2(esr), GET_ISS_RT(esr));
		return true;
	}

	switch (sys_register) {
#define X(reg_name, op0, op1, crn, crm, op2)              \
	case (GET_ISS_ENCODING(op0, op1, crn, crm, op2)): \
		value = read_msr(reg_name);               \
		break;
		FEATURE_ID_REGISTERS_READ
#undef X
	default:
		/* Reserved registers should be read as zero (raz). */
		value = 0;
		dlog_notice(
			"Unsupported feature ID register read: "
			"op0=%d, op1=%d, crn=%d, crm=%d, op2=%d, rt=%d.\n",
			GET_ISS_OP0(esr), GET_ISS_OP1(esr), GET_ISS_CRN(esr),
			GET_ISS_CRM(esr), GET_ISS_OP2(esr), GET_ISS_RT(esr));
		break;
	}

	/* Mask values for features Hafnium might restrict. */
	switch (sys_register) {
	case ID_AA64MMFR1_EL1_ENC:
		value &= vm->arch.tid3_masks.id_aa64mmfr1_el1;
		break;
	case ID_AA64PFR0_EL1_ENC:
		value &= vm->arch.tid3_masks.id_aa64pfr0_el1;
		break;
	case ID_AA64DFR0_EL1_ENC:
		value &= vm->arch.tid3_masks.id_aa64dfr0_el1;
		break;
	case ID_AA64ISAR1_EL1_ENC:
		value &= vm->arch.tid3_masks.id_aa64isar1_el1;
		break;
	default:
		break;
	}

	if (rt_register != RT_REG_XZR) {
		vcpu->regs.r[rt_register] = value;
	}

	return true;
}
