Page MenuHomeFreeBSD

D56556.id176278.diff
No OneTemporary

D56556.id176278.diff

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
@@ -56,7 +56,24 @@
#define DBGWCR_EL1(n) (DBGWCR0_EL1 + MIN(n, 15))
#define DBGWVR_EL1(n) (DBGWVR0_EL1 + MIN(n, 15))
+#define HOST_ICH_LR_EL2(n) (HOST_ICH_LR0_EL2 + MIN(n, VGIC_ICH_LR_NUM_MAX-1))
+#define HOST_ICH_AP0R_EL2(n) (HOST_ICH_AP0R0_EL2 + MIN(n, VGIC_ICH_APR_NUM_MAX-1))
+#define HOST_ICH_AP1R_EL2(n) (HOST_ICH_AP1R0_EL2 + MIN(n, VGIC_ICH_APR_NUM_MAX-1))
+#define GPR_X(n) (GPR_X0 + MIN(n, 30))
+
enum hypctx_sysreg {
+ /* NOTE: Keep in sync with the defines in hyp.h */
+ GPR_LR,
+ GPR_X0,
+ GPR_X30 = GPR_X0 + 30,
+
+ /* These can be reordered freely */
+ HOST_SP_EL1,
+ HOST_FAR_EL1,
+ HOST_ELR_EL2,
+ HOST_SPSR_EL2,
+ HOST_ESR_EL2,
+
/*
* EL1 & EL0 registers.
*/
@@ -69,7 +86,7 @@
PAR_EL1, /* Physical Address Register */
/* PMU Registers */
- PMCR_EL0, /* Performance Monitors Control Register */
+ PMCR_EL0, /* Performance Monitors Control Register */
PMCCNTR_EL0,
PMCCFILTR_EL0,
PMUSERENR_EL0,
@@ -87,13 +104,13 @@
/* DBG Registers */
DBGCLAIMSET_EL1,
/* Access these through macros defined above, e.g. DBGBCR_EL1(5) */
- DBGBCR0_EL1, /* Debug Breakpoint Control Registers */
+ DBGBCR0_EL1, /* Debug Breakpoint Control Registers */
DBGBCR15_EL1 = DBGBCR0_EL1 + 15,
- DBGBVR0_EL1, /* Debug Breakpoint Value Registers */
+ DBGBVR0_EL1, /* Debug Breakpoint Value Registers */
DBGBVR15_EL1 = DBGBVR0_EL1 + 15,
- DBGWCR0_EL1, /* Debug Watchpoint Control Registers */
+ DBGWCR0_EL1, /* Debug Watchpoint Control Registers */
DBGWCR15_EL1 = DBGWCR0_EL1 + 15,
- DBGWVR0_EL1, /* Debug Watchpoint Value Registers */
+ DBGWVR0_EL1, /* Debug Watchpoint Value Registers */
DBGWVR15_EL1 = DBGWVR0_EL1 + 15,
/* EL2 registers used to control the guest, but not exposed to it */
@@ -125,7 +142,29 @@
/* Exit info registers */
HOST_FAR_EL2, /* Fault Address Register */
- HOST_HPFAR_EL2, /* Hypervisor IPA Fault Address Register */
+ HOST_HPFAR_EL2, /* Hypervisor IPA Fault Address Register */
+
+ HOST_ICH_EISR_EL2, /* End of Interrupt Status Register */
+ HOST_ICH_ELRSR_EL2, /* Empty List Register Status Register */
+ HOST_ICH_HCR_EL2, /* Hyp Control Register */
+ HOST_ICH_MISR_EL2, /* Maintenance Interrupt State Register */
+ HOST_ICH_VMCR_EL2, /* Virtual Machine Control Register */
+
+ /*
+ * The List Registers are part of the VM context and are modified on a
+ * world switch. They need to be allocated statically so they are
+ * mapped in the EL2 translation tables when struct hypctx is mapped.
+ */
+ HOST_ICH_LR0_EL2,
+ HOST_ICH_LR_MAX_EL2 = HOST_ICH_LR0_EL2 + (VGIC_ICH_LR_NUM_MAX - 1),
+ /* Active Priorities Registers for Group 0 and 1 interrupts */
+ HOST_ICH_AP0R0_EL2,
+ HOST_ICH_AP0R_MAX_EL2 = HOST_ICH_AP0R0_EL2 + (VGIC_ICH_APR_NUM_MAX - 1),
+ HOST_ICH_AP1R0_EL2,
+ HOST_ICH_AP1R_MAX_EL2 = HOST_ICH_AP1R0_EL2 + (VGIC_ICH_APR_NUM_MAX - 1),
+
+ HOST_CNTHCTL_EL2,
+ HOST_CNTVOFF_EL2,
NR_NON_VNCR_REGS,
@@ -226,14 +265,12 @@
* Per-vCPU hypervisor state.
*/
struct hypctx {
- struct trapframe tf;
/* Non-VNCR register state */
uint64_t sys_regs[NR_NON_VNCR_REGS];
struct hyp *hyp;
struct vcpu *vcpu;
- struct vtimer vtimer;
struct vtimer_cpu vtimer_cpu;
uint64_t setcaps; /* Currently enabled capabilities. */
@@ -242,7 +279,10 @@
uint64_t debug_spsr; /* Saved guest SPSR */
uint64_t debug_mdscr; /* Saved guest MDSCR */
- struct vgic_v3_regs vgic_v3_regs;
+ struct {
+ uint16_t ich_lr_num;
+ uint16_t ich_apr_num;
+ } vgic_v3;
struct vgic_v3_cpu *vgic_cpu;
bool has_exception;
bool dbg_oslock;
@@ -266,12 +306,13 @@
((uint64_t*)((uint64_t)hypctx->vncr_regs + REG_VNCR_OFFSET(reg)))
#endif
+/* Calling this with markers like reg=VNCR_START or reg=NR_NON_VNCR_REGS
+ is a bad idea */
static inline uint64_t *
hypctx_sys_reg(struct hypctx *hypctx, int reg /* enum hypctx_sysreg */)
{
if (reg > VNCR_START)
return __hypctx_vncr_sysreg(hypctx, reg);
- /* Calling this with reg=VNCR_START or reg=NR_NON_VNCR_REGS is a bad idea */
return &hypctx->sys_regs[reg];
}
diff --git a/sys/arm64/vmm/hyp.h b/sys/arm64/vmm/hyp.h
--- a/sys/arm64/vmm/hyp.h
+++ b/sys/arm64/vmm/hyp.h
@@ -110,4 +110,8 @@
#define HYP_GET_VECTOR_TABLE -1
+/* NOTE: Keep in sync with the enum values in arm64.h */
+#define HYPCTX_GPR_LR 0
+#define HYPCTX_GPR_X0 1
+
#endif /* !_VMM_HYP_H_ */
diff --git a/sys/arm64/vmm/io/vgic_v3.h b/sys/arm64/vmm/io/vgic_v3.h
--- a/sys/arm64/vmm/io/vgic_v3.h
+++ b/sys/arm64/vmm/io/vgic_v3.h
@@ -32,26 +32,4 @@
#define VGIC_ICH_LR_NUM_MAX 16
#define VGIC_ICH_APR_NUM_MAX 4
-/* Registers accessed by EL2 */
-struct vgic_v3_regs {
- uint32_t ich_eisr_el2; /* End of Interrupt Status Register */
- uint32_t ich_elrsr_el2; /* Empty List register Status Register (ICH_ELRSR_EL2) */
- uint32_t ich_hcr_el2; /* Hyp Control Register */
- uint32_t ich_misr_el2; /* Maintenance Interrupt State Register */
- uint32_t ich_vmcr_el2; /* Virtual Machine Control Register */
-
- /*
- * The List Registers are part of the VM context and are modified on a
- * world switch. They need to be allocated statically so they are
- * mapped in the EL2 translation tables when struct hypctx is mapped.
- */
- uint64_t ich_lr_el2[VGIC_ICH_LR_NUM_MAX];
- uint16_t ich_lr_num;
-
- /* Active Priorities Registers for Group 0 and 1 interrupts */
- uint16_t ich_apr_num;
- uint32_t ich_ap0r_el2[VGIC_ICH_APR_NUM_MAX];
- uint32_t ich_ap1r_el2[VGIC_ICH_APR_NUM_MAX];
-};
-
#endif /* !_VMM_VGIC_V3_H_ */
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
@@ -503,7 +503,7 @@
*
* Maintenance interrupts are disabled.
*/
- hypctx->vgic_v3_regs.ich_hcr_el2 = ICH_HCR_EL2_En;
+ hypctx_write_sys_reg(hypctx, HOST_ICH_HCR_EL2, ICH_HCR_EL2_En);
/*
* Configure the Interrupt Controller Virtual Machine Control Register.
@@ -518,20 +518,21 @@
* ICH_VMCR_EL2_VENG0: virtual Group 0 interrupts enabled.
* ICH_VMCR_EL2_VENG1: virtual Group 1 interrupts enabled.
*/
- hypctx->vgic_v3_regs.ich_vmcr_el2 =
+ hypctx_write_sys_reg(hypctx, HOST_ICH_VMCR_EL2,
(virt_features.min_prio << ICH_VMCR_EL2_VPMR_SHIFT) |
- ICH_VMCR_EL2_VBPR1_NO_PREEMPTION | ICH_VMCR_EL2_VBPR0_NO_PREEMPTION;
- hypctx->vgic_v3_regs.ich_vmcr_el2 &= ~ICH_VMCR_EL2_VEOIM;
- hypctx->vgic_v3_regs.ich_vmcr_el2 |= ICH_VMCR_EL2_VENG0 |
+ ICH_VMCR_EL2_VBPR1_NO_PREEMPTION |
+ ICH_VMCR_EL2_VBPR0_NO_PREEMPTION);
+ *hypctx_sys_reg(hypctx, HOST_ICH_VMCR_EL2) &= ~ICH_VMCR_EL2_VEOIM;
+ *hypctx_sys_reg(hypctx, HOST_ICH_VMCR_EL2) |= ICH_VMCR_EL2_VENG0 |
ICH_VMCR_EL2_VENG1;
- hypctx->vgic_v3_regs.ich_lr_num = virt_features.ich_lr_num;
- for (i = 0; i < hypctx->vgic_v3_regs.ich_lr_num; i++)
- hypctx->vgic_v3_regs.ich_lr_el2[i] = 0UL;
+ hypctx->vgic_v3.ich_lr_num = virt_features.ich_lr_num;
+ for (i = 0; i < hypctx->vgic_v3.ich_lr_num; i++)
+ hypctx_write_sys_reg(hypctx, HOST_ICH_LR_EL2(i), 0UL);
vgic_cpu->ich_lr_used = 0;
TAILQ_INIT(&vgic_cpu->irq_act_pend);
- hypctx->vgic_v3_regs.ich_apr_num = virt_features.ich_apr_num;
+ hypctx->vgic_v3.ich_apr_num = virt_features.ich_apr_num;
}
static void
@@ -2118,7 +2119,7 @@
*/
mtx_lock_spin(&vgic_cpu->lr_mtx);
- hypctx->vgic_v3_regs.ich_hcr_el2 &= ~ICH_HCR_EL2_UIE;
+ *hypctx_sys_reg(hypctx, HOST_ICH_HCR_EL2) &= ~ICH_HCR_EL2_UIE;
/* Exit early if there are no buffered interrupts */
if (TAILQ_EMPTY(&vgic_cpu->irq_act_pend))
@@ -2128,33 +2129,34 @@
__func__, vgic_cpu->ich_lr_used));
i = 0;
- hypctx->vgic_v3_regs.ich_elrsr_el2 =
- (1u << hypctx->vgic_v3_regs.ich_lr_num) - 1;
+ hypctx_write_sys_reg(hypctx, HOST_ICH_ELRSR_EL2,
+ (1u << hypctx->vgic_v3.ich_lr_num) - 1);
TAILQ_FOREACH(irq, &vgic_cpu->irq_act_pend, act_pend_list) {
/* No free list register, stop searching for IRQs */
- if (i == hypctx->vgic_v3_regs.ich_lr_num)
+ if (i == hypctx->vgic_v3.ich_lr_num)
break;
if (!irq->enabled)
continue;
- hypctx->vgic_v3_regs.ich_lr_el2[i] = ICH_LR_EL2_GROUP1 |
- ((uint64_t)irq->priority << ICH_LR_EL2_PRIO_SHIFT) |
- irq->irq;
+ hypctx_write_sys_reg(hypctx, HOST_ICH_LR_EL2(i),
+ ICH_LR_EL2_GROUP1 |
+ ((uint64_t)irq->priority << ICH_LR_EL2_PRIO_SHIFT) |
+ irq->irq);
if (irq->active) {
- hypctx->vgic_v3_regs.ich_lr_el2[i] |=
+ *hypctx_sys_reg(hypctx, HOST_ICH_LR_EL2(i)) |=
ICH_LR_EL2_STATE_ACTIVE;
}
#ifdef notyet
/* TODO: Check why this is needed */
if ((irq->config & _MASK) == LEVEL)
- hypctx->vgic_v3_regs.ich_lr_el2[i] |= ICH_LR_EL2_EOI;
+ *hypctx_sys_reg(hypctx, HOST_ICH_LR_EL2(i)) |= ICH_LR_EL2_EOI;
#endif
if (!irq->active && vgic_v3_irq_pending(irq)) {
- hypctx->vgic_v3_regs.ich_lr_el2[i] |=
+ *hypctx_sys_reg(hypctx, HOST_ICH_LR_EL2(i)) |=
ICH_LR_EL2_STATE_PENDING;
/*
@@ -2196,8 +2198,8 @@
* access unlocked.
*/
for (i = 0; i < vgic_cpu->ich_lr_used; i++) {
- lr = hypctx->vgic_v3_regs.ich_lr_el2[i];
- hypctx->vgic_v3_regs.ich_lr_el2[i] = 0;
+ lr = hypctx_read_sys_reg(hypctx, HOST_ICH_LR_EL2(i));
+ hypctx_write_sys_reg(hypctx, HOST_ICH_LR_EL2(i), 0);
irq = vgic_v3_get_irq(hypctx->hyp, vcpu_vcpuid(hypctx->vcpu),
ICH_LR_EL2_VINTID(lr));
@@ -2244,7 +2246,7 @@
vgic_v3_release_irq(irq);
}
- hypctx->vgic_v3_regs.ich_hcr_el2 &= ~ICH_HCR_EL2_EOICOUNT_MASK;
+ *hypctx_sys_reg(hypctx, HOST_ICH_HCR_EL2) &= ~ICH_HCR_EL2_EOICOUNT_MASK;
vgic_cpu->ich_lr_used = 0;
}
diff --git a/sys/arm64/vmm/io/vtimer.h b/sys/arm64/vmm/io/vtimer.h
--- a/sys/arm64/vmm/io/vtimer.h
+++ b/sys/arm64/vmm/io/vtimer.h
@@ -37,11 +37,6 @@
struct hyp;
struct hypctx;
-struct vtimer {
- uint64_t cnthctl_el2;
- uint64_t cntvoff_el2;
-};
-
struct vtimer_timer {
struct callout callout;
struct mtx mtx;
diff --git a/sys/arm64/vmm/io/vtimer.c b/sys/arm64/vmm/io/vtimer.c
--- a/sys/arm64/vmm/io/vtimer.c
+++ b/sys/arm64/vmm/io/vtimer.c
@@ -97,7 +97,7 @@
}
cntpct_el0 = READ_SPECIALREG(cntpct_el0) -
- hypctx->vtimer.cntvoff_el2;
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
if (hypctx->vtimer_cpu.virt_timer.cntx_cval_el0 < cntpct_el0)
vgic_inject_irq(hypctx->hyp, vcpu_vcpuid(hypctx->vcpu),
GT_VIRT_IRQ, true);
@@ -186,17 +186,17 @@
*
* TODO: Don't trap when FEAT_ECV is present
*/
- hypctx->vtimer.cnthctl_el2 =
+ hypctx_write_sys_reg(hypctx, HOST_CNTHCTL_EL2,
CNTHCTL_E2H_EL0VCTEN_NOTRAP |
- CNTHCTL_E2H_EL0VTEN_NOTRAP;
+ CNTHCTL_E2H_EL0VTEN_NOTRAP);
if (ecv_poff) {
- hypctx->vtimer.cnthctl_el2 |=
+ *hypctx_sys_reg(hypctx, HOST_CNTHCTL_EL2) |=
CNTHCTL_E2H_EL0PCTEN_NOTRAP |
CNTHCTL_E2H_EL0PTEN_NOTRAP |
CNTHCTL_E2H_EL1PCTEN_NOTRAP |
CNTHCTL_E2H_EL1PTEN_NOTRAP;
} else {
- hypctx->vtimer.cnthctl_el2 |=
+ *hypctx_sys_reg(hypctx, HOST_CNTHCTL_EL2) |=
CNTHCTL_E2H_EL0PCTEN_TRAP |
CNTHCTL_E2H_EL0PTEN_TRAP |
CNTHCTL_E2H_EL1PCTEN_TRAP |
@@ -209,20 +209,20 @@
* CNTHCTL_EL1PCTEN: trap access to CNTPCT_EL0
*/
if (ecv_poff) {
- hypctx->vtimer.cnthctl_el2 =
+ hypctx_write_sys_reg(hypctx, HOST_CNTHCTL_EL2,
CNTHCTL_EL1PCTEN_NOTRAP |
- CNTHCTL_EL1PCEN_NOTRAP;
+ CNTHCTL_EL1PCEN_NOTRAP);
} else {
- hypctx->vtimer.cnthctl_el2 =
+ hypctx_write_sys_reg(hypctx, HOST_CNTHCTL_EL2,
CNTHCTL_EL1PCTEN_TRAP |
- CNTHCTL_EL1PCEN_TRAP;
+ CNTHCTL_EL1PCEN_TRAP);
}
}
if (ecv_poff)
- hypctx->vtimer.cnthctl_el2 |= CNTHCTL_ECV_EN;
+ *hypctx_sys_reg(hypctx, HOST_CNTHCTL_EL2) |= CNTHCTL_ECV_EN;
- hypctx->vtimer.cntvoff_el2 = READ_SPECIALREG(cntpct_el0);;
+ hypctx_write_sys_reg(hypctx, HOST_CNTVOFF_EL2, READ_SPECIALREG(cntpct_el0));
}
void
@@ -280,10 +280,10 @@
uint64_t cntpct_el0;
cntpct_el0 = READ_SPECIALREG(cntpct_el0) -
- hypctx->vtimer.cntvoff_el2;
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
vtime_sync_timer(hypctx, &hypctx->vtimer_cpu.virt_timer, cntpct_el0);
/* If FEAT_ECV_POFF is in use then we need to sync the physical timer */
- if ((hypctx->vtimer.cnthctl_el2 & CNTHCTL_ECV_EN) != 0) {
+ if ((hypctx_read_sys_reg(hypctx, HOST_CNTHCTL_EL2) & CNTHCTL_ECV_EN) != 0) {
vtime_sync_timer(hypctx, &hypctx->vtimer_cpu.phys_timer,
cntpct_el0);
}
@@ -322,7 +322,7 @@
else
timer = &hypctx->vtimer_cpu.virt_timer;
cntpct_el0 = READ_SPECIALREG(cntpct_el0) -
- hypctx->vtimer.cntvoff_el2;
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
if (timer->cntx_cval_el0 < cntpct_el0) {
/* Timer set in the past, trigger interrupt */
vgic_inject_irq(hypctx->hyp, vcpu_vcpuid(hypctx->vcpu),
@@ -379,7 +379,7 @@
hypctx = vcpu_get_cookie(vcpu);
vtimer_cpu = &hypctx->vtimer_cpu;
- cntpct_el0 = READ_SPECIALREG(cntpct_el0) - hypctx->vtimer.cntvoff_el2;
+ cntpct_el0 = READ_SPECIALREG(cntpct_el0) - hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
if (vtimer_cpu->phys_timer.cntx_cval_el0 < cntpct_el0)
/* Timer condition met */
*rval = vtimer_cpu->phys_timer.cntx_ctl_el0 | CNTP_CTL_ISTATUS;
@@ -422,7 +422,7 @@
struct hypctx *hypctx;
hypctx = vcpu_get_cookie(vcpu);
- *rval = READ_SPECIALREG(cntpct_el0) - hypctx->vtimer.cntvoff_el2;
+ *rval = READ_SPECIALREG(cntpct_el0) - hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
return (0);
}
@@ -485,7 +485,7 @@
*rval = (uint32_t)RES1;
} else {
cntpct_el0 = READ_SPECIALREG(cntpct_el0) -
- hypctx->vtimer.cntvoff_el2;
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
*rval = vtimer_cpu->phys_timer.cntx_cval_el0 - cntpct_el0;
}
@@ -502,7 +502,7 @@
hypctx = vcpu_get_cookie(vcpu);
vtimer_cpu = &hypctx->vtimer_cpu;
- cntpct_el0 = READ_SPECIALREG(cntpct_el0) - hypctx->vtimer.cntvoff_el2;
+ cntpct_el0 = READ_SPECIALREG(cntpct_el0) - hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2);
vtimer_cpu->phys_timer.cntx_cval_el0 = (int32_t)wval + cntpct_el0;
vtimer_remove_irq(hypctx, vcpu);
diff --git a/sys/arm64/vmm/vmm.c b/sys/arm64/vmm/vmm.c
--- a/sys/arm64/vmm/vmm.c
+++ b/sys/arm64/vmm/vmm.c
@@ -862,13 +862,13 @@
hypctx = vcpu_get_cookie(vcpu);
- if ((hypctx->tf.tf_esr & ESR_ELx_ISS_MASK) != 0)
+ if ((hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ESR_ELx_ISS_MASK) != 0)
return (1);
vme->exitcode = VM_EXITCODE_SMCCC;
- vme->u.smccc_call.func_id = hypctx->tf.tf_x[0];
+ vme->u.smccc_call.func_id = hypctx_read_sys_reg(hypctx, GPR_X(0));
for (i = 0; i < nitems(vme->u.smccc_call.args); i++)
- vme->u.smccc_call.args[i] = hypctx->tf.tf_x[i + 1];
+ vme->u.smccc_call.args[i] = hypctx_read_sys_reg(hypctx, GPR_X(i + 1));
*retu = true;
return (0);
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
@@ -653,7 +653,7 @@
paging->ttbr1_addr = hypctx_read_sys_reg(hypctx, TTBR1_EL1) & ~(TTBR_ASID_MASK | TTBR_CnP);
paging->tcr_el1 = hypctx_read_sys_reg(hypctx, TCR_EL1);
paging->tcr2_el1 = hypctx_read_sys_reg(hypctx, TCR2_EL1);
- paging->flags = hypctx->tf.tf_spsr & (PSR_M_MASK | PSR_M_32);
+ paging->flags = hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2) & (PSR_M_MASK | PSR_M_32);
if ((hypctx_read_sys_reg(hypctx, SCTLR_EL1) & SCTLR_M) != 0)
paging->flags |= VM_GP_MMU_ENABLED;
}
@@ -679,7 +679,7 @@
{
uint64_t esr;
- if ((hypctx->tf.tf_spsr & PSR_M_MASK) == PSR_M_EL0t)
+ if ((hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2) & PSR_M_MASK) == PSR_M_EL0t)
esr = EXCP_INSN_ABORT_L << ESR_ELx_EC_SHIFT;
else
esr = EXCP_INSN_ABORT << ESR_ELx_EC_SHIFT;
@@ -687,7 +687,7 @@
if (dabort)
esr |= EXCP_DATA_ABORT_L << ESR_ELx_EC_SHIFT;
/* Set the IL bit if set by hardware */
- esr |= hypctx->tf.tf_esr & ESR_ELx_IL;
+ esr |= hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ESR_ELx_IL;
vmmops_exception(hypctx, esr | fsc, far);
}
@@ -699,8 +699,8 @@
uint64_t gpa;
uint32_t esr_ec, esr_iss;
- esr_ec = ESR_ELx_EXCEPTION(hypctx->tf.tf_esr);
- esr_iss = hypctx->tf.tf_esr & ESR_ELx_ISS_MASK;
+ esr_ec = ESR_ELx_EXCEPTION(hypctx_read_sys_reg(hypctx, HOST_ESR_EL2));
+ esr_iss = hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ESR_ELx_ISS_MASK;
switch (esr_ec) {
case EXCP_UNKNOWN:
@@ -709,7 +709,7 @@
vme_ret->exitcode = VM_EXITCODE_HYP;
break;
case EXCP_TRAP_WFI_WFE:
- if ((hypctx->tf.tf_esr & 0x3) == 0) { /* WFI */
+ if ((hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & 0x3) == 0) { /* WFI */
vmm_stat_incr(hypctx->vcpu, VMEXIT_WFI, 1);
vme_ret->exitcode = VM_EXITCODE_WFI;
} else {
@@ -738,7 +738,7 @@
case EXCP_DATA_ABORT_L:
vmm_stat_incr(hypctx->vcpu, esr_ec == EXCP_DATA_ABORT_L ?
VMEXIT_DATA_ABORT : VMEXIT_INSN_ABORT, 1);
- switch (hypctx->tf.tf_esr & ISS_DATA_DFSC_MASK) {
+ switch (hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ISS_DATA_DFSC_MASK) {
case ISS_DATA_DFSC_TF_L0:
case ISS_DATA_DFSC_TF_L1:
case ISS_DATA_DFSC_TF_L2:
@@ -763,7 +763,7 @@
if (vm_mem_allocated(hypctx->vcpu, gpa)) {
vme_ret->exitcode = VM_EXITCODE_PAGING;
vme_ret->inst_length = 0;
- vme_ret->u.paging.esr = hypctx->tf.tf_esr;
+ vme_ret->u.paging.esr = hypctx_read_sys_reg(hypctx, HOST_ESR_EL2);
vme_ret->u.paging.gpa = gpa;
} else if (esr_ec == EXCP_INSN_ABORT_L) {
/*
@@ -1102,44 +1102,50 @@
vcpu = hypctx->vcpu;
vme = vm_exitinfo(vcpu);
- hypctx->tf.tf_elr = (uint64_t)pc;
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2, (uint64_t)pc);
for (;;) {
if (hypctx->has_exception) {
hypctx->has_exception = false;
- hypctx_write_sys_reg(hypctx, ELR_EL1, hypctx->tf.tf_elr);
+ hypctx_write_sys_reg(hypctx, ELR_EL1,
+ hypctx_read_sys_reg(hypctx, HOST_ELR_EL2));
- mode = hypctx->tf.tf_spsr & (PSR_M_MASK | PSR_M_32);
+ mode = hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2) & (PSR_M_MASK | PSR_M_32);
if (mode == PSR_M_EL1t) {
- hypctx->tf.tf_elr = hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x0;
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2,
+ hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x0);
} else if (mode == PSR_M_EL1h) {
- hypctx->tf.tf_elr = hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x200;
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2,
+ hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x200);
} else if ((mode & PSR_M_32) == PSR_M_64) {
/* 64-bit EL0 */
- hypctx->tf.tf_elr = hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x400;
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2,
+ hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x400);
} else {
/* 32-bit EL0 */
- hypctx->tf.tf_elr = hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x600;
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2,
+ hypctx_read_sys_reg(hypctx, VBAR_EL1) + 0x600);
}
/* Set the new spsr */
- hypctx_write_sys_reg(hypctx, SPSR_EL1, hypctx->tf.tf_spsr);
+ hypctx_write_sys_reg(hypctx, SPSR_EL1, hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2));
/* Set the new cpsr */
- hypctx->tf.tf_spsr = hypctx_read_sys_reg(hypctx, SPSR_EL1) & PSR_FLAGS;
- hypctx->tf.tf_spsr |= PSR_DAIF | PSR_M_EL1h;
+ hypctx_write_sys_reg(hypctx, HOST_SPSR_EL2,
+ hypctx_read_sys_reg(hypctx, SPSR_EL1) & PSR_FLAGS);
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= PSR_DAIF | PSR_M_EL1h;
/*
* Update fields that may change on exeption entry
* based on how sctlr_el1 is configured.
*/
if ((hypctx_read_sys_reg(hypctx, SCTLR_EL1) & SCTLR_SPAN) == 0)
- hypctx->tf.tf_spsr |= PSR_PAN;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= PSR_PAN;
if ((hypctx_read_sys_reg(hypctx, SCTLR_EL1) & SCTLR_DSSBS) == 0)
- hypctx->tf.tf_spsr &= ~PSR_SSBS;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) &= ~PSR_SSBS;
else
- hypctx->tf.tf_spsr |= PSR_SSBS;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= PSR_SSBS;
}
daif = intr_disable();
@@ -1184,10 +1190,10 @@
if (excp_type == EXCP_TYPE_MAINT_IRQ)
continue;
- vme->pc = hypctx->tf.tf_elr;
+ vme->pc = hypctx_read_sys_reg(hypctx, HOST_ELR_EL2);
vme->inst_length = INSN_SIZE;
vme->u.hyp.exception_nr = excp_type;
- vme->u.hyp.esr_el2 = hypctx->tf.tf_esr;
+ vme->u.hyp.esr_el2 = hypctx_read_sys_reg(hypctx, HOST_ESR_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);
@@ -1198,7 +1204,7 @@
break;
else
/* Resume guest execution from the next instruction. */
- hypctx->tf.tf_elr += vme->inst_length;
+ *hypctx_sys_reg(hypctx, HOST_ELR_EL2) += vme->inst_length;
}
return (0);
@@ -1259,15 +1265,15 @@
{
switch (reg) {
case VM_REG_GUEST_X0 ... VM_REG_GUEST_X29:
- return (&hypctx->tf.tf_x[reg]);
+ return hypctx_sys_reg(hypctx, GPR_X(reg));
case VM_REG_GUEST_LR:
- return (&hypctx->tf.tf_lr);
+ return hypctx_sys_reg(hypctx, GPR_LR);
case VM_REG_GUEST_SP:
- return (&hypctx->tf.tf_sp);
+ return hypctx_sys_reg(hypctx, HOST_SP_EL1);
case VM_REG_GUEST_CPSR:
- return (&hypctx->tf.tf_spsr);
+ return hypctx_sys_reg(hypctx, HOST_SPSR_EL2);
case VM_REG_GUEST_PC:
- return (&hypctx->tf.tf_elr);
+ return hypctx_sys_reg(hypctx, HOST_ELR_EL2);
case VM_REG_GUEST_SCTLR_EL1:
return hypctx_sys_reg(hypctx, SCTLR_EL1);
case VM_REG_GUEST_TTBR0_EL1:
@@ -1391,15 +1397,15 @@
break;
if (val != 0) {
- hypctx->debug_spsr |= (hypctx->tf.tf_spsr & PSR_SS);
+ hypctx->debug_spsr |= (hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2) & PSR_SS);
hypctx->debug_mdscr |= (hypctx_read_sys_reg(hypctx, MDSCR_EL1) & MDSCR_SS);
- hypctx->tf.tf_spsr |= PSR_SS;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= PSR_SS;
*hypctx_sys_reg(hypctx, MDSCR_EL1) |= MDSCR_SS;
*hypctx_sys_reg(hypctx, HOST_MDCR_EL2) |= MDCR_EL2_TDE;
} else {
- hypctx->tf.tf_spsr &= ~PSR_SS;
- hypctx->tf.tf_spsr |= hypctx->debug_spsr;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) &= ~PSR_SS;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= hypctx->debug_spsr;
hypctx->debug_spsr &= ~PSR_SS;
*hypctx_sys_reg(hypctx, MDSCR_EL1) &= ~MDSCR_SS;
*hypctx_sys_reg(hypctx, MDSCR_EL1) |= hypctx->debug_mdscr;
@@ -1413,12 +1419,12 @@
break;
if (val != 0) {
- hypctx->debug_spsr |= (hypctx->tf.tf_spsr &
+ hypctx->debug_spsr |= (hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2) &
(PSR_I | PSR_F));
- hypctx->tf.tf_spsr |= PSR_I | PSR_F;
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= PSR_I | PSR_F;
} else {
- hypctx->tf.tf_spsr &= ~(PSR_I | PSR_F);
- hypctx->tf.tf_spsr |= (hypctx->debug_spsr &
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) &= ~(PSR_I | PSR_F);
+ *hypctx_sys_reg(hypctx, HOST_SPSR_EL2) |= (hypctx->debug_spsr &
(PSR_I | PSR_F));
hypctx->debug_spsr &= ~(PSR_I | PSR_F);
}
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
@@ -162,22 +162,27 @@
static void
vmm_hyp_reg_store_vgic(struct hypctx *hypctx, bool guest)
{
- hypctx->vgic_v3_regs.ich_hcr_el2 = READ_SPECIALREG(ich_hcr_el2);
- hypctx->vgic_v3_regs.ich_vmcr_el2 = READ_SPECIALREG(ich_vmcr_el2);
+ hypctx_write_sys_reg(hypctx, HOST_ICH_HCR_EL2,
+ READ_SPECIALREG(ich_hcr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_ICH_VMCR_EL2,
+ READ_SPECIALREG(ich_vmcr_el2));
if (!guest)
return;
/* Store the GICv3 registers */
- hypctx->vgic_v3_regs.ich_eisr_el2 = READ_SPECIALREG(ich_eisr_el2);
- hypctx->vgic_v3_regs.ich_elrsr_el2 = READ_SPECIALREG(ich_elrsr_el2);
- hypctx->vgic_v3_regs.ich_misr_el2 = READ_SPECIALREG(ich_misr_el2);
-
- switch (hypctx->vgic_v3_regs.ich_lr_num - 1) {
+ hypctx_write_sys_reg(hypctx, HOST_ICH_EISR_EL2,
+ READ_SPECIALREG(ich_eisr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_ICH_ELRSR_EL2,
+ READ_SPECIALREG(ich_elrsr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_ICH_MISR_EL2,
+ READ_SPECIALREG(ich_misr_el2));
+
+ switch (hypctx->vgic_v3.ich_lr_num - 1) {
#define STORE_LR(x) \
case x: \
- hypctx->vgic_v3_regs.ich_lr_el2[x] = \
- READ_SPECIALREG(ich_lr ## x ##_el2)
+ hypctx_write_sys_reg(hypctx, HOST_ICH_LR_EL2(x), \
+ READ_SPECIALREG(ich_lr ## x ##_el2))
STORE_LR(15);
STORE_LR(14);
STORE_LR(13);
@@ -198,13 +203,13 @@
#undef STORE_LR
}
- switch (hypctx->vgic_v3_regs.ich_apr_num - 1) {
+ switch (hypctx->vgic_v3.ich_apr_num - 1) {
#define STORE_APR(x) \
case x: \
- hypctx->vgic_v3_regs.ich_ap0r_el2[x] = \
- READ_SPECIALREG(ich_ap0r ## x ##_el2); \
- hypctx->vgic_v3_regs.ich_ap1r_el2[x] = \
- READ_SPECIALREG(ich_ap1r ## x ##_el2)
+ hypctx_write_sys_reg(hypctx, HOST_ICH_AP0R_EL2(x), \
+ READ_SPECIALREG(ich_ap0r ## x ##_el2)); \
+ hypctx_write_sys_reg(hypctx, HOST_ICH_AP1R_EL2(x), \
+ READ_SPECIALREG(ich_ap1r ## x ##_el2))
STORE_APR(3);
STORE_APR(2);
STORE_APR(1);
@@ -218,7 +223,7 @@
vmm_hyp_reg_store_timer(struct hypctx *hypctx, struct hyp *hyp, bool guest)
{
bool ecv_poff;
- ecv_poff = (hypctx->vtimer.cnthctl_el2 & CNTHCTL_ECV_EN) != 0;
+ ecv_poff = (hypctx_read_sys_reg(hypctx, HOST_CNTHCTL_EL2) & CNTHCTL_ECV_EN) != 0;
if (guest) {
/* Store the timer registers */
@@ -231,10 +236,10 @@
} else {
hypctx->vtimer_cpu.cntkctl_el1 =
READ_SPECIALREG(cntkctl_el1);
- hypctx->vtimer.cnthctl_el2 =
- READ_SPECIALREG(cnthctl_el2);
- hypctx->vtimer.cntvoff_el2 =
- READ_SPECIALREG(cntvoff_el2);
+ hypctx_write_sys_reg(hypctx, HOST_CNTHCTL_EL2,
+ READ_SPECIALREG(cnthctl_el2));
+ hypctx_write_sys_reg(hypctx, HOST_CNTVOFF_EL2,
+ READ_SPECIALREG(cntvoff_el2));
}
if (guest_or_nonvhe(guest) && ecv_poff) {
/*
@@ -254,12 +259,12 @@
vmm_hyp_reg_store_special(struct hypctx *hypctx, struct hyp *hyp, bool guest)
{
/* Store the special to from the trapframe */
- hypctx->tf.tf_sp = READ_SPECIALREG(sp_el1);
- hypctx->tf.tf_elr = READ_SPECIALREG(elr_el2);
- hypctx->tf.tf_spsr = READ_SPECIALREG(spsr_el2);
+ hypctx_write_sys_reg(hypctx, HOST_SP_EL1, READ_SPECIALREG(sp_el1));
+ hypctx_write_sys_reg(hypctx, HOST_ELR_EL2, READ_SPECIALREG(elr_el2));
+ hypctx_write_sys_reg(hypctx, HOST_SPSR_EL2, READ_SPECIALREG(spsr_el2));
if (guest) {
- hypctx->tf.tf_esr = READ_SPECIALREG(esr_el2);
+ hypctx_write_sys_reg(hypctx, HOST_ESR_EL2, READ_SPECIALREG(esr_el2));
hypctx_write_sys_reg(hypctx, HOST_FAR_EL2, READ_SPECIALREG(far_el2));
hypctx_write_sys_reg(hypctx, PAR_EL1, READ_SPECIALREG(par_el1));
}
@@ -388,9 +393,9 @@
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);
- WRITE_SPECIALREG(elr_el2, hypctx->tf.tf_elr);
- WRITE_SPECIALREG(spsr_el2, hypctx->tf.tf_spsr);
+ WRITE_SPECIALREG(sp_el1, hypctx_read_sys_reg(hypctx, HOST_SP_EL1));
+ WRITE_SPECIALREG(elr_el2, hypctx_read_sys_reg(hypctx, HOST_ELR_EL2));
+ WRITE_SPECIALREG(spsr_el2, hypctx_read_sys_reg(hypctx, HOST_SPSR_EL2));
}
static void
@@ -519,11 +524,13 @@
vmm_hyp_reg_restore_timer(struct hypctx *hypctx, struct hyp *hyp, bool guest)
{
bool ecv_poff;
- ecv_poff = (hypctx->vtimer.cnthctl_el2 & CNTHCTL_ECV_EN) != 0;
+ ecv_poff = (hypctx_read_sys_reg(hypctx, HOST_CNTHCTL_EL2) & CNTHCTL_ECV_EN) != 0;
WRITE_SPECIALREG(EL1_REG(CNTKCTL), hypctx->vtimer_cpu.cntkctl_el1);
- WRITE_SPECIALREG(cnthctl_el2, hypctx->vtimer.cnthctl_el2);
- WRITE_SPECIALREG(cntvoff_el2, hypctx->vtimer.cntvoff_el2);
+ WRITE_SPECIALREG(cnthctl_el2,
+ hypctx_read_sys_reg(hypctx, HOST_CNTHCTL_EL2));
+ WRITE_SPECIALREG(cntvoff_el2,
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2));
if (guest) {
WRITE_SPECIALREG(EL0_REG(CNTV_CVAL),
@@ -537,7 +544,7 @@
* to keep in sync.
*/
WRITE_SPECIALREG(CNTPOFF_EL2_REG,
- hypctx->vtimer.cntvoff_el2);
+ hypctx_read_sys_reg(hypctx, HOST_CNTVOFF_EL2));
isb();
}
}
@@ -558,18 +565,19 @@
vmm_hyp_reg_restore_vgic(struct hypctx *hypctx, bool guest)
{
/* Load the GICv3 registers */
- WRITE_SPECIALREG(ich_hcr_el2, hypctx->vgic_v3_regs.ich_hcr_el2);
+ WRITE_SPECIALREG(ich_hcr_el2,
+ hypctx_read_sys_reg(hypctx, HOST_ICH_HCR_EL2));
WRITE_SPECIALREG(ich_vmcr_el2,
- hypctx->vgic_v3_regs.ich_vmcr_el2);
+ hypctx_read_sys_reg(hypctx, HOST_ICH_VMCR_EL2));
if (!guest)
return;
- switch (hypctx->vgic_v3_regs.ich_lr_num - 1) {
+ switch (hypctx->vgic_v3.ich_lr_num - 1) {
#define LOAD_LR(x) \
case x: \
WRITE_SPECIALREG(ich_lr ## x ##_el2, \
- hypctx->vgic_v3_regs.ich_lr_el2[x])
+ hypctx_read_sys_reg(hypctx, HOST_ICH_LR_EL2(x)))
LOAD_LR(15);
LOAD_LR(14);
LOAD_LR(13);
@@ -590,13 +598,13 @@
#undef LOAD_LR
}
- switch (hypctx->vgic_v3_regs.ich_apr_num - 1) {
+ switch (hypctx->vgic_v3.ich_apr_num - 1) {
#define LOAD_APR(x) \
case x: \
WRITE_SPECIALREG(ich_ap0r ## x ##_el2, \
- hypctx->vgic_v3_regs.ich_ap0r_el2[x]); \
+ hypctx_read_sys_reg(hypctx, HOST_ICH_AP0R_EL2(x))); \
WRITE_SPECIALREG(ich_ap1r ## x ##_el2, \
- hypctx->vgic_v3_regs.ich_ap1r_el2[x])
+ hypctx_read_sys_reg(hypctx, HOST_ICH_AP1R_EL2(x)))
LOAD_APR(3);
LOAD_APR(2);
LOAD_APR(1);
@@ -633,7 +641,7 @@
hpfar_valid = true;
if (*ret == EXCP_TYPE_EL1_SYNC) {
- switch (ESR_ELx_EXCEPTION(hypctx->tf.tf_esr)) {
+ switch (ESR_ELx_EXCEPTION(hypctx_read_sys_reg(hypctx, HOST_ELR_EL2))) {
case EXCP_INSN_ABORT_L:
case EXCP_DATA_ABORT_L:
/*
@@ -649,9 +657,9 @@
*
* TODO: Add a case for Arm erratum 834220.
*/
- if ((hypctx->tf.tf_esr & ISS_DATA_S1PTW) != 0)
+ if ((hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ISS_DATA_S1PTW) != 0)
break;
- switch (hypctx->tf.tf_esr & ISS_DATA_DFSC_MASK) {
+ switch (hypctx_read_sys_reg(hypctx, HOST_ESR_EL2) & ISS_DATA_DFSC_MASK) {
case ISS_DATA_DFSC_PF_L1:
case ISS_DATA_DFSC_PF_L2:
case ISS_DATA_DFSC_PF_L3:
diff --git a/sys/arm64/vmm/vmm_hyp_exception.S b/sys/arm64/vmm/vmm_hyp_exception.S
--- a/sys/arm64/vmm/vmm_hyp_exception.S
+++ b/sys/arm64/vmm/vmm_hyp_exception.S
@@ -86,26 +86,26 @@
/* Restore the hypctx pointer */
mrs x0, tpidr_el2
- stp x2, x3, [x0, #(TF_X + 2 * 8)]
- stp x4, x5, [x0, #(TF_X + 4 * 8)]
- stp x6, x7, [x0, #(TF_X + 6 * 8)]
- stp x8, x9, [x0, #(TF_X + 8 * 8)]
- stp x10, x11, [x0, #(TF_X + 10 * 8)]
- stp x12, x13, [x0, #(TF_X + 12 * 8)]
- stp x14, x15, [x0, #(TF_X + 14 * 8)]
- stp x16, x17, [x0, #(TF_X + 16 * 8)]
- stp x18, x19, [x0, #(TF_X + 18 * 8)]
- stp x20, x21, [x0, #(TF_X + 20 * 8)]
- stp x22, x23, [x0, #(TF_X + 22 * 8)]
- stp x24, x25, [x0, #(TF_X + 24 * 8)]
- stp x26, x27, [x0, #(TF_X + 26 * 8)]
- stp x28, x29, [x0, #(TF_X + 28 * 8)]
-
- str lr, [x0, #(TF_LR)]
+ stp x2, x3, [x0, #((HYPCTX_GPR_X0 + 2) * 8)]
+ stp x4, x5, [x0, #((HYPCTX_GPR_X0 + 4) * 8)]
+ stp x6, x7, [x0, #((HYPCTX_GPR_X0 + 6) * 8)]
+ stp x8, x9, [x0, #((HYPCTX_GPR_X0 + 8) * 8)]
+ stp x10, x11, [x0, #((HYPCTX_GPR_X0 + 10) * 8)]
+ stp x12, x13, [x0, #((HYPCTX_GPR_X0 + 12) * 8)]
+ stp x14, x15, [x0, #((HYPCTX_GPR_X0 + 14) * 8)]
+ stp x16, x17, [x0, #((HYPCTX_GPR_X0 + 16) * 8)]
+ stp x18, x19, [x0, #((HYPCTX_GPR_X0 + 18) * 8)]
+ stp x20, x21, [x0, #((HYPCTX_GPR_X0 + 20) * 8)]
+ stp x22, x23, [x0, #((HYPCTX_GPR_X0 + 22) * 8)]
+ stp x24, x25, [x0, #((HYPCTX_GPR_X0 + 24) * 8)]
+ stp x26, x27, [x0, #((HYPCTX_GPR_X0 + 26) * 8)]
+ stp x28, x29, [x0, #((HYPCTX_GPR_X0 + 28) * 8)]
+
+ str lr, [x0, #(HYPCTX_GPR_LR * 8)]
/* Restore the saved x0 & x1 and save them */
ldp x2, x3, [sp], #(2 * 8)
- stp x2, x3, [x0, #(TF_X + 0 * 8)]
+ stp x2, x3, [x0, #((HYPCTX_GPR_X0 + 0) * 8)]
.endm
.macro restore_guest_registers
@@ -113,25 +113,25 @@
* Copy the guest x0 and x1 to the stack so we can restore them
* after loading the other registers.
*/
- ldp x2, x3, [x0, #(TF_X + 0 * 8)]
+ ldp x2, x3, [x0, #((HYPCTX_GPR_X0 + 0) * 8)]
stp x2, x3, [sp, #-(2 * 8)]!
- ldr lr, [x0, #(TF_LR)]
-
- ldp x28, x29, [x0, #(TF_X + 28 * 8)]
- ldp x26, x27, [x0, #(TF_X + 26 * 8)]
- ldp x24, x25, [x0, #(TF_X + 24 * 8)]
- ldp x22, x23, [x0, #(TF_X + 22 * 8)]
- ldp x20, x21, [x0, #(TF_X + 20 * 8)]
- ldp x18, x19, [x0, #(TF_X + 18 * 8)]
- ldp x16, x17, [x0, #(TF_X + 16 * 8)]
- ldp x14, x15, [x0, #(TF_X + 14 * 8)]
- ldp x12, x13, [x0, #(TF_X + 12 * 8)]
- ldp x10, x11, [x0, #(TF_X + 10 * 8)]
- ldp x8, x9, [x0, #(TF_X + 8 * 8)]
- ldp x6, x7, [x0, #(TF_X + 6 * 8)]
- ldp x4, x5, [x0, #(TF_X + 4 * 8)]
- ldp x2, x3, [x0, #(TF_X + 2 * 8)]
+ ldr lr, [x0, #(HYPCTX_GPR_LR * 8)]
+
+ ldp x28, x29, [x0, #((HYPCTX_GPR_X0 + 28) * 8)]
+ ldp x26, x27, [x0, #((HYPCTX_GPR_X0 + 26) * 8)]
+ ldp x24, x25, [x0, #((HYPCTX_GPR_X0 + 24) * 8)]
+ ldp x22, x23, [x0, #((HYPCTX_GPR_X0 + 22) * 8)]
+ ldp x20, x21, [x0, #((HYPCTX_GPR_X0 + 20) * 8)]
+ ldp x18, x19, [x0, #((HYPCTX_GPR_X0 + 18) * 8)]
+ ldp x16, x17, [x0, #((HYPCTX_GPR_X0 + 16) * 8)]
+ ldp x14, x15, [x0, #((HYPCTX_GPR_X0 + 14) * 8)]
+ ldp x12, x13, [x0, #((HYPCTX_GPR_X0 + 12) * 8)]
+ ldp x10, x11, [x0, #((HYPCTX_GPR_X0 + 10) * 8)]
+ ldp x8, x9, [x0, #((HYPCTX_GPR_X0 + 8) * 8)]
+ ldp x6, x7, [x0, #((HYPCTX_GPR_X0 + 6) * 8)]
+ ldp x4, x5, [x0, #((HYPCTX_GPR_X0 + 4) * 8)]
+ ldp x2, x3, [x0, #((HYPCTX_GPR_X0 + 2) * 8)]
ldp x0, x1, [sp], #(2 * 8)
.endm
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
@@ -53,8 +53,6 @@
el2ctx = vcpu;
- set_arch_unknown(el2ctx->tf);
-
/*
* Guest starts with:
* ~SCTLR_M: MMU off
@@ -145,9 +143,9 @@
* Disable interrupts in the guest. The guest OS will re-enable
* them.
*/
- el2ctx->tf.tf_spsr = PSR_D | PSR_A | PSR_I | PSR_F;
+ hypctx_write_sys_reg(el2ctx, HOST_SPSR_EL2, PSR_D | PSR_A | PSR_I | PSR_F);
/* Use the EL1 stack when taking exceptions to EL1 */
- el2ctx->tf.tf_spsr |= PSR_M_EL1h;
+ *hypctx_sys_reg(el2ctx, HOST_SPSR_EL2) |= PSR_M_EL1h;
/* FEAT_FGT traps */
if ((el2ctx->hyp->feats & HYP_FEAT_FGT) != 0) {

File Metadata

Mime Type
text/plain
Expires
Thu, May 14, 11:53 PM (4 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33066099
Default Alt Text
D56556.id176278.diff (32 KB)

Event Timeline