The branch stable/12 has been updated by markj:

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

commit cbced258dee43b4f65e62572aa2fcd67225eca20
Author:     Mark Johnston <[email protected]>
AuthorDate: 2021-05-31 22:51:14 +0000
Commit:     Mark Johnston <[email protected]>
CommitDate: 2021-06-07 01:00:32 +0000

    x86: Fix lapic_ipi_alloc() on i386
    
    The loop which checks to see if "dynamic" IDT entries are allocated
    needs to compare with the trampoline address of the reserved ISR.
    Otherwise it will never succeed.
    
    Reported by:    Harry Schmalzbauer <[email protected]>
    Tested by:      Harry Schmalzbauer <[email protected]>
    Reviewed by:    kib
    Sponsored by:   The FreeBSD Foundation
    
    (cherry picked from commit 18f55c67f746f0ad12fe972328234d340a621df9)
---
 sys/x86/x86/local_apic.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index 2a1c3ad56148..a34cfbb8b1c9 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -2113,6 +2113,10 @@ native_lapic_ipi_vectored(u_int vector, int dest)
 
 #endif /* SMP */
 
+#ifdef __i386__
+extern uintptr_t setidt_disp;
+#endif
+
 /*
  * Since the IDT is shared by all CPUs the IPI slot update needs to be globally
  * visible.
@@ -2141,6 +2145,9 @@ native_lapic_ipi_alloc(inthand_t *ipifunc)
        for (idx = IPI_DYN_FIRST; idx <= IPI_DYN_LAST; idx++) {
                ip = &idt[idx];
                func = (ip->gd_hioffset << 16) | ip->gd_looffset;
+#ifdef __i386__
+               func -= setidt_disp;
+#endif
                if ((!pti && func == (uintptr_t)&IDTVEC(rsvd)) ||
                    (pti && func == (uintptr_t)&IDTVEC(rsvd_pti))) {
                        vector = idx;
@@ -2164,6 +2171,9 @@ native_lapic_ipi_free(int vector)
        mtx_lock_spin(&icu_lock);
        ip = &idt[vector];
        func = (ip->gd_hioffset << 16) | ip->gd_looffset;
+#ifdef __i386__
+       func -= setidt_disp;
+#endif
        KASSERT(func != (uintptr_t)&IDTVEC(rsvd) &&
            func != (uintptr_t)&IDTVEC(rsvd_pti),
            ("invalid idtfunc %#lx", func));
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to