The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=570b8b25753c2be7657f0e906cb5a89c7f35b56e
commit 570b8b25753c2be7657f0e906cb5a89c7f35b56e Author: Andrew Turner <[email protected]> AuthorDate: 2026-03-05 14:27:37 +0000 Commit: Andrew Turner <[email protected]> CommitDate: 2026-03-05 15:13:30 +0000 arm64: Use a canonical address when TBI is enabled When Top Byte Ignore (TBI) is enabled in a processor we need to pass a canonical address to the vm subsystem. Reviewed by: alc, kib Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D55619 --- sys/arm64/arm64/trap.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c index b3c68fa4826f..3ce0b29f0b82 100644 --- a/sys/arm64/arm64/trap.c +++ b/sys/arm64/arm64/trap.c @@ -262,6 +262,7 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr, { struct vm_map *map; struct pcb *pcb; + vm_offset_t fault_va; vm_prot_t ftype; int error, sig, ucode; #ifdef KDB @@ -282,8 +283,11 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr, } #endif + fault_va = far; if (lower) { map = &td->td_proc->p_vmspace->vm_map; + if ((td->td_proc->p_md.md_tcr & TCR_TBI0) != 0) + fault_va = ADDR_MAKE_CANONICAL(far); } else if (!ADDR_IS_CANONICAL(far)) { /* We received a TBI/PAC/etc. fault from the kernel */ error = KERN_INVALID_ADDRESS; @@ -338,7 +342,7 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr, * or pmap_fault() will recurse on that lock. */ if ((lower || map == kernel_map || pcb->pcb_onfault != 0) && - pmap_fault(map->pmap, esr, far) == KERN_SUCCESS) + pmap_fault(map->pmap, esr, fault_va) == KERN_SUCCESS) return; #ifdef INVARIANTS @@ -379,7 +383,8 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr, } /* Fault in the page. */ - error = vm_fault_trap(map, far, ftype, VM_FAULT_NORMAL, &sig, &ucode); + error = vm_fault_trap(map, fault_va, ftype, VM_FAULT_NORMAL, &sig, + &ucode); if (error != KERN_SUCCESS) { if (lower) { call_trapsignal(td, sig, ucode, (void *)far,
