Skip to content

Commit 35d0c9e

Browse files
committed
arm64/vmm: Save more PMU registers
These were missed in the initial vmm.ko change. While here keep the order the same in all locations we handle these. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D52802
1 parent c1723bb commit 35d0c9e

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

sys/arm64/vmm/arm64.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,12 @@ struct hypctx {
7878
uint64_t pmcr_el0; /* Performance Monitors Control Register */
7979
uint64_t pmccntr_el0;
8080
uint64_t pmccfiltr_el0;
81+
uint64_t pmuserenr_el0;
82+
uint64_t pmselr_el0;
83+
uint64_t pmxevcntr_el0;
8184
uint64_t pmcntenset_el0;
8285
uint64_t pmintenset_el1;
8386
uint64_t pmovsset_el0;
84-
uint64_t pmselr_el0;
85-
uint64_t pmuserenr_el0;
8687
uint64_t pmevcntr_el0[31];
8788
uint64_t pmevtyper_el0[31];
8889

sys/arm64/vmm/vmm_hyp.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,13 @@ vmm_hyp_reg_store(struct hypctx *hypctx, struct hyp *hyp, bool guest,
180180
hypctx->pmcr_el0 = READ_SPECIALREG(pmcr_el0);
181181
hypctx->pmccntr_el0 = READ_SPECIALREG(pmccntr_el0);
182182
hypctx->pmccfiltr_el0 = READ_SPECIALREG(pmccfiltr_el0);
183+
hypctx->pmuserenr_el0 = READ_SPECIALREG(pmuserenr_el0);
184+
hypctx->pmselr_el0 = READ_SPECIALREG(pmselr_el0);
185+
hypctx->pmxevcntr_el0 = READ_SPECIALREG(pmxevcntr_el0);
183186
hypctx->pmcntenset_el0 = READ_SPECIALREG(pmcntenset_el0);
184187
hypctx->pmintenset_el1 = READ_SPECIALREG(pmintenset_el1);
185188
hypctx->pmovsset_el0 = READ_SPECIALREG(pmovsset_el0);
186-
hypctx->pmuserenr_el0 = READ_SPECIALREG(pmuserenr_el0);
189+
187190
switch ((hypctx->pmcr_el0 & PMCR_N_MASK) >> PMCR_N_SHIFT) {
188191
#define STORE_PMU(x) \
189192
case (x + 1): \
@@ -337,6 +340,9 @@ vmm_hyp_reg_restore(struct hypctx *hypctx, struct hyp *hyp, bool guest,
337340
WRITE_SPECIALREG(pmcr_el0, hypctx->pmcr_el0);
338341
WRITE_SPECIALREG(pmccntr_el0, hypctx->pmccntr_el0);
339342
WRITE_SPECIALREG(pmccfiltr_el0, hypctx->pmccfiltr_el0);
343+
WRITE_SPECIALREG(pmuserenr_el0, hypctx->pmuserenr_el0);
344+
WRITE_SPECIALREG(pmselr_el0, hypctx->pmselr_el0);
345+
WRITE_SPECIALREG(pmxevcntr_el0, hypctx->pmxevcntr_el0);
340346
/* Clear all events/interrupts then enable them */
341347
WRITE_SPECIALREG(pmcntenclr_el0, ~0ul);
342348
WRITE_SPECIALREG(pmcntenset_el0, hypctx->pmcntenset_el0);

sys/arm64/vmm/vmm_reset.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,12 @@ reset_vm_el01_regs(void *vcpu)
100100
el2ctx->pmcr_el0 |= PMCR_LC;
101101
set_arch_unknown(el2ctx->pmccntr_el0);
102102
set_arch_unknown(el2ctx->pmccfiltr_el0);
103+
set_arch_unknown(el2ctx->pmuserenr_el0);
104+
set_arch_unknown(el2ctx->pmselr_el0);
105+
set_arch_unknown(el2ctx->pmxevcntr_el0);
103106
set_arch_unknown(el2ctx->pmcntenset_el0);
104107
set_arch_unknown(el2ctx->pmintenset_el1);
105108
set_arch_unknown(el2ctx->pmovsset_el0);
106-
set_arch_unknown(el2ctx->pmuserenr_el0);
107109
memset(el2ctx->pmevcntr_el0, 0, sizeof(el2ctx->pmevcntr_el0));
108110
memset(el2ctx->pmevtyper_el0, 0, sizeof(el2ctx->pmevtyper_el0));
109111
}

0 commit comments

Comments
 (0)