mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
sys: Permit passing pointers to VIRT_IN_DMAP and DMAP_TO_PHYS
Add explicit uintptr_t casts to the arguments to these macros so that the work both with virtual addresses (e.g. vm_offset_t) and pointers. Drop no-longer-needed casts in various invocations of DMAP_TO_PHYS. Effort: CHERI upstreaming Reviewed by: kib Sponsored by: AFRL, DARPA Pull Request: https://github.com/freebsd/freebsd-src/pull/2068
This commit is contained in:
1 parent
ac7d527402
commit
2c6d8f15bd
16 files changed
+75
-64
No files matched your search
+15
-18
@@ -545,7 +545,7 @@ static __inline int
|
||||
pc_to_domain(struct pv_chunk *pc)
|
||||
{
|
||||
|
||||
return (vm_phys_domain(DMAP_TO_PHYS((vm_offset_t)pc)));
|
||||
return (vm_phys_domain(DMAP_TO_PHYS(pc)));
|
||||
}
|
||||
#else
|
||||
static __inline int
|
||||
@@ -4834,7 +4834,7 @@ pmap_release(pmap_t pmap)
|
||||
KASSERT(CPU_EMPTY(&pmap->pm_active),
|
||||
("releasing active pmap %p", pmap));
|
||||
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_pmltop));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_pmltop));
|
||||
|
||||
if (pmap_is_la57(pmap)) {
|
||||
for (i = NPML5EPG / 2; i < NPML5EPG; i++)
|
||||
@@ -4863,8 +4863,7 @@ pmap_release(pmap_t pmap)
|
||||
pmap_pt_page_count_pinit(pmap, -1);
|
||||
|
||||
if (pmap->pm_pmltopu != NULL) {
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->
|
||||
pm_pmltopu));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_pmltopu));
|
||||
pmap_free_pt_page(NULL, m, false);
|
||||
pmap_pt_page_count_pinit(pmap, -1);
|
||||
}
|
||||
@@ -5349,7 +5348,7 @@ reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
|
||||
PV_STAT(counter_u64_add(pc_chunk_count, -1));
|
||||
PV_STAT(counter_u64_add(pc_chunk_frees, 1));
|
||||
/* Entire chunk is free; return it. */
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m_pc->phys_addr);
|
||||
mtx_lock(&pvc->pvc_lock);
|
||||
TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
|
||||
@@ -5450,7 +5449,7 @@ free_pv_chunk_dequeued(struct pv_chunk *pc)
|
||||
PV_STAT(counter_u64_add(pc_chunk_frees, 1));
|
||||
counter_u64_add(pv_page_count, -1);
|
||||
/* entire chunk is free, return it */
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m->phys_addr);
|
||||
vm_page_unwire_noq(m);
|
||||
vm_page_free(m);
|
||||
@@ -10708,7 +10707,7 @@ retry:
|
||||
goto retry;
|
||||
mphys = VM_PAGE_TO_PHYS(m);
|
||||
*pde = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->ref_count++;
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde))->ref_count++;
|
||||
} else {
|
||||
MPASS((*pde & X86_PG_PS) == 0);
|
||||
mphys = *pde & PG_FRAME;
|
||||
@@ -10827,8 +10826,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
|
||||
*pde = pa | pg_g | X86_PG_PS | X86_PG_RW |
|
||||
X86_PG_V | X86_PG_A | pg_nx |
|
||||
pmap_cache_bits(kernel_pmap, mattr, true);
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->
|
||||
ref_count++;
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde))->ref_count++;
|
||||
inc = NBPDR;
|
||||
} else {
|
||||
pte = pmap_large_map_pte(va);
|
||||
@@ -10836,8 +10834,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
|
||||
*pte = pa | pg_g | X86_PG_RW | X86_PG_V |
|
||||
X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap,
|
||||
mattr, false);
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte))->
|
||||
ref_count++;
|
||||
PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte))->ref_count++;
|
||||
inc = PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
@@ -10905,7 +10902,7 @@ pmap_large_unmap(void *svaa, vm_size_t len)
|
||||
pd, len));
|
||||
pde_store(pde, 0);
|
||||
inc = NBPDR;
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
|
||||
m->ref_count--;
|
||||
if (m->ref_count == 0) {
|
||||
*pdpe = 0;
|
||||
@@ -10919,12 +10916,12 @@ pmap_large_unmap(void *svaa, vm_size_t len)
|
||||
(u_long)pte, *pte));
|
||||
pte_clear(pte);
|
||||
inc = PAGE_SIZE;
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pte));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
|
||||
m->ref_count--;
|
||||
if (m->ref_count == 0) {
|
||||
*pde = 0;
|
||||
SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
|
||||
m->ref_count--;
|
||||
if (m->ref_count == 0) {
|
||||
*pdpe = 0;
|
||||
@@ -11227,7 +11224,7 @@ pmap_pti_wire_pte(void *pte)
|
||||
vm_page_t m;
|
||||
|
||||
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
|
||||
m->ref_count++;
|
||||
}
|
||||
|
||||
@@ -11237,7 +11234,7 @@ pmap_pti_unwire_pde(void *pde, bool only_ref)
|
||||
vm_page_t m;
|
||||
|
||||
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pde));
|
||||
MPASS(only_ref || m->ref_count > 1);
|
||||
pmap_pti_free_page(m);
|
||||
}
|
||||
@@ -11249,7 +11246,7 @@ pmap_pti_unwire_pte(void *pte, vm_offset_t va)
|
||||
pd_entry_t *pde;
|
||||
|
||||
VM_OBJECT_ASSERT_WLOCKED(pti_obj);
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pte));
|
||||
if (pmap_pti_free_page(m)) {
|
||||
pde = pmap_pti_pde(va);
|
||||
MPASS((*pde & (X86_PG_PS | X86_PG_V)) == X86_PG_V);
|
||||
@@ -12344,7 +12341,7 @@ DB_SHOW_COMMAND(ptpages, pmap_ptpages)
|
||||
}
|
||||
} else {
|
||||
ptpages_show_pml4(PHYS_TO_VM_PAGE(DMAP_TO_PHYS(
|
||||
(vm_offset_t)pmap->pm_pmltop)), NUP4ML4E, PG_V);
|
||||
pmap->pm_pmltop)), NUP4ML4E, PG_V);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -246,8 +246,11 @@
|
||||
* vt fb startup needs to be reworked.
|
||||
*/
|
||||
#define PHYS_IN_DMAP(pa) (dmaplimit == 0 || (pa) < dmaplimit)
|
||||
#define VIRT_IN_DMAP(va) \
|
||||
((va) >= kva_layout.dmap_low && (va) < kva_layout.dmap_low + dmaplimit)
|
||||
#define VIRT_IN_DMAP(va) __extension__ ({ \
|
||||
uintptr_t _va = (uintptr_t)(va); \
|
||||
\
|
||||
(_va >= kva_layout.dmap_low && \
|
||||
_va < kva_layout.dmap_low + dmaplimit); })
|
||||
|
||||
#define PMAP_HAS_DMAP 1
|
||||
#define PHYS_TO_DMAP(x) __extension__ ({ \
|
||||
@@ -257,10 +260,11 @@
|
||||
(x) + kva_layout.dmap_low; })
|
||||
|
||||
#define DMAP_TO_PHYS(x) __extension__ ({ \
|
||||
KASSERT(VIRT_IN_DMAP(x), \
|
||||
("virtual address %#jx not covered by the DMAP", \
|
||||
(uintmax_t)x)); \
|
||||
(x) - kva_layout.dmap_low; })
|
||||
uintptr_t _x = (uintptr_t)(x); \
|
||||
\
|
||||
KASSERT(VIRT_IN_DMAP(_x), \
|
||||
("virtual address %p not covered by the DMAP", (void *)_x));\
|
||||
_x - kva_layout.dmap_low; })
|
||||
|
||||
/*
|
||||
* amd64 maps the page array into KVA so that it can be more easily
|
||||
|
||||
@@ -334,7 +334,7 @@ vm_offset_t kernel_vm_end = 0;
|
||||
static __inline int
|
||||
pc_to_domain(struct pv_chunk *pc)
|
||||
{
|
||||
return (vm_phys_domain(DMAP_TO_PHYS((vm_offset_t)pc)));
|
||||
return (vm_phys_domain(DMAP_TO_PHYS(pc)));
|
||||
}
|
||||
#else
|
||||
static __inline int
|
||||
@@ -3458,7 +3458,7 @@ reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
|
||||
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
|
||||
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
|
||||
/* Entire chunk is free; return it. */
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m_pc->phys_addr);
|
||||
mtx_lock(&pvc->pvc_lock);
|
||||
TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
|
||||
@@ -3560,7 +3560,7 @@ free_pv_chunk_dequeued(struct pv_chunk *pc)
|
||||
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
|
||||
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
|
||||
/* entire chunk is free, return it */
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m->phys_addr);
|
||||
vm_page_unwire_noq(m);
|
||||
vm_page_free(m);
|
||||
@@ -8527,7 +8527,7 @@ pmap_demote_l1(pmap_t pmap, pt_entry_t *l1, vm_offset_t va)
|
||||
|
||||
if (tmpl1 != NULL) {
|
||||
pmap_kenter((vm_offset_t)tmpl1, PAGE_SIZE,
|
||||
DMAP_TO_PHYS((vm_offset_t)l1) & ~L3_OFFSET,
|
||||
DMAP_TO_PHYS(l1) & ~L3_OFFSET,
|
||||
VM_MEMATTR_WRITE_BACK);
|
||||
l1 = (pt_entry_t *)(tmpl1 + ((vm_offset_t)l1 & PAGE_MASK));
|
||||
}
|
||||
@@ -8722,7 +8722,7 @@ pmap_demote_l2_locked(pmap_t pmap, pt_entry_t *l2, vm_offset_t va,
|
||||
*/
|
||||
if (tmpl2 != NULL) {
|
||||
pmap_kenter((vm_offset_t)tmpl2, PAGE_SIZE,
|
||||
DMAP_TO_PHYS((vm_offset_t)l2) & ~L3_OFFSET,
|
||||
DMAP_TO_PHYS(l2) & ~L3_OFFSET,
|
||||
VM_MEMATTR_WRITE_BACK);
|
||||
l2 = (pt_entry_t *)(tmpl2 + ((vm_offset_t)l2 & PAGE_MASK));
|
||||
}
|
||||
@@ -8799,7 +8799,7 @@ pmap_demote_l2c(pmap_t pmap, pt_entry_t *l2p, vm_offset_t va)
|
||||
if (tmpl3 == NULL)
|
||||
return (false);
|
||||
pmap_kenter((vm_offset_t)tmpl3, PAGE_SIZE,
|
||||
DMAP_TO_PHYS((vm_offset_t)l2c_start) & ~L3_OFFSET,
|
||||
DMAP_TO_PHYS(l2c_start) & ~L3_OFFSET,
|
||||
VM_MEMATTR_WRITE_BACK);
|
||||
l2c_start = (pd_entry_t *)(tmpl3 +
|
||||
((vm_offset_t)l2c_start & PAGE_MASK));
|
||||
@@ -8888,7 +8888,7 @@ pmap_demote_l3c(pmap_t pmap, pt_entry_t *l3p, vm_offset_t va)
|
||||
if (tmpl3 == NULL)
|
||||
return (false);
|
||||
pmap_kenter((vm_offset_t)tmpl3, PAGE_SIZE,
|
||||
DMAP_TO_PHYS((vm_offset_t)l3c_start) & ~L3_OFFSET,
|
||||
DMAP_TO_PHYS(l3c_start) & ~L3_OFFSET,
|
||||
VM_MEMATTR_WRITE_BACK);
|
||||
l3c_start = (pt_entry_t *)(tmpl3 +
|
||||
((vm_offset_t)l3c_start & PAGE_MASK));
|
||||
|
||||
@@ -256,8 +256,12 @@
|
||||
#define PHYS_IN_DMAP(pa) (PHYS_IN_DMAP_RANGE(pa) && \
|
||||
pmap_klookup(PHYS_TO_DMAP(pa), NULL))
|
||||
/* True if va is in the dmap range */
|
||||
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
|
||||
(va) < (dmap_max_addr))
|
||||
#define VIRT_IN_DMAP(va) \
|
||||
({ \
|
||||
uintptr_t __va = (uintptr_t)(va); \
|
||||
\
|
||||
__va >= DMAP_MIN_ADDRESS && __va < (dmap_max_addr); \
|
||||
})
|
||||
|
||||
#define PMAP_HAS_DMAP 1
|
||||
#define PHYS_TO_DMAP(pa) \
|
||||
@@ -270,10 +274,11 @@
|
||||
|
||||
#define DMAP_TO_PHYS(va) \
|
||||
({ \
|
||||
KASSERT(VIRT_IN_DMAP(va), \
|
||||
("%s: VA out of range, VA: 0x%lx", __func__, \
|
||||
(vm_offset_t)(va))); \
|
||||
((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \
|
||||
uintptr_t _va = (uintptr_t)(va); \
|
||||
\
|
||||
KASSERT(VIRT_IN_DMAP(_va), \
|
||||
("%s: VA out of range, VA: %p", __func__, (void *)_va)); \
|
||||
(_va - DMAP_MIN_ADDRESS) + dmap_phys_base; \
|
||||
})
|
||||
|
||||
#define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
|
||||
|
||||
Vendored
+1
-1
@@ -658,7 +658,7 @@ XX_VirtToPhys(void *addr)
|
||||
|
||||
if (PMAP_HAS_DMAP && (vm_offset_t)addr >= DMAP_BASE_ADDRESS &&
|
||||
(vm_offset_t)addr <= DMAP_MAX_ADDRESS)
|
||||
return (DMAP_TO_PHYS((vm_offset_t)addr));
|
||||
return (DMAP_TO_PHYS(addr));
|
||||
else
|
||||
paddr = pmap_kextract((vm_offset_t)addr);
|
||||
|
||||
|
||||
@@ -461,7 +461,7 @@ ktls_buffer_release(void *arg __unused, void **store, int count)
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)store[i]));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(store[i]));
|
||||
for (j = 0; j < atop(ktls_maxlen); j++) {
|
||||
(void)vm_page_unwire_noq(m + j);
|
||||
vm_page_free(m + j);
|
||||
@@ -2816,7 +2816,7 @@ ktls_encrypt_record(struct ktls_wq *wq, struct mbuf *m,
|
||||
state->dst_iov[0].iov_base = (char *)state->cbuf +
|
||||
m->m_epg_1st_off;
|
||||
state->dst_iov[0].iov_len = len;
|
||||
state->parray[0] = DMAP_TO_PHYS((vm_offset_t)state->cbuf);
|
||||
state->parray[0] = DMAP_TO_PHYS(state->cbuf);
|
||||
i = 1;
|
||||
} else {
|
||||
off = m->m_epg_1st_off;
|
||||
|
||||
@@ -1497,7 +1497,7 @@ reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
|
||||
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
|
||||
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
|
||||
/* Entire chunk is free; return it. */
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m_pc->phys_addr);
|
||||
mtx_lock(&pv_chunks_mutex);
|
||||
TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
|
||||
@@ -1587,7 +1587,7 @@ free_pv_chunk(struct pv_chunk *pc)
|
||||
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
|
||||
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
|
||||
/* entire chunk is free, return it */
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m->phys_addr);
|
||||
vm_page_unwire_noq(m);
|
||||
vm_page_free(m);
|
||||
@@ -2158,7 +2158,7 @@ mmu_radix_parttab_init(void)
|
||||
uint64_t pagetab;
|
||||
|
||||
mmu_parttab_init();
|
||||
pagetab = RTS_SIZE | DMAP_TO_PHYS((vm_offset_t)kernel_pmap->pm_pml1) | \
|
||||
pagetab = RTS_SIZE | DMAP_TO_PHYS(kernel_pmap->pm_pml1) | \
|
||||
RADIX_PGD_INDEX_SHIFT | PARTTAB_HR;
|
||||
mmu_parttab_update(0, pagetab, 0);
|
||||
}
|
||||
@@ -2181,7 +2181,7 @@ mmu_radix_proctab_init(void)
|
||||
|
||||
isa3_proctab = (void*)PHYS_TO_DMAP(proctab0pa);
|
||||
isa3_proctab->proctab0 =
|
||||
htobe64(RTS_SIZE | DMAP_TO_PHYS((vm_offset_t)kernel_pmap->pm_pml1) |
|
||||
htobe64(RTS_SIZE | DMAP_TO_PHYS(kernel_pmap->pm_pml1) |
|
||||
RADIX_PGD_INDEX_SHIFT);
|
||||
|
||||
if (powernv_enabled) {
|
||||
@@ -3651,7 +3651,7 @@ radix_pgd_release(void *arg __unused, void **store, int count)
|
||||
* XXX selectively remove dmap and KVA entries so we don't
|
||||
* need to bzero
|
||||
*/
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)store[i]));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(store[i]));
|
||||
for (int j = page_count-1; j >= 0; j--) {
|
||||
vm_page_unwire_noq(&m[j]);
|
||||
SLIST_INSERT_HEAD(&free, &m[j], plinks.s.ss);
|
||||
@@ -4264,7 +4264,7 @@ mmu_radix_pinit(pmap_t pmap)
|
||||
vmem_alloc(asid_arena, 1, M_FIRSTFIT|M_WAITOK, &pid);
|
||||
|
||||
pmap->pm_pid = pid;
|
||||
l1pa = DMAP_TO_PHYS((vm_offset_t)pmap->pm_pml1);
|
||||
l1pa = DMAP_TO_PHYS(pmap->pm_pml1);
|
||||
mmu_radix_update_proctab(pid, l1pa);
|
||||
__asm __volatile("ptesync;isync" : : : "memory");
|
||||
|
||||
|
||||
@@ -626,7 +626,7 @@ moea64_bootstrap_native(vm_offset_t kernelstart, vm_offset_t kernelend)
|
||||
if (cpu_features2 & PPC_FEATURE2_ARCH_3_00) {
|
||||
bzero(__DEVOLATILE(void *, moea64_part_table), PART_SIZE);
|
||||
moea64_part_table[0].pagetab = htobe64(
|
||||
(DMAP_TO_PHYS((vm_offset_t)moea64_pteg_table)) |
|
||||
(DMAP_TO_PHYS(moea64_pteg_table)) |
|
||||
(uintptr_t)(flsl((moea64_pteg_count - 1) >> 11)));
|
||||
}
|
||||
ENABLE_TRANS(msr);
|
||||
|
||||
@@ -339,19 +339,19 @@ ptbl_unhold(pmap_t pmap, vm_offset_t va)
|
||||
ptbl = pdir[pdir_idx];
|
||||
|
||||
/* decrement hold count */
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t) ptbl));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(ptbl));
|
||||
|
||||
if (!unhold_free_page(pmap, m))
|
||||
return (0);
|
||||
|
||||
pdir[pdir_idx] = NULL;
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t) pdir));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pdir));
|
||||
|
||||
if (!unhold_free_page(pmap, m))
|
||||
return (1);
|
||||
|
||||
pdir_l1[pdir_l1_idx] = NULL;
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t) pdir_l1));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pdir_l1));
|
||||
|
||||
if (!unhold_free_page(pmap, m))
|
||||
return (1);
|
||||
@@ -372,7 +372,7 @@ ptbl_hold(pmap_t pmap, pte_t *ptbl)
|
||||
KASSERT((pmap != kernel_pmap),
|
||||
("ptbl_hold: holding kernel ptbl!"));
|
||||
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t) ptbl));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(ptbl));
|
||||
m->ref_count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@ extern int vm_level_0_order;
|
||||
(x) | DMAP_BASE_ADDRESS; })
|
||||
#define DMAP_TO_PHYS(x) ({ \
|
||||
KASSERT(hw_direct_map, ("Direct map not provided by PMAP")); \
|
||||
(x) &~ DMAP_BASE_ADDRESS; })
|
||||
(uintptr_t)(x) &~ DMAP_BASE_ADDRESS; })
|
||||
|
||||
/*
|
||||
* No non-transparent large page support in the pmap.
|
||||
|
||||
@@ -89,7 +89,7 @@ opal_hmi_handler2(struct trapframe *frame)
|
||||
int err;
|
||||
|
||||
*flags = 0;
|
||||
err = opal_call(OPAL_HANDLE_HMI2, DMAP_TO_PHYS((vm_offset_t)flags));
|
||||
err = opal_call(OPAL_HANDLE_HMI2, DMAP_TO_PHYS(flags));
|
||||
|
||||
if (be64toh(*flags) & OPAL_HMI_FLAGS_TOD_TB_FAIL)
|
||||
panic("TOD/TB recovery failure");
|
||||
|
||||
@@ -80,7 +80,7 @@ uma_small_free(void *mem, vm_size_t size, u_int8_t flags)
|
||||
vm_page_t m;
|
||||
|
||||
if (hw_direct_map)
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)mem));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(mem));
|
||||
else {
|
||||
m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)mem));
|
||||
pmap_kremove((vm_offset_t)mem);
|
||||
|
||||
@@ -171,8 +171,12 @@
|
||||
#define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
|
||||
(pa) < DMAP_MAX_PHYSADDR)
|
||||
/* True if va is in the dmap range */
|
||||
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
|
||||
(va) < (dmap_max_addr))
|
||||
#define VIRT_IN_DMAP(va) \
|
||||
({ \
|
||||
uintptr_t __va = (uintptr_t)(va); \
|
||||
\
|
||||
__va >= DMAP_MIN_ADDRESS && __va < (dmap_max_addr); \
|
||||
})
|
||||
|
||||
#define PMAP_HAS_DMAP 1
|
||||
#define PHYS_TO_DMAP(pa) \
|
||||
@@ -185,10 +189,11 @@
|
||||
|
||||
#define DMAP_TO_PHYS(va) \
|
||||
({ \
|
||||
KASSERT(VIRT_IN_DMAP(va), \
|
||||
("%s: VA out of range, VA: 0x%lx", __func__, \
|
||||
(vm_offset_t)(va))); \
|
||||
((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \
|
||||
uintptr_t _va = (uintptr_t)(va); \
|
||||
\
|
||||
KASSERT(VIRT_IN_DMAP(_va), \
|
||||
("%s: VA out of range, VA: %p", __func__, (void *)_va)); \
|
||||
(_va - DMAP_MIN_ADDRESS) + dmap_phys_base; \
|
||||
})
|
||||
|
||||
#define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
|
||||
|
||||
@@ -1924,7 +1924,7 @@ pmap_release(pmap_t pmap)
|
||||
|
||||
finish:
|
||||
npages = pmap->pm_stage == PM_STAGE2 ? 4 : 1;
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_top));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pmap->pm_top));
|
||||
for (i = 0; i < npages; i++) {
|
||||
vm_page_unwire_noq(m);
|
||||
vm_page_free(m);
|
||||
@@ -2132,7 +2132,7 @@ free_pv_chunk(struct pv_chunk *pc)
|
||||
PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
|
||||
PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
|
||||
/* entire chunk is free, return it */
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
|
||||
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS(pc));
|
||||
dump_drop_page(m->phys_addr);
|
||||
vm_page_unwire_noq(m);
|
||||
vm_page_free(m);
|
||||
|
||||
+1
-1
@@ -2168,7 +2168,7 @@ uma_small_free(void *mem, vm_size_t size, uint8_t flags)
|
||||
vm_page_t m;
|
||||
vm_paddr_t pa;
|
||||
|
||||
pa = DMAP_TO_PHYS((vm_offset_t)mem);
|
||||
pa = DMAP_TO_PHYS(mem);
|
||||
dump_drop_page(pa);
|
||||
m = PHYS_TO_VM_PAGE(pa);
|
||||
vm_page_unwire_noq(m);
|
||||
|
||||
+1
-1
@@ -658,7 +658,7 @@ vm_page_startup(vm_offset_t vaddr)
|
||||
* included in a crash dump. Since the message buffer is accessed
|
||||
* through the direct map, they are not automatically included.
|
||||
*/
|
||||
pa = DMAP_TO_PHYS((vm_offset_t)msgbufp->msg_ptr);
|
||||
pa = DMAP_TO_PHYS(msgbufp->msg_ptr);
|
||||
last_pa = pa + round_page(msgbufsize);
|
||||
while (pa < last_pa) {
|
||||
dump_add_page(pa);
|
||||
|
||||
Reference in new issue
Block a user