git: 570b8b25753c - main - arm64: Use a canonical address when TBI is enabled
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 05 Mar 2026 15:14:20 UTC
The branch main has been updated by andrew:
URL: https://cgit.FreeBSD.org/src/commit/?id=570b8b25753c2be7657f0e906cb5a89c7f35b56e
commit 570b8b25753c2be7657f0e906cb5a89c7f35b56e
Author: Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2026-03-05 14:27:37 +0000
Commit: Andrew Turner <andrew@FreeBSD.org>
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,