Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152845628
D55961.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D55961.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D55961: arm64: Move the FEAT_VMID16 detection to vmm
Attached
Detach File
Event Timeline
Log In to Comment