Page MenuHomeFreeBSD

D26066.id75821.diff
No OneTemporary

D26066.id75821.diff

Index: sys/arm64/arm64/pmap.c
===================================================================
--- sys/arm64/arm64/pmap.c
+++ sys/arm64/arm64/pmap.c
@@ -928,6 +928,7 @@
kernel_pmap->pm_l0_paddr = l0pt - kern_delta;
kernel_pmap->pm_cookie = COOKIE_FROM(-1, INT_MIN);
kernel_pmap->pm_stage = PM_STAGE1;
+ kernel_pmap->pm_levels = 4;
kernel_pmap->pm_asid_set = &asids;
/* Assume the address we were loaded to is a valid physical address */
@@ -1580,11 +1581,13 @@
}
pmap_invalidate_page(pmap, va);
- /*
- * Put page on a list so that it is released after
- * *ALL* TLB shootdown is done
- */
- pmap_add_delayed_free_list(m, free, TRUE);
+ if (free != NULL) {
+ /*
+ * Put page on a list so that it is released after
+ * *ALL* TLB shootdown is done
+ */
+ pmap_add_delayed_free_list(m, free, TRUE);
+ }
}
/*
@@ -1638,13 +1641,14 @@
pmap->pm_root.rt_root = 0;
pmap->pm_cookie = COOKIE_FROM(ASID_RESERVED_FOR_PID_0, INT_MIN);
pmap->pm_stage = PM_STAGE1;
+ pmap->pm_levels = 4;
pmap->pm_asid_set = &asids;
PCPU_SET(curpmap, pmap);
}
int
-pmap_pinit_stage(pmap_t pmap, enum pmap_stage stage)
+pmap_pinit_stage(pmap_t pmap, enum pmap_stage stage, int levels)
{
vm_page_t l0pt;
@@ -1665,6 +1669,8 @@
bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
pmap->pm_cookie = COOKIE_FROM(-1, INT_MAX);
+ MPASS(levels == 3 || levels == 4);
+ pmap->pm_levels = levels;
pmap->pm_stage = stage;
switch (stage) {
case PM_STAGE1:
@@ -1681,6 +1687,17 @@
/* XXX Temporarily disable deferred ASID allocation. */
pmap_alloc_asid(pmap);
+ /*
+ * Allocate the level 1 entry to use as the root. This will increase
+ * the refcount on the level 1 page so it won't be removed until we
+ * are releasing it.
+ */
+ if (pmap->pm_levels == 3) {
+ PMAP_LOCK(pmap);
+ _pmap_alloc_l3(pmap, NUL2E + NUL1E, NULL);
+ PMAP_UNLOCK(pmap);
+ }
+
return (1);
}
@@ -1688,7 +1705,7 @@
pmap_pinit(pmap_t pmap)
{
- return (pmap_pinit_stage(pmap, PM_STAGE1));
+ return (pmap_pinit_stage(pmap, PM_STAGE1, 4));
}
/*
@@ -1941,10 +1958,24 @@
void
pmap_release(pmap_t pmap)
{
+ boolean_t rv;
struct asid_set *set;
vm_page_t m;
int asid;
+ if (pmap->pm_levels == 3) {
+ KASSERT(pmap->pm_stats.resident_count == 1,
+ ("pmap_release: pmap resident count %ld != 0",
+ pmap->pm_stats.resident_count));
+ KASSERT((pmap->pm_l0[0] & ATTR_DESCR_VALID) == ATTR_DESCR_VALID,
+ ("pmap_release: Invalid l0 entry: %lx", pmap->pm_l0[0]));
+ m = PHYS_TO_VM_PAGE(pmap->pm_l0[0] & ~ATTR_MASK);
+ PMAP_LOCK(pmap);
+ rv = pmap_unwire_l3(pmap, 0, m, NULL);
+ PMAP_UNLOCK(pmap);
+ MPASS(rv == TRUE);
+ }
+
KASSERT(pmap->pm_stats.resident_count == 0,
("pmap_release: pmap resident count %ld != 0",
pmap->pm_stats.resident_count));
@@ -6099,9 +6130,22 @@
uint64_t
pmap_to_ttbr0(pmap_t pmap)
{
+ uint64_t paddr;
+
+ switch (pmap->pm_levels) {
+ case 4:
+ paddr = pmap->pm_l0_paddr;
+ break;
+ case 3:
+ KASSERT((pmap->pm_l0[0] & ATTR_DESCR_VALID) == ATTR_DESCR_VALID,
+ ("pmap_to_ttbr0: Invalid l0 entry: %lx", pmap->pm_l0[0]));
+ paddr = pmap->pm_l0[0] & ~ATTR_MASK;
+ break;
+ default:
+ panic("pmap_to_ttbr0: Invalid level %d", pmap->pm_levels);
+ }
- return (ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie)) |
- pmap->pm_l0_paddr);
+ return (ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie)) | paddr);
}
static bool
Index: sys/arm64/include/pmap.h
===================================================================
--- sys/arm64/include/pmap.h
+++ sys/arm64/include/pmap.h
@@ -92,6 +92,7 @@
long pm_cookie; /* encodes the pmap's ASID */
struct asid_set *pm_asid_set; /* The ASID/VMID set to use */
enum pmap_stage pm_stage;
+ int pm_levels;
};
typedef struct pmap *pmap_t;
@@ -170,7 +171,7 @@
void pmap_kremove_device(vm_offset_t, vm_size_t);
void *pmap_mapdev_attr(vm_offset_t pa, vm_size_t size, vm_memattr_t ma);
bool pmap_page_is_mapped(vm_page_t m);
-int pmap_pinit_stage(pmap_t, enum pmap_stage);
+int pmap_pinit_stage(pmap_t, enum pmap_stage, int);
bool pmap_ps_enabled(pmap_t pmap);
uint64_t pmap_to_ttbr0(pmap_t pmap);

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 17, 10:47 PM (14 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31683954
Default Alt Text
D26066.id75821.diff (4 KB)

Event Timeline