Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Apr 2026 15:29:16 +0000
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: f5b85cc09186 - stable/15 - sys: Use __is_aligned and __align_down for some kstack alignment operations
Message-ID:  <69eb8c4c.363b2.5badf330@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/15 has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=f5b85cc091868d48bbea60c82d511e5f2309666c

commit f5b85cc091868d48bbea60c82d511e5f2309666c
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-01-27 18:31:23 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-04-24 15:26:39 +0000

    sys: Use __is_aligned and __align_down for some kstack alignment operations
    
    Reviewed by:    kib, jhibbits
    Effort:         CHERI upstreaming
    Sponsored by:   AFRL, DARPA
    Differential Revision:  https://reviews.freebsd.org/D54840
    
    (cherry picked from commit 093fffa296d009de8cebf713a58ddbf876f05c5c)
---
 sys/amd64/amd64/vm_machdep.c       | 3 +--
 sys/i386/i386/vm_machdep.c         | 3 ++-
 sys/powerpc/powerpc/exec_machdep.c | 4 ++--
 sys/powerpc/powerpc/machdep.c      | 5 ++---
 sys/powerpc/powerpc/vm_machdep.c   | 4 ++--
 5 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index c763ff58680e..2e180003e93d 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -93,8 +93,7 @@ set_top_of_stack_td(struct thread *td)
 struct savefpu *
 get_pcb_user_save_td(struct thread *td)
 {
-	KASSERT(((vm_offset_t)td->td_md.md_usr_fpu_save %
-	    XSAVE_AREA_ALIGN) == 0,
+	KASSERT(__is_aligned(td->td_md.md_usr_fpu_save, XSAVE_AREA_ALIGN),
 	    ("Unaligned pcb_user_save area ptr %p td %p",
 	    td->td_md.md_usr_fpu_save, td));
 	return (td->td_md.md_usr_fpu_save);
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index 80b45070d896..698d3b26813c 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -91,7 +91,8 @@ get_pcb_user_save_td(struct thread *td)
 
 	p = td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
 	    roundup2(cpu_max_ext_state_size, XSAVE_AREA_ALIGN);
-	KASSERT((p % XSAVE_AREA_ALIGN) == 0, ("Unaligned pcb_user_save area"));
+	KASSERT(__is_aligned(p, XSAVE_AREA_ALIGN),
+	    ("Unaligned pcb_user_save area"));
 	return ((union savefpu *)p);
 }
 
diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c
index fde24370842e..4df70feb31bc 100644
--- a/sys/powerpc/powerpc/exec_machdep.c
+++ b/sys/powerpc/powerpc/exec_machdep.c
@@ -1094,8 +1094,8 @@ cpu_thread_alloc(struct thread *td)
 {
 	struct pcb *pcb;
 
-	pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
-	    sizeof(struct pcb)) & ~0x3fUL);
+	pcb = (struct pcb *)__align_down(td->td_kstack + td->td_kstack_pages *
+	    PAGE_SIZE - sizeof(struct pcb), 0x40);
 	td->td_pcb = pcb;
 	td->td_frame = (struct trapframe *)pcb - 1;
 }
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
index 1bbe165e5fe5..04b3967ee110 100644
--- a/sys/powerpc/powerpc/machdep.c
+++ b/sys/powerpc/powerpc/machdep.c
@@ -490,9 +490,8 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp,
 	/*
 	 * Finish setting up thread0.
 	 */
-	thread0.td_pcb = (struct pcb *)
-	    ((thread0.td_kstack + thread0.td_kstack_pages * PAGE_SIZE -
-	    sizeof(struct pcb)) & ~15UL);
+	thread0.td_pcb = (struct pcb *)__align_down(thread0.td_kstack +
+	    thread0.td_kstack_pages * PAGE_SIZE - sizeof(struct pcb), 16);
 	bzero((void *)thread0.td_pcb, sizeof(struct pcb));
 	pc->pc_curpcb = thread0.td_pcb;
 
diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c
index 1fd853783cc8..00fdc301a7e7 100644
--- a/sys/powerpc/powerpc/vm_machdep.c
+++ b/sys/powerpc/powerpc/vm_machdep.c
@@ -123,8 +123,8 @@ cpu_fork(struct thread *td1, struct proc *p2, struct thread *td2, int flags)
 	if (td1 == curthread)
 		cpu_update_pcb(td1);
 
-	pcb = (struct pcb *)((td2->td_kstack +
-	    td2->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb)) & ~0x3fUL);
+	pcb = (struct pcb *)__align_down(td2->td_kstack +
+	    td2->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb), 0x40);
 	td2->td_pcb = pcb;
 
 	/* Copy the pcb */


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69eb8c4c.363b2.5badf330>