Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F158699971
D56555.id175978.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
40 KB
Referenced Files
None
Subscribers
None
D56555.id175978.diff
View Options
diff --git a/sys/arm64/vmm/arm64.h b/sys/arm64/vmm/arm64.h
--- a/sys/arm64/vmm/arm64.h
+++ b/sys/arm64/vmm/arm64.h
@@ -96,6 +96,37 @@
DBGWVR0_EL1, /* Debug Watchpoint Value Registers */
DBGWVR15_EL1 = DBGWVR0_EL1 + 15,
+ /* EL2 registers used to control the guest, but not exposed to it */
+ HOST_CPTR_EL2, /* Architectural Feature Trap Register */
+ HOST_HCR_EL2, /* Hypervisor Configuration Register */
+ HOST_HCRX_EL2, /* Extended Hypervisor Configuration Register */
+ HOST_MDCR_EL2, /* Monitor Debug Configuration Register */
+ HOST_VPIDR_EL2, /* Virtualization Processor ID Register */
+ HOST_VMPIDR_EL2, /* Virtualization Multiprocessor ID Register */
+ /* On systems without NV2 this still points to the register storage
+ memory page */
+ HOST_VNCR_EL2, /* Virtual Nested Control Register */
+ HOST_VTTBR_EL2,
+
+ /* FEAT_FGT registers */
+ /*HOST_HAFGRTR_EL2; */ /* For FEAT_AMUv1 (not supported) */
+ HOST_HDFGRTR_EL2,
+ HOST_HDFGWTR_EL2,
+ HOST_HFGITR_EL2,
+ HOST_HFGRTR_EL2,
+ HOST_HFGWTR_EL2,
+
+ /* FEAT_FGT2 registers */
+ HOST_HDFGRTR2_EL2,
+ HOST_HDFGWTR2_EL2,
+ HOST_HFGITR2_EL2,
+ HOST_HFGRTR2_EL2,
+ HOST_HFGWTR2_EL2,
+
+ /* Exit info registers */
+ HOST_FAR_EL2, /* Fault Address Register */
+ HOST_HPFAR_EL2, /* Hypervisor IPA Fault Address Register */
+
NR_NON_VNCR_REGS,
/* VNCR Registers */
@@ -196,42 +227,12 @@
*/
struct hypctx {
struct trapframe tf;
- /* Non-VNCR guest register state */
+ /* Non-VNCR register state */
uint64_t sys_regs[NR_NON_VNCR_REGS];
- /* EL2 registers which we use to control the guest but do not expose to it */
- uint64_t cptr_el2; /* Architectural Feature Trap Register */
- uint64_t hcr_el2; /* Hypervisor Configuration Register */
- uint64_t hcrx_el2; /* Extended Hypervisor Configuration Register */
- uint64_t mdcr_el2; /* Monitor Debug Configuration Register */
- uint64_t vpidr_el2; /* Virtualization Processor ID Register */
- uint64_t vmpidr_el2; /* Virtualization Multiprocessor ID Register */
- /* On systems without NV2 this still points to the register storage memory page */
- uint64_t vncr_el2; /* Virtual Nested Control Register */
-
- /* FEAT_FGT registers */
- /*uint64_t hafgrtr_el2; *//* For FEAT_AMUv1 (not supported) */
- uint64_t hdfgrtr_el2;
- uint64_t hdfgwtr_el2;
- uint64_t hfgitr_el2;
- uint64_t hfgrtr_el2;
- uint64_t hfgwtr_el2;
-
- /* FEAT_FGT2 registers */
- uint64_t hdfgrtr2_el2;
- uint64_t hdfgwtr2_el2;
- uint64_t hfgitr2_el2;
- uint64_t hfgrtr2_el2;
- uint64_t hfgwtr2_el2;
-
- uint64_t vttbr_el2;
uint64_t el2_addr; /* The address of this in el2 space */
struct hyp *hyp;
struct vcpu *vcpu;
- struct {
- uint64_t far_el2; /* Fault Address Register */
- uint64_t hpfar_el2; /* Hypervisor IPA Fault Address Register */
- } exit_info;
struct vtimer vtimer;
struct vtimer_cpu vtimer_cpu;
@@ -255,7 +256,7 @@
};
#define __hypctx_vncr_sysreg(hypctx, reg) \
- ((uint64_t*)(hypctx->vncr_el2 + REG_VNCR_OFFSET(reg)))
+ ((uint64_t*)(hypctx->sys_regs[HOST_VNCR_EL2] + REG_VNCR_OFFSET(reg)))
static inline uint64_t *
hypctx_sys_reg(struct hypctx *hypctx, int reg /* enum hypctx_sysreg */)
diff --git a/sys/arm64/vmm/io/vgic_v3.c b/sys/arm64/vmm/io/vgic_v3.c
--- a/sys/arm64/vmm/io/vgic_v3.c
+++ b/sys/arm64/vmm/io/vgic_v3.c
@@ -431,7 +431,7 @@
vm = hyp->vm;
for (int i = 0; i < vm_get_maxcpus(vm); i++) {
hypctx = hyp->ctx[i];
- if (hypctx != NULL && (hypctx->vmpidr_el2 & GICD_AFF) == mpidr)
+ if (hypctx != NULL && (hypctx_read_sys_reg(hypctx, HOST_VMPIDR_EL2) & GICD_AFF) == mpidr)
return (i);
}
return (-1);
@@ -481,7 +481,7 @@
mtx_init(&irq->irq_spinmtx, "VGIC IRQ spinlock", NULL,
MTX_SPIN);
irq->irq = irqid;
- irq->mpidr = hypctx->vmpidr_el2 & GICD_AFF;
+ irq->mpidr = hypctx_read_sys_reg(hypctx, HOST_VMPIDR_EL2) & GICD_AFF;
irq->target_vcpu = vcpu_vcpuid(hypctx->vcpu);
MPASS(irq->target_vcpu >= 0);
@@ -1470,7 +1470,7 @@
if (vcpu_vcpuid(hypctx->vcpu) == (vgic_max_cpu_count(hypctx->hyp) - 1))
last_vcpu = true;
- vmpidr_el2 = hypctx->vmpidr_el2;
+ vmpidr_el2 = hypctx_read_sys_reg(hypctx, HOST_VMPIDR_EL2);
MPASS(vmpidr_el2 != 0);
/*
* Get affinity for the current CPU. The guest CPU affinity is taken
diff --git a/sys/arm64/vmm/vmm_arm64.c b/sys/arm64/vmm/vmm_arm64.c
--- a/sys/arm64/vmm/vmm_arm64.c
+++ b/sys/arm64/vmm/vmm_arm64.c
@@ -557,8 +557,10 @@
size = el2_hypctx_size();
hypctx = malloc_aligned(size, PAGE_SIZE, M_HYP, M_WAITOK | M_ZERO);
- hypctx->vncr_el2 = (uint64_t)malloc_aligned(size, PAGE_SIZE, M_HYP, M_WAITOK | M_ZERO);
- hypctx->host_ctx_addr = (uint64_t)malloc_aligned(size, PAGE_SIZE, M_HYP, M_WAITOK | M_ZERO);
+ hypctx_write_sys_reg(hypctx, HOST_VNCR_EL2,
+ (uint64_t)malloc_aligned(size, PAGE_SIZE, M_HYP, M_WAITOK | M_ZERO));
+ hypctx->host_ctx_addr = (uint64_t)malloc_aligned(size, PAGE_SIZE, M_HYP,
+ M_WAITOK | M_ZERO);
KASSERT(vcpuid >= 0 && vcpuid < vm_get_maxcpus(hyp->vm),
("%s: Invalid vcpuid %d", __func__, vcpuid));
@@ -623,9 +625,9 @@
* Get the page address from HPFAR_EL2.
*/
vme_ret->u.inst_emul.gpa =
- HPFAR_EL2_FIPA_ADDR(hypctx->exit_info.hpfar_el2);
+ HPFAR_EL2_FIPA_ADDR(hypctx_read_sys_reg(hypctx, HOST_HPFAR_EL2));
/* Bits [11:0] are the same as bits [11:0] from the virtual address. */
- vme_ret->u.inst_emul.gpa += hypctx->exit_info.far_el2 &
+ vme_ret->u.inst_emul.gpa += hypctx_read_sys_reg(hypctx, HOST_FAR_EL2) &
FAR_EL2_HPFAR_PAGE_MASK;
esr_sas = (esr_iss & ISS_DATA_SAS_MASK) >> ISS_DATA_SAS_SHIFT;
@@ -738,11 +740,11 @@
case ISS_DATA_DFSC_PF_L1:
case ISS_DATA_DFSC_PF_L2:
case ISS_DATA_DFSC_PF_L3:
- gpa = HPFAR_EL2_FIPA_ADDR(hypctx->exit_info.hpfar_el2);
+ gpa = HPFAR_EL2_FIPA_ADDR(hypctx_read_sys_reg(hypctx, HOST_HPFAR_EL2));
/* Check the IPA is valid */
if (gpa >= (1ul << vmm_max_ipa_bits)) {
raise_data_insn_abort(hypctx,
- hypctx->exit_info.far_el2,
+ hypctx_read_sys_reg(hypctx, HOST_FAR_EL2),
esr_ec == EXCP_DATA_ABORT_L,
ISS_DATA_DFSC_ASF_L0);
vme_ret->inst_length = 0;
@@ -760,7 +762,7 @@
* not executable
*/
raise_data_insn_abort(hypctx,
- hypctx->exit_info.far_el2, false,
+ hypctx_read_sys_reg(hypctx, HOST_FAR_EL2), false,
ISS_DATA_DFSC_EXT);
vme_ret->inst_length = 0;
return (HANDLED);
@@ -1148,7 +1150,7 @@
/* Activate the stage2 pmap so the vmid is valid */
pmap_activate_vm(pmap);
- hypctx->vttbr_el2 = pmap_to_ttbr0(pmap);
+ hypctx_write_sys_reg(hypctx, HOST_VTTBR_EL2, pmap_to_ttbr0(pmap));
/*
* TODO: What happens if a timer interrupt is asserted exactly
@@ -1177,8 +1179,8 @@
vme->inst_length = INSN_SIZE;
vme->u.hyp.exception_nr = excp_type;
vme->u.hyp.esr_el2 = hypctx->tf.tf_esr;
- vme->u.hyp.far_el2 = hypctx->exit_info.far_el2;
- vme->u.hyp.hpfar_el2 = hypctx->exit_info.hpfar_el2;
+ vme->u.hyp.far_el2 = hypctx_read_sys_reg(hypctx, HOST_FAR_EL2);
+ vme->u.hyp.hpfar_el2 = hypctx_read_sys_reg(hypctx, HOST_HPFAR_EL2);
handled = arm64_handle_world_switch(hypctx, excp_type, vme,
pmap);
@@ -1221,7 +1223,7 @@
vmmpmap_remove(hypctx->el2_addr, el2_hypctx_size(), true);
free((uint64_t*)hypctx->host_ctx_addr, M_HYP);
- free((uint64_t*)hypctx->vncr_el2, M_HYP);
+ free((uint64_t*)hypctx_read_sys_reg(hypctx, HOST_VNCR_EL2), M_HYP);
free(hypctx, M_HYP);
}
@@ -1270,7 +1272,7 @@
case VM_REG_GUEST_TCR2_EL1:
return hypctx_sys_reg(hypctx, TCR2_EL1);
case VM_REG_GUEST_MPIDR_EL1:
- return (&hypctx->vmpidr_el2);
+ return hypctx_sys_reg(hypctx, HOST_VMPIDR_EL2);
default:
break;
}
@@ -1373,9 +1375,9 @@
if ((val != 0) == ((hypctx->setcaps & (1ul << num)) != 0))
break;
if (val != 0)
- hypctx->mdcr_el2 |= MDCR_EL2_TDE;
+ *hypctx_sys_reg(hypctx, HOST_MDCR_EL2) |= MDCR_EL2_TDE;
else if ((hypctx->setcaps & (1ul << VM_CAP_SS_EXIT)) == 0)
- hypctx->mdcr_el2 &= ~MDCR_EL2_TDE;
+ *hypctx_sys_reg(hypctx, HOST_MDCR_EL2) &= ~MDCR_EL2_TDE;
break;
case VM_CAP_SS_EXIT:
if ((val != 0) == ((hypctx->setcaps & (1ul << num)) != 0))
@@ -1387,7 +1389,7 @@
hypctx->tf.tf_spsr |= PSR_SS;
*hypctx_sys_reg(hypctx, MDSCR_EL1) |= MDSCR_SS;
- hypctx->mdcr_el2 |= MDCR_EL2_TDE;
+ *hypctx_sys_reg(hypctx, HOST_MDCR_EL2) |= MDCR_EL2_TDE;
} else {
hypctx->tf.tf_spsr &= ~PSR_SS;
hypctx->tf.tf_spsr |= hypctx->debug_spsr;
@@ -1396,7 +1398,7 @@
*hypctx_sys_reg(hypctx, MDSCR_EL1) |= hypctx->debug_mdscr;
hypctx->debug_mdscr &= ~MDSCR_SS;
if ((hypctx->setcaps & (1ul << VM_CAP_BRK_EXIT)) == 0)
- hypctx->mdcr_el2 &= ~MDCR_EL2_TDE;
+ *hypctx_sys_reg(hypctx, HOST_MDCR_EL2) &= ~MDCR_EL2_TDE;
}
break;
case VM_CAP_MASK_HWINTR:
diff --git a/sys/arm64/vmm/vmm_hyp.c b/sys/arm64/vmm/vmm_hyp.c
--- a/sys/arm64/vmm/vmm_hyp.c
+++ b/sys/arm64/vmm/vmm_hyp.c
@@ -156,7 +156,7 @@
}
if (!guest)
- hypctx->mdcr_el2 = READ_SPECIALREG(mdcr_el2);
+ hypctx_write_sys_reg(hypctx, HOST_MDCR_EL2, READ_SPECIALREG(mdcr_el2));
}
static void
@@ -260,7 +260,7 @@
if (guest) {
hypctx->tf.tf_esr = READ_SPECIALREG(esr_el2);
- hypctx->exit_info.far_el2 = READ_SPECIALREG(far_el2);
+ hypctx_write_sys_reg(hypctx, HOST_FAR_EL2, READ_SPECIALREG(far_el2));
hypctx_write_sys_reg(hypctx, PAR_EL1, READ_SPECIALREG(par_el1));
}
@@ -296,15 +296,15 @@
hypctx_write_sys_reg(hypctx, TTBR1_EL1, READ_SPECIALREG(EL1_REG(TTBR1)));
}
- hypctx->cptr_el2 = READ_SPECIALREG(cptr_el2);
- hypctx->hcr_el2 = READ_SPECIALREG(hcr_el2);
- hypctx->vpidr_el2 = READ_SPECIALREG(vpidr_el2);
- hypctx->vmpidr_el2 = READ_SPECIALREG(vmpidr_el2);
+ hypctx_write_sys_reg(hypctx, HOST_CPTR_EL2, READ_SPECIALREG(cptr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_HCR_EL2, READ_SPECIALREG(hcr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_VPIDR_EL2, READ_SPECIALREG(vpidr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_VMPIDR_EL2, READ_SPECIALREG(vmpidr_el2));
if (!guest) {
#ifndef VMM_VHE
if ((hyp->feats & HYP_FEAT_HCX) != 0)
- hypctx->hcrx_el2 = READ_SPECIALREG(MRS_REG_ALT_NAME(HCRX_EL2));
+ hypctx_write_sys_reg(hypctx, HOST_HCRX_EL2, READ_SPECIALREG(MRS_REG_ALT_NAME(HCRX_EL2)));
#endif
}
}
@@ -312,14 +312,14 @@
static void
vmm_hyp_reg_restore_special(struct hypctx *hypctx, struct hyp *hyp, bool guest)
{
- WRITE_SPECIALREG(hcr_el2, hypctx->hcr_el2);
+ WRITE_SPECIALREG(hcr_el2, hypctx_read_sys_reg(hypctx, HOST_HCR_EL2));
/* Always restore the register in non-VHE mode, only write it for the guest in VHE mode */
#ifdef VMM_VHE
if (guest) {
#endif
if ((hyp->feats & HYP_FEAT_HCX) != 0)
- WRITE_SPECIALREG(HCRX_EL2_REG, hypctx->hcrx_el2);
+ WRITE_SPECIALREG(HCRX_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HCRX_EL2));
#ifdef VMM_VHE
}
#endif
@@ -330,20 +330,20 @@
if (guest) {
/* Fine-grained trap controls */
if ((hyp->feats & HYP_FEAT_FGT) != 0) {
- WRITE_SPECIALREG(HDFGWTR_EL2_REG, hypctx->hdfgwtr_el2);
- WRITE_SPECIALREG(HFGITR_EL2_REG, hypctx->hfgitr_el2);
- WRITE_SPECIALREG(HFGRTR_EL2_REG, hypctx->hfgrtr_el2);
- WRITE_SPECIALREG(HFGWTR_EL2_REG, hypctx->hfgwtr_el2);
+ WRITE_SPECIALREG(HDFGWTR_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HDFGWTR_EL2));
+ WRITE_SPECIALREG(HFGITR_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGITR_EL2));
+ WRITE_SPECIALREG(HFGRTR_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGRTR_EL2));
+ WRITE_SPECIALREG(HFGWTR_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGWTR_EL2));
}
if ((hyp->feats & HYP_FEAT_FGT2) != 0) {
WRITE_SPECIALREG(HDFGRTR2_EL2_REG,
- hypctx->hdfgrtr2_el2);
+ hypctx_read_sys_reg(hypctx, HOST_HDFGRTR2_EL2));
WRITE_SPECIALREG(HDFGWTR2_EL2_REG,
- hypctx->hdfgwtr2_el2);
- WRITE_SPECIALREG(HFGITR2_EL2_REG, hypctx->hfgitr2_el2);
- WRITE_SPECIALREG(HFGRTR2_EL2_REG, hypctx->hfgrtr2_el2);
- WRITE_SPECIALREG(HFGWTR2_EL2_REG, hypctx->hfgwtr2_el2);
+ hypctx_read_sys_reg(hypctx, HOST_HDFGWTR2_EL2));
+ WRITE_SPECIALREG(HFGITR2_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGITR2_EL2));
+ WRITE_SPECIALREG(HFGRTR2_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGRTR2_EL2));
+ WRITE_SPECIALREG(HFGWTR2_EL2_REG, hypctx_read_sys_reg(hypctx, HOST_HFGWTR2_EL2));
}
}
#endif
@@ -383,9 +383,9 @@
WRITE_SPECIALREG(par_el1, hypctx_read_sys_reg(hypctx, PAR_EL1));
}
- WRITE_SPECIALREG(cptr_el2, hypctx->cptr_el2);
- WRITE_SPECIALREG(vpidr_el2, hypctx->vpidr_el2);
- WRITE_SPECIALREG(vmpidr_el2, hypctx->vmpidr_el2);
+ WRITE_SPECIALREG(cptr_el2, hypctx_read_sys_reg(hypctx, HOST_CPTR_EL2));
+ WRITE_SPECIALREG(vpidr_el2, hypctx_read_sys_reg(hypctx, HOST_VPIDR_EL2));
+ WRITE_SPECIALREG(vmpidr_el2, hypctx_read_sys_reg(hypctx, HOST_VMPIDR_EL2));
/* Load the special regs from the trapframe */
WRITE_SPECIALREG(sp_el1, hypctx->tf.tf_sp);
@@ -662,18 +662,18 @@
}
}
if (hpfar_valid) {
- hypctx->exit_info.hpfar_el2 = READ_SPECIALREG(hpfar_el2);
+ hypctx_write_sys_reg(hypctx, HOST_HPFAR_EL2, READ_SPECIALREG(hpfar_el2));
} else {
/*
* TODO: There is a risk the at instruction could cause an
* exception here. We should handle it & return a failure.
*/
s1e1r =
- arm64_address_translate_s1e1r(hypctx->exit_info.far_el2);
+ arm64_address_translate_s1e1r(hypctx_read_sys_reg(hypctx, HOST_FAR_EL2));
if (PAR_SUCCESS(s1e1r)) {
hpfar_el2 = (s1e1r & PAR_PA_MASK) >> PAR_PA_SHIFT;
hpfar_el2 <<= HPFAR_EL2_FIPA_SHIFT;
- hypctx->exit_info.hpfar_el2 = hpfar_el2;
+ hypctx_write_sys_reg(hypctx, HOST_HPFAR_EL2, hpfar_el2);
} else {
*ret = EXCP_TYPE_REENTER;
}
@@ -685,11 +685,11 @@
__vmm_hyp_call_guest(struct hypctx *hypctx, struct hypctx *host_hypctx)
{
uint64_t ret;
- WRITE_SPECIALREG(vttbr_el2, hypctx->vttbr_el2);
- WRITE_SPECIALREG(mdcr_el2, hypctx->mdcr_el2);
+ WRITE_SPECIALREG(vttbr_el2, hypctx_read_sys_reg(hypctx, HOST_VTTBR_EL2));
+ WRITE_SPECIALREG(mdcr_el2, hypctx_read_sys_reg(hypctx, HOST_MDCR_EL2));
/* Call into the guest */
ret = VMM_HYP_FUNC(do_call_guest)(hypctx);
- WRITE_SPECIALREG(mdcr_el2, host_hypctx->mdcr_el2);
+ WRITE_SPECIALREG(mdcr_el2, hypctx_read_sys_reg(host_hypctx, HOST_MDCR_EL2));
isb();
@@ -703,7 +703,7 @@
uint64_t ret;
/* Allows uniform implementation of guest and host register reloads */
- host_hypctx.vncr_el2 = hypctx->host_ctx_addr;
+ hypctx_write_sys_reg(&host_hypctx, HOST_VNCR_EL2, hypctx->host_ctx_addr);
vmm_hyp_reg_store(&host_hypctx, NULL, false);
vmm_hyp_reg_restore(hypctx, hyp, true);
diff --git a/sys/arm64/vmm/vmm_reset.c b/sys/arm64/vmm/vmm_reset.c
--- a/sys/arm64/vmm/vmm_reset.c
+++ b/sys/arm64/vmm/vmm_reset.c
@@ -97,23 +97,24 @@
* invalidate
* HCR_VM: use stage 2 translation
*/
- el2ctx->hcr_el2 = HCR_RW | HCR_TID3 | HCR_TWI | HCR_BSU_IS | HCR_FB |
- HCR_AMO | HCR_IMO | HCR_FMO | HCR_SWIO | HCR_VM;
+ hypctx_write_sys_reg(el2ctx, HOST_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;
+ *hypctx_sys_reg(el2ctx, HOST_HCR_EL2) |= HCR_E2H;
}
/* Set the Extended Hypervisor Configuration Register */
- el2ctx->hcrx_el2 = 0;
+ hypctx_write_sys_reg(el2ctx, HOST_HCRX_EL2, 0);
/* TODO: Trap all extensions we don't support */
- el2ctx->mdcr_el2 = MDCR_EL2_TDOSA | MDCR_EL2_TDRA | MDCR_EL2_TPMS |
- MDCR_EL2_TTRF;
+ hypctx_write_sys_reg(el2ctx, HOST_MDCR_EL2, MDCR_EL2_TDOSA | MDCR_EL2_TDRA | MDCR_EL2_TPMS | MDCR_EL2_TTRF);
/* PMCR_EL0.N is read from MDCR_EL2.HPMN */
- el2ctx->mdcr_el2 |= (hypctx_read_sys_reg(el2ctx, PMCR_EL0) & PMCR_N_MASK) >> PMCR_N_SHIFT;
+ *hypctx_sys_reg(el2ctx, HOST_MDCR_EL2) |= (hypctx_read_sys_reg(el2ctx, PMCR_EL0) & PMCR_N_MASK) >> PMCR_N_SHIFT;
- el2ctx->vmpidr_el2 = VMPIDR_EL2_RES1;
+ hypctx_write_sys_reg(el2ctx, HOST_VMPIDR_EL2, VMPIDR_EL2_RES1);
/* The guest will detect a multi-core, single-threaded CPU */
- el2ctx->vmpidr_el2 &= ~VMPIDR_EL2_U & ~VMPIDR_EL2_MT;
+ *hypctx_sys_reg(el2ctx, HOST_VMPIDR_EL2) &= ~VMPIDR_EL2_U & ~VMPIDR_EL2_MT;
/*
* Generate the guest MPIDR value. We only support 16 CPUs at affinity
* level 0 to simplify the vgicv3 driver (see writing sgi1r_el1).
@@ -122,24 +123,24 @@
((vcpuid >> 4) & 0xff) << MPIDR_AFF1_SHIFT |
((vcpuid >> 12) & 0xff) << MPIDR_AFF2_SHIFT |
((vcpuid >> 20) & 0xff) << MPIDR_AFF3_SHIFT;
- el2ctx->vmpidr_el2 |= cpu_aff;
+ *hypctx_sys_reg(el2ctx, HOST_VMPIDR_EL2) |= cpu_aff;
/* Use the same CPU identification information as the host */
- 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);
+ hypctx_write_sys_reg(el2ctx, HOST_VPIDR_EL2, CPU_IMPL_TO_MIDR(CPU_IMPL_ARM));
+ *hypctx_sys_reg(el2ctx, HOST_VPIDR_EL2) |= CPU_VAR_TO_MIDR(0);
+ *hypctx_sys_reg(el2ctx, HOST_VPIDR_EL2) |= CPU_ARCH_TO_MIDR(0xf);
+ *hypctx_sys_reg(el2ctx, HOST_VPIDR_EL2) |= CPU_PART_TO_MIDR(CPU_PART_FOUNDATION);
+ *hypctx_sys_reg(el2ctx, HOST_VPIDR_EL2) |= CPU_REV_TO_MIDR(0);
/*
* Don't trap accesses to CPACR_EL1, trace, SVE, Advanced SIMD
* and floating point functionality to EL2.
*/
if (in_vhe())
- el2ctx->cptr_el2 = CPTR_E2H_TRAP_ALL | CPTR_E2H_FPEN;
+ hypctx_write_sys_reg(el2ctx, HOST_CPTR_EL2, CPTR_E2H_TRAP_ALL | CPTR_E2H_FPEN);
else
- el2ctx->cptr_el2 = CPTR_TRAP_ALL & ~CPTR_TFP;
- el2ctx->cptr_el2 &= ~CPTR_TCPAC;
+ hypctx_write_sys_reg(el2ctx, HOST_CPTR_EL2, CPTR_TRAP_ALL & ~CPTR_TFP);
+ *hypctx_sys_reg(el2ctx, HOST_CPTR_EL2) &= ~CPTR_TCPAC;
/*
* Disable interrupts in the guest. The guest OS will re-enable
* them.
@@ -152,287 +153,303 @@
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; \
+ *hypctx_sys_reg(el2ctx, read) |= read_pfx ## _EL2_ ## name ## _ ## trap; \
+ *hypctx_sys_reg(el2ctx, write) |= write_pfx ## _EL2_ ## name ## _ ## trap; \
} while (0)
-
/*
* Traps for special registers
*/
/* Debug registers */
- el2ctx->hdfgrtr_el2 = 0;
- el2ctx->hdfgwtr_el2 = 0;
+ hypctx_write_sys_reg(el2ctx, HOST_HDFGRTR_EL2, 0);
+ hypctx_write_sys_reg(el2ctx, HOST_HDFGWTR_EL2, 0);
/* FEAT_BRBE */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
nBRBDATA, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
nBRBCTL, TRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_nBRBIDR_TRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_nBRBIDR_TRAP;
/* FEAT_TRBE */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBTRG_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBSR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBPTR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBMAR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBLIMITR_EL1, TRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRBIDR_EL1_TRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_TRBIDR_EL1_TRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRBBASER_EL1, TRAP);
/* FEAT_TRF */
- el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_TRFCR_EL1_TRAP;
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_TRFCR_EL1_TRAP;
/* FEAT_ETE */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCVICTLR, TRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCSTATR_TRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_TRCSTATR_TRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCSSCSRn, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCSEQSTR, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_TRCOSLSR_TRAP;
+
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_TRCOSLAR_TRAP;
+
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCIMSPECn, TRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCID_TRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_TRCID_TRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCCNTVRn, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCCLAIM, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRCAUXCTLR, TRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_TRCAUTHSTATUS_TRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_TRCAUTHSTATUS_TRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
TRC, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSLATFR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSIRR_EL1, TRAP);
/* FEAT_SPE */
- 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,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_PMBIDR_EL1_TRAP;
+
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_PMSIDR_EL1_TRAP;
+
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSICR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSFCR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSEVFR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSCR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMBSR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMBPTR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMBLIMITR_EL1, TRAP);
/* FEAT_SPE_FnE */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
nPMSNEVFR_EL1, TRAP);
/* FEAT_PMUv3 */
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_PMCEIDn_EL0_NOTRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_PMCEIDn_EL0_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx, HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_PMMIR_EL1_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_PMCR_EL0_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_PMSWINC_EL0_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMSELR_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMOVS, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMINTEN, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMCNTEN, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMCCNTR_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMCCFILTR_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMEVTYPERn_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
PMEVCNTRn_EL0, NOTRAP);
/* FEAT_DoubleLock */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
OSDLR_EL1, TRAP);
/* Base architecture */
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx, HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_OSLSR_EL1_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_OSLAR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
DBGPRCR_EL1, NOTRAP);
- el2ctx->hdfgrtr_el2 |= HDFGRTR_EL2_DBGAUTHSTATUS_EL1_NOTRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HDFGRTR_EL2) |= HDFGRTR_EL2_DBGAUTHSTATUS_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
DBGCLAIM, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
MDSCR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
DBGWVRn_EL1, NOTRAP);
- el2ctx->hdfgwtr_el2 |= HDFGWTR_EL2_DBGWCRn_EL1_NOTRAP;
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HDFGWTR_EL2) |= HDFGWTR_EL2_DBGWCRn_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
DBGBVRn_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hdfgrtr_el2, hdfgwtr_el2, HDFGRTR, HDFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HDFGRTR_EL2, HOST_HDFGWTR_EL2, HDFGRTR, HDFGWTR,
DBGBCRn_EL1, NOTRAP);
/* Non-debug special registers */
- el2ctx->hfgrtr_el2 = 0;
- el2ctx->hfgwtr_el2 = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGWTR_EL2) = 0;
/* FEAT_AIE */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nAMAIR2_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nMAIR2_EL1, TRAP);
/* FEAT_S2POE */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nS2POR_EL1, TRAP);
/* FEAT_S1POE */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nPOR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nPOR_EL0, TRAP);
/* FEAT_S1PIE */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nPIR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nPIRE0_EL1, TRAP);
/* FEAT_THE */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nRCWMASK_EL1, TRAP);
/* FEAT_SME */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nTPIDR2_EL0, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nSMPRI_EL1, TRAP);
/* FEAT_GCS */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nGCS_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nGCS_EL0, TRAP);
/* FEAT_LS64_ACCDATA */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
nACCDATA_EL1, TRAP);
/* FEAT_RASv1p1 */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXPFGCDN_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXPFGCTL_EL1, TRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERXPFGF_EL1_TRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_ERXPFGF_EL1_TRAP;
/* FEAT_RAS */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXADDR_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXMISCn_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXSTATUS_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERXCTLR_EL1, TRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERXFR_EL1_TRAP;
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ *hypctx_sys_reg(el2ctx,
+ HOST_HFGRTR_EL2) |= HFGRTR_EL2_ERXFR_EL1_TRAP;
+
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ERRSELR_EL1, TRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ERRIDR_EL1_TRAP;
+ *hypctx_sys_reg(el2ctx,
+ HOST_HFGRTR_EL2) |= HFGRTR_EL2_ERRIDR_EL1_TRAP;
/* GICv3 */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
ICC_IGRPENn_EL1, NOTRAP);
/* FEAT_LOR */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
LORSA_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
LORN_EL1, TRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_LORID_EL1_TRAP;
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_LORID_EL1_TRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
LOREA_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
LORC_EL1, TRAP);
/* FEAT_PAuth */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
APIBKey, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
APIAKey, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
APGAKey, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
APDBKey, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
APDAKey, TRAP);
/* Base architecture */
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
VBAR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TTBR1_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TTBR0_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TPIDR_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TPIDRRO_EL0, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TPIDR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
TCR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
SCXTNUM_EL0, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
SCXTNUM_EL1, TRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
SCTLR_EL1, NOTRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_REVIDR_EL1_NOTRAP;
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_REVIDR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_MPIDR_EL1_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_MIDR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
MAIR_EL1, NOTRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_ISR_EL1_NOTRAP;
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_ISR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
FAR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_DCZID_EL0_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_CTR_EL0_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
CSSELR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
CPACR_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_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,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_CLIDR_EL1_NOTRAP;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_CCSIDR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
AMAIR_EL1, NOTRAP);
- el2ctx->hfgrtr_el2 |= HFGRTR_EL2_AIDR_EL1_NOTRAP;
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR_EL2) |= HFGRTR_EL2_AIDR_EL1_NOTRAP;
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
AFSR1_EL1, NOTRAP);
- HFGT_TRAP_FIELDS(hfgrtr_el2, hfgwtr_el2, HFGRTR, HFGWTR,
+ HFGT_TRAP_FIELDS(HOST_HFGRTR_EL2, HOST_HFGWTR_EL2, HFGRTR, HFGWTR,
AFSR0_EL1, NOTRAP);
/*
@@ -440,35 +457,35 @@
*/
/* Enable all TLBI, cache and AT variants */
- el2ctx->hfgitr_el2 = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) = 0;
/* FEAT_ATS1A */
- el2ctx->hfgitr_el2 |=
- HFGITR_EL2_ATS1E1A_TRAP;
+ *hypctx_sys_reg(el2ctx,
+ HOST_HFGITR_EL2) |= HFGITR_EL2_ATS1E1A_TRAP;
/* FEAT_SPECRES2 */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_COSPRCTX_TRAP;
/* FEAT_GCS */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_nGCSEPP_TRAP |
HFGITR_EL2_nGCSSTR_EL1_TRAP |
HFGITR_EL2_nGCSPUSHM_EL1_TRAP;
/* FEAT_BRBE */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_nBRBIALL_TRAP |
HFGITR_EL2_nBRBINJ_TRAP;
/* FEAT_SPECRES */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_CPPRCTX_TRAP |
HFGITR_EL2_DVPRCTX_TRAP |
HFGITR_EL2_CFPRCTX_TRAP;
/* FEAT_TLBIRANGE */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_TLBIRVAALE1_TRAP |
HFGITR_EL2_TLBIRVALE1_TRAP |
HFGITR_EL2_TLBIRVAAE1_TRAP |
@@ -479,14 +496,14 @@
HFGITR_EL2_TLBIRVAE1IS_TRAP;
/* FEAT_TLBIRANGE && FEAT_TLBIOS */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_TLBIRVAALE1OS_TRAP |
HFGITR_EL2_TLBIRVALE1OS_TRAP |
HFGITR_EL2_TLBIRVAAE1OS_TRAP |
HFGITR_EL2_TLBIRVAE1OS_TRAP;
/* FEAT_TLBIOS */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_TLBIVAALE1OS_TRAP |
HFGITR_EL2_TLBIVALE1OS_TRAP |
HFGITR_EL2_TLBIVAAE1OS_TRAP |
@@ -495,22 +512,22 @@
HFGITR_EL2_TLBIVMALLE1OS_TRAP;
/* FEAT_PAN2 */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_ATS1E1WP_TRAP |
HFGITR_EL2_ATS1E1RP_TRAP;
/* FEAT_DPB2 */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_DCCVADP_TRAP;
/* Base architecture */
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_DCCVAC_NOTRAP |
HFGITR_EL2_SVC_EL1_NOTRAP |
HFGITR_EL2_SVC_EL0_NOTRAP |
HFGITR_EL2_ERET_NOTRAP;
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_TLBIVAALE1_NOTRAP |
HFGITR_EL2_TLBIVALE1_NOTRAP |
HFGITR_EL2_TLBIVAAE1_NOTRAP |
@@ -524,7 +541,7 @@
HFGITR_EL2_TLBIVAE1IS_NOTRAP |
HFGITR_EL2_TLBIVMALLE1IS_NOTRAP;
- el2ctx->hfgitr_el2 |=
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR_EL2) |=
HFGITR_EL2_ATS1E0W_NOTRAP |
HFGITR_EL2_ATS1E0R_NOTRAP |
HFGITR_EL2_ATS1E1W_NOTRAP |
@@ -546,10 +563,10 @@
/* FEAT_FGT2 traps */
if ((el2ctx->hyp->feats & HYP_FEAT_FGT2) != 0) {
/* Trap everything here until we support the feature */
- el2ctx->hdfgrtr2_el2 = 0;
- el2ctx->hdfgwtr2_el2 = 0;
- el2ctx->hfgitr2_el2 = 0;
- el2ctx->hfgrtr2_el2 = 0;
- el2ctx->hfgwtr2_el2 = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGRTR2_EL2) = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HDFGWTR2_EL2) = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGITR2_EL2) = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGRTR2_EL2) = 0;
+ *hypctx_sys_reg(el2ctx, HOST_HFGWTR2_EL2) = 0;
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jun 5, 8:26 PM (7 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33763787
Default Alt Text
D56555.id175978.diff (40 KB)
Attached To
Mode
D56555: arm64/vmm: Move host-side EL2 regs into sys_regs
Attached
Detach File
Event Timeline
Log In to Comment