#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <machine/cpu.h>
#include <machine/hypervisor.h>
#include <dev/vmm/vmm_vm.h>
#include "arm64.h"
#include "reset.h"
#define ARCH_UNKNOWN 0
#define set_arch_unknown(reg) (memset(&(reg), ARCH_UNKNOWN, sizeof(reg)))
void
reset_vm_el01_regs(void *vcpu)
{
struct hypctx *el2ctx;
el2ctx = vcpu;
set_arch_unknown(el2ctx->tf);
set_arch_unknown(el2ctx->actlr_el1);
set_arch_unknown(el2ctx->afsr0_el1);
set_arch_unknown(el2ctx->afsr1_el1);
set_arch_unknown(el2ctx->amair_el1);
set_arch_unknown(el2ctx->contextidr_el1);
set_arch_unknown(el2ctx->cpacr_el1);
set_arch_unknown(el2ctx->csselr_el1);
set_arch_unknown(el2ctx->elr_el1);
set_arch_unknown(el2ctx->esr_el1);
set_arch_unknown(el2ctx->far_el1);
set_arch_unknown(el2ctx->mair_el1);
set_arch_unknown(el2ctx->mdccint_el1);
set_arch_unknown(el2ctx->mdscr_el1);
set_arch_unknown(el2ctx->par_el1);
el2ctx->sctlr_el1 = SCTLR_RES1;
el2ctx->sctlr_el1 &= ~SCTLR_M & ~SCTLR_C & ~SCTLR_I;
el2ctx->sctlr_el1 |= SCTLR_CP15BEN;
set_arch_unknown(el2ctx->sp_el0);
set_arch_unknown(el2ctx->tcr_el1);
set_arch_unknown(el2ctx->tpidr_el0);
set_arch_unknown(el2ctx->tpidr_el1);
set_arch_unknown(el2ctx->tpidrro_el0);
set_arch_unknown(el2ctx->ttbr0_el1);
set_arch_unknown(el2ctx->ttbr1_el1);
set_arch_unknown(el2ctx->vbar_el1);
set_arch_unknown(el2ctx->spsr_el1);
set_arch_unknown(el2ctx->dbgbcr_el1);
set_arch_unknown(el2ctx->dbgbvr_el1);
set_arch_unknown(el2ctx->dbgwcr_el1);
set_arch_unknown(el2ctx->dbgwvr_el1);
el2ctx->pmcr_el0 = READ_SPECIALREG(pmcr_el0) & PMCR_N_MASK;
el2ctx->pmcr_el0 |= PMCR_LC;
set_arch_unknown(el2ctx->pmccntr_el0);
set_arch_unknown(el2ctx->pmccfiltr_el0);
set_arch_unknown(el2ctx->pmuserenr_el0);
set_arch_unknown(el2ctx->pmselr_el0);
set_arch_unknown(el2ctx->pmxevcntr_el0);
set_arch_unknown(el2ctx->pmcntenset_el0);
set_arch_unknown(el2ctx->pmintenset_el1);
set_arch_unknown(el2ctx->pmovsset_el0);
memset(el2ctx->pmevcntr_el0, 0, sizeof(el2ctx->pmevcntr_el0));
memset(el2ctx->pmevtyper_el0, 0, sizeof(el2ctx->pmevtyper_el0));
}
void
reset_vm_el2_regs(void *vcpu)
{
struct hypctx *el2ctx;
uint64_t cpu_aff, vcpuid;
el2ctx = vcpu;
vcpuid = vcpu_vcpuid(el2ctx->vcpu);
el2ctx->hcr_el2 = HCR_RW | HCR_TID3 | HCR_TWI | HCR_BSU_IS | HCR_FB |
HCR_AMO | HCR_IMO | HCR_FMO | HCR_SWIO | HCR_VM;
if (in_vhe()) {
el2ctx->hcr_el2 |= HCR_E2H;
}
el2ctx->hcrx_el2 = 0;
el2ctx->mdcr_el2 = MDCR_EL2_TDOSA | MDCR_EL2_TDRA | MDCR_EL2_TPMS |
MDCR_EL2_TTRF;
el2ctx->mdcr_el2 |= (el2ctx->pmcr_el0 & PMCR_N_MASK) >> PMCR_N_SHIFT;
el2ctx->vmpidr_el2 = VMPIDR_EL2_RES1;
el2ctx->vmpidr_el2 &= ~VMPIDR_EL2_U & ~VMPIDR_EL2_MT;
cpu_aff = (vcpuid & 0xf) << MPIDR_AFF0_SHIFT |
((vcpuid >> 4) & 0xff) << MPIDR_AFF1_SHIFT |
((vcpuid >> 12) & 0xff) << MPIDR_AFF2_SHIFT |
((vcpuid >> 20) & 0xff) << MPIDR_AFF3_SHIFT;
el2ctx->vmpidr_el2 |= cpu_aff;
el2ctx->vpidr_el2 = CPU_IMPL_TO_MIDR(CPU_IMPL_ARM);
el2ctx->vpidr_el2 |= CPU_VAR_TO_MIDR(0);
el2ctx->vpidr_el2 |= CPU_ARCH_TO_MIDR(0xf);
el2ctx->vpidr_el2 |= CPU_PART_TO_MIDR(CPU_PART_FOUNDATION);
el2ctx->vpidr_el2 |= CPU_REV_TO_MIDR(0);
if (in_vhe())
el2ctx->cptr_el2 = CPTR_E2H_TRAP_ALL | CPTR_E2H_FPEN;
else
el2ctx->cptr_el2 = CPTR_TRAP_ALL & ~CPTR_TFP;
el2ctx->cptr_el2 &= ~CPTR_TCPAC;
el2ctx->tf.tf_spsr = PSR_D | PSR_A | PSR_I | PSR_F;
el2ctx->tf.tf_spsr |= PSR_M_EL1h;
if ((el2ctx->hyp->feats & HYP_FEAT_FGT) != 0) {
#define HFGT_TRAP_FIELDS(read, write, read_pfx, write_pfx, name, trap) \
do { \
el2ctx->read |= read_pfx ## _EL2_ ## name ## _ ## trap; \
el2ctx->write |= write_pfx ## _EL2_ ## name ## _ ## trap; \
} while (0)
el2ctx->hdfgrtr_el2 = 0;
el2ctx->hdfgwtr_el2 = 0;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
nBRBDATA, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
nBRBCTL, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_nBRBIDR_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBTRG_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBSR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBPTR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBMAR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBLIMITR_EL1, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRBIDR_EL1_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRBBASER_EL1, TRAP);
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_TRFCR_EL1_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCVICTLR, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCSTATR_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCSSCSRn, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCSEQSTR, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCPRGCTLR, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCOSLSR_TRAP;
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_TRCOSLAR_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCIMSPECn, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCID_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCCNTVRn, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCCLAIM, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRCAUXCTLR, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCAUTHSTATUS_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
TRC, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSLATFR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSIRR_EL1, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_PMBIDR_EL1_TRAP;
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_PMSIDR_EL1_TRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSICR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSFCR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSEVFR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSCR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMBSR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMBPTR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMBLIMITR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
nPMSNEVFR_EL1, TRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_PMCEIDn_EL0_NOTRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMUSERENR_EL0, NOTRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_PMMIR_EL1_NOTRAP;
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_PMCR_EL0_NOTRAP;
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_PMSWINC_EL0_NOTRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMSELR_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMOVS, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMINTEN, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMCNTEN, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMCCNTR_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMCCFILTR_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMEVTYPERn_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
PMEVCNTRn_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
OSDLR_EL1, TRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
OSECCR_EL1, NOTRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_OSLSR_EL1_NOTRAP;
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_OSLAR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
DBGPRCR_EL1, NOTRAP);
el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_DBGAUTHSTATUS_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
DBGCLAIM, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
MDSCR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
DBGWVRn_EL1, NOTRAP);
el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_DBGWCRn_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
DBGBVRn_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
DBGBCRn_EL1, NOTRAP);
el2ctx->hfgrtr_el2 = 0;
el2ctx->hfgwtr_el2 = 0;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nAMAIR2_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nMAIR2_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nS2POR_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nPOR_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nPOR_EL0, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nPIR_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nPIRE0_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nRCWMASK_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nTPIDR2_EL0, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nSMPRI_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nGCS_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nGCS_EL0, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
nACCDATA_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXPFGCDN_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXPFGCTL_EL1, TRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERXPFGF_EL1_TRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXADDR_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXMISCn_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXSTATUS_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERXCTLR_EL1, TRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERXFR_EL1_TRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ERRSELR_EL1, TRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERRIDR_EL1_TRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ICC_IGRPENn_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
LORSA_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
LORN_EL1, TRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_LORID_EL1_TRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
LOREA_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
LORC_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
APIBKey, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
APIAKey, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
APGAKey, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
APDBKey, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
APDAKey, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
VBAR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TTBR1_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TTBR0_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TPIDR_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TPIDRRO_EL0, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TPIDR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
TCR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
SCXTNUM_EL0, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
SCXTNUM_EL1, TRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
SCTLR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_REVIDR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
PAR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_MPIDR_EL1_NOTRAP;
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_MIDR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
MAIR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ISR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
FAR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
ESR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_DCZID_EL0_NOTRAP;
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_CTR_EL0_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
CSSELR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
CPACR_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
CONTEXTIDR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_CLIDR_EL1_NOTRAP;
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_CCSIDR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
AMAIR_EL1, NOTRAP);
el2ctx->hfgrtr_el2 |= HFGRTR_EL2_AIDR_EL1_NOTRAP;
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
AFSR1_EL1, NOTRAP);
HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
AFSR0_EL1, NOTRAP);
el2ctx->hfgitr_el2 = 0;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_ATS1E1A_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_COSPRCTX_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_nGCSEPP_TRAP |
HFGITR_EL2_nGCSSTR_EL1_TRAP |
HFGITR_EL2_nGCSPUSHM_EL1_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_nBRBIALL_TRAP |
HFGITR_EL2_nBRBINJ_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_CPPRCTX_TRAP |
HFGITR_EL2_DVPRCTX_TRAP |
HFGITR_EL2_CFPRCTX_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_TLBIRVAALE1_TRAP |
HFGITR_EL2_TLBIRVALE1_TRAP |
HFGITR_EL2_TLBIRVAAE1_TRAP |
HFGITR_EL2_TLBIRVAE1_TRAP |
HFGITR_EL2_TLBIRVAALE1IS_TRAP |
HFGITR_EL2_TLBIRVALE1IS_TRAP |
HFGITR_EL2_TLBIRVAAE1IS_TRAP |
HFGITR_EL2_TLBIRVAE1IS_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_TLBIRVAALE1OS_TRAP |
HFGITR_EL2_TLBIRVALE1OS_TRAP |
HFGITR_EL2_TLBIRVAAE1OS_TRAP |
HFGITR_EL2_TLBIRVAE1OS_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_TLBIVAALE1OS_TRAP |
HFGITR_EL2_TLBIVALE1OS_TRAP |
HFGITR_EL2_TLBIVAAE1OS_TRAP |
HFGITR_EL2_TLBIASIDE1OS_TRAP |
HFGITR_EL2_TLBIVAE1OS_TRAP |
HFGITR_EL2_TLBIVMALLE1OS_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_ATS1E1WP_TRAP |
HFGITR_EL2_ATS1E1RP_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_DCCVADP_TRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_DCCVAC_NOTRAP |
HFGITR_EL2_SVC_EL1_NOTRAP |
HFGITR_EL2_SVC_EL0_NOTRAP |
HFGITR_EL2_ERET_NOTRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_TLBIVAALE1_NOTRAP |
HFGITR_EL2_TLBIVALE1_NOTRAP |
HFGITR_EL2_TLBIVAAE1_NOTRAP |
HFGITR_EL2_TLBIASIDE1_NOTRAP |
HFGITR_EL2_TLBIVAE1_NOTRAP |
HFGITR_EL2_TLBIVMALLE1_NOTRAP |
HFGITR_EL2_TLBIVAALE1IS_NOTRAP |
HFGITR_EL2_TLBIVALE1IS_NOTRAP |
HFGITR_EL2_TLBIVAAE1IS_NOTRAP |
HFGITR_EL2_TLBIASIDE1IS_NOTRAP |
HFGITR_EL2_TLBIVAE1IS_NOTRAP |
HFGITR_EL2_TLBIVMALLE1IS_NOTRAP;
el2ctx->hfgitr_el2 |=
HFGITR_EL2_ATS1E0W_NOTRAP |
HFGITR_EL2_ATS1E0R_NOTRAP |
HFGITR_EL2_ATS1E1W_NOTRAP |
HFGITR_EL2_ATS1E1R_NOTRAP |
HFGITR_EL2_DCZVA_NOTRAP |
HFGITR_EL2_DCCIVAC_NOTRAP |
HFGITR_EL2_DCCVAP_NOTRAP |
HFGITR_EL2_DCCVAU_NOTRAP |
HFGITR_EL2_DCCISW_NOTRAP |
HFGITR_EL2_DCCSW_NOTRAP |
HFGITR_EL2_DCISW_NOTRAP |
HFGITR_EL2_DCIVAC_NOTRAP |
HFGITR_EL2_ICIVAU_NOTRAP |
HFGITR_EL2_ICIALLU_NOTRAP |
HFGITR_EL2_ICIALLUIS_NOTRAP;
}
if ((el2ctx->hyp->feats & HYP_FEAT_FGT2) != 0) {
el2ctx->hdfgrtr2_el2 = 0;
el2ctx->hdfgwtr2_el2 = 0;
el2ctx->hfgitr2_el2 = 0;
el2ctx->hfgrtr2_el2 = 0;
el2ctx->hfgwtr2_el2 = 0;
}
}