Page MenuHomeFreeBSD

D55961.diff
No OneTemporary

D55961.diff

diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -1574,6 +1574,17 @@
mtx_init(&set->asid_set_mutex, "asid set", NULL, MTX_SPIN);
}
+static void
+pmap_fini_asids(struct asid_set *set)
+{
+ MPASS(set == &vmids);
+
+ kmem_free(set->asid_set, bitstr_size(set->asid_set_size));
+ mtx_destroy(&set->asid_set_mutex);
+ memset(set, 0, sizeof(*set));
+ pmap_clean_stage2_tlbi();
+}
+
static void
pmap_init_pv_table(void)
{
@@ -1782,8 +1793,7 @@
void
pmap_init(void)
{
- uint64_t mmfr1;
- int i, vmid_bits;
+ int i;
/*
* Are large page mappings enabled?
@@ -1809,16 +1819,6 @@
pmap_init_asids(&asids,
(READ_SPECIALREG(tcr_el1) & TCR_ASID_16) != 0 ? 16 : 8);
- if (has_hyp()) {
- mmfr1 = READ_SPECIALREG(id_aa64mmfr1_el1);
- vmid_bits = 8;
-
- if (ID_AA64MMFR1_VMIDBits_VAL(mmfr1) ==
- ID_AA64MMFR1_VMIDBits_16)
- vmid_bits = 16;
- pmap_init_asids(&vmids, vmid_bits);
- }
-
/*
* Initialize pv chunk lists.
*/
@@ -1832,6 +1832,18 @@
vm_initialized = 1;
}
+void
+pmap_init_vmid(int vmid_bits)
+{
+ pmap_init_asids(&vmids, vmid_bits);
+}
+
+void
+pmap_fini_vmid(void)
+{
+ pmap_fini_asids(&vmids);
+}
+
static SYSCTL_NODE(_vm_pmap, OID_AUTO, l1, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
"L1 (1GB/64GB) page mapping counters");
diff --git a/sys/arm64/include/hypervisor.h b/sys/arm64/include/hypervisor.h
--- a/sys/arm64/include/hypervisor.h
+++ b/sys/arm64/include/hypervisor.h
@@ -2092,6 +2092,8 @@
#define TCR_EL2_PS_44BITS (4UL << TCR_EL2_PS_SHIFT)
#define TCR_EL2_PS_48BITS (5UL << TCR_EL2_PS_SHIFT)
#define TCR_EL2_PS_52BITS (6UL << TCR_EL2_PS_SHIFT)
+#define VTCR_EL2_VS_SHIFT 19
+#define VTCR_EL2_VS (1UL << VTCR_EL2_VS_SHIFT)
#define TCR_EL2_HPD_SHIFT 24
#define TCR_EL2_HPD (1UL << TCR_EL2_HPD_SHIFT)
#define TCR_EL2_HWU59_SHIFT 25
diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h
--- a/sys/arm64/include/pmap.h
+++ b/sys/arm64/include/pmap.h
@@ -141,6 +141,8 @@
#define pmap_vm_page_alloc_check(m)
+void pmap_init_vmid(int);
+void pmap_fini_vmid(void);
void pmap_activate_vm(pmap_t);
void pmap_bootstrap_dmap(vm_size_t);
void pmap_bootstrap(void);
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
@@ -236,8 +236,9 @@
struct vmm_init_regs el2_regs;
vm_offset_t next_hyp_va;
vm_paddr_t vmm_base;
- uint64_t id_aa64mmfr0_el1, pa_range_bits, pa_range_field;
- int cpu, i;
+ uint64_t id_aa64mmfr0_el1, id_aa64mmfr1_el1;
+ uint64_t pa_range_bits, pa_range_field;
+ int cpu, i, vmid_bits;
bool rv __diagused;
if (!has_hyp()) {
@@ -391,6 +392,17 @@
#ifdef SMP
el2_regs.vtcr_el2 |= VTCR_EL2_SH0_IS;
#endif
+
+ get_kernel_reg(ID_AA64MMFR1_EL1, &id_aa64mmfr1_el1);
+ vmid_bits = 8;
+ if (ID_AA64MMFR1_VMIDBits_VAL(id_aa64mmfr1_el1) ==
+ ID_AA64MMFR1_VMIDBits_16) {
+ vmid_bits = 16;
+ el2_regs.vtcr_el2 |= VTCR_EL2_VS;
+ }
+
+ pmap_init_vmid(vmid_bits);
+
/*
* If FEAT_LPA2 is enabled in the host then we need to enable it here
* so the page tables created by pmap.c are correct. The meaning of
@@ -471,6 +483,7 @@
free(stack[cpu], M_HYP);
}
+ pmap_fini_vmid();
pmap_clean_stage2_tlbi = NULL;
pmap_stage2_invalidate_range = NULL;
pmap_stage2_invalidate_all = NULL;

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 18, 11:39 AM (22 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31690353
Default Alt Text
D55961.diff (3 KB)

Event Timeline