The branch main has been updated by kib:

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

commit fdc1f34506346fd26db8bfb80ba69d1af844c53a
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-02-27 03:54:06 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-03-07 03:58:48 +0000

    x86: change signatures of ipi_{bitmap,swi}_handler() to take pointer
    
    to the frame instead of the frame itself. It is some stretch of the
    amd64 ABI, and is not easily fullfilled when handlers are called from C
    and not asm. In particular, the struct frame is passed by value but is
    modified by callees, with the expectation that the caller will see the
    modifications.
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D55679
---
 sys/amd64/amd64/apic_vector.S |  2 ++
 sys/i386/i386/apic_vector.S   |  4 ++--
 sys/i386/i386/mp_machdep.c    | 14 ++++++++++++++
 sys/x86/include/x86_smp.h     |  4 ++--
 sys/x86/x86/mp_x86.c          | 10 +++++-----
 sys/x86/xen/xen_apic.c        |  4 ++--
 6 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S
index 8691387a5a8e..c753ddbad9be 100644
--- a/sys/amd64/amd64/apic_vector.S
+++ b/sys/amd64/amd64/apic_vector.S
@@ -179,6 +179,7 @@ IDTVEC(spuriousint)
        INTR_HANDLER ipi_intr_bitmap_handler
        call    as_lapic_eoi
        KMSAN_ENTER
+       movq    %rsp,%rdi
        call    ipi_bitmap_handler
        KMSAN_LEAVE
        jmp     doreti
@@ -220,6 +221,7 @@ IDTVEC(spuriousint)
        INTR_HANDLER ipi_swi
        call    as_lapic_eoi
        KMSAN_ENTER
+       movq    %rsp,%rdi
        call    ipi_swi_handler
        KMSAN_LEAVE
        jmp     doreti
diff --git a/sys/i386/i386/apic_vector.S b/sys/i386/i386/apic_vector.S
index 5d248409718d..0037f1c968fb 100644
--- a/sys/i386/i386/apic_vector.S
+++ b/sys/i386/i386/apic_vector.S
@@ -261,7 +261,7 @@ IDTVEC(ipi_intr_bitmap_handler)
        cld
        KENTER
        call    as_lapic_eoi
-       movl    $ipi_bitmap_handler, %eax
+       movl    $ipi_bitmap_handler_i386, %eax
        call    *%eax
        jmp     doreti
 
@@ -306,7 +306,7 @@ IDTVEC(ipi_swi)
        cld
        KENTER
        call    as_lapic_eoi
-       movl    $ipi_swi_handler, %eax
+       movl    $ipi_swi_handler_i386, %eax
        call    *%eax
        jmp     doreti
 
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index 18ec0d83fad3..0913a0f70d14 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -736,3 +736,17 @@ invlcache_handler(void)
        wbinvd();
        PCPU_SET(smp_tlb_done, generation);
 }
+
+void ipi_bitmap_handler_i386(struct trapframe frame);
+void
+ipi_bitmap_handler_i386(struct trapframe frame)
+{
+       ipi_bitmap_handler(&frame);
+}
+
+void ipi_swi_handler_i386(struct trapframe frame);
+void
+ipi_swi_handler_i386(struct trapframe frame)
+{
+       ipi_swi_handler(&frame);
+}
diff --git a/sys/x86/include/x86_smp.h b/sys/x86/include/x86_smp.h
index 045beb3b0f9a..3fa309df1be1 100644
--- a/sys/x86/include/x86_smp.h
+++ b/sys/x86/include/x86_smp.h
@@ -98,10 +98,10 @@ void        init_secondary_tail(void);
 void   init_secondary(void);
 void   ipi_startup(int apic_id, int vector);
 void   ipi_all_but_self(u_int ipi);
-void   ipi_bitmap_handler(struct trapframe frame);
+void   ipi_bitmap_handler(struct trapframe *frame);
 void   ipi_cpu(int cpu, u_int ipi);
 int    ipi_nmi_handler(void);
-void   ipi_swi_handler(struct trapframe frame);
+void   ipi_swi_handler(struct trapframe *frame);
 void   ipi_selected(cpuset_t cpus, u_int ipi);
 void   ipi_self_from_nmi(u_int vector);
 void   set_interrupt_apic_ids(void);
diff --git a/sys/x86/x86/mp_x86.c b/sys/x86/x86/mp_x86.c
index 0c32657290a0..66ad23ee957c 100644
--- a/sys/x86/x86/mp_x86.c
+++ b/sys/x86/x86/mp_x86.c
@@ -1328,14 +1328,14 @@ ipi_send_cpu(int cpu, u_int ipi)
 }
 
 void
-ipi_bitmap_handler(struct trapframe frame)
+ipi_bitmap_handler(struct trapframe *frame)
 {
        struct trapframe *oldframe;
        struct thread *td;
        int cpu = PCPU_GET(cpuid);
        u_int ipi_bitmap;
 
-       kasan_mark(&frame, sizeof(frame), sizeof(frame), 0);
+       kasan_mark(frame, sizeof(*frame), sizeof(*frame), 0);
 
        td = curthread;
        ipi_bitmap = atomic_readandclear_int(&cpuid_to_pcpu[cpu]->
@@ -1353,7 +1353,7 @@ ipi_bitmap_handler(struct trapframe frame)
 
        td->td_intr_nesting_level++;
        oldframe = td->td_intr_frame;
-       td->td_intr_frame = &frame;
+       td->td_intr_frame = frame;
 #if defined(STACK) || defined(DDB)
        if (ipi_bitmap & (1 << IPI_TRACE))
                stack_capture_intr();
@@ -1729,10 +1729,10 @@ cpuoff_handler(void)
  * Handle an IPI_SWI by waking delayed SWI thread.
  */
 void
-ipi_swi_handler(struct trapframe frame)
+ipi_swi_handler(struct trapframe *frame)
 {
 
-       intr_event_handle(clk_intr_event, &frame);
+       intr_event_handle(clk_intr_event, frame);
 }
 
 /*
diff --git a/sys/x86/xen/xen_apic.c b/sys/x86/xen/xen_apic.c
index 43a253cc2860..c8760545c8e9 100644
--- a/sys/x86/xen/xen_apic.c
+++ b/sys/x86/xen/xen_apic.c
@@ -217,7 +217,7 @@ static int
 xen_ipi_bitmap_handler(void *arg)
 {
 
-       ipi_bitmap_handler(*curthread->td_intr_frame);
+       ipi_bitmap_handler(curthread->td_intr_frame);
        return (FILTER_HANDLED);
 }
 
@@ -296,7 +296,7 @@ static int
 xen_ipi_swi_handler(void *arg)
 {
 
-       ipi_swi_handler(*curthread->td_intr_frame);
+       ipi_swi_handler(curthread->td_intr_frame);
        return (FILTER_HANDLED);
 }
 

Reply via email to