Fix the naming of the atomic macros on amd64: right now, the x86_atomic_*_l() macros actually operate on unsigned 32bit integers instead of longs, so: 1) change the callers to use the _u32 versions 2) update the _ul definitions to bew the 64bit versions 3) remove the _l macros
Open question: perhaps the _ul macros should be removed too (they're unused after this diff) and future code should just explicitly use the _u32 or _u64 macros? Also, complete remove the x86_multicast_ipi() function as unused (it was broken by the move to suport 64 cpus too). oks? Philip Guenther Index: amd64/intr.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/intr.c,v retrieving revision 1.25 diff -u -p -r1.25 intr.c --- amd64/intr.c 20 Sep 2010 06:33:46 -0000 1.25 +++ amd64/intr.c 25 Dec 2010 17:46:01 -0000 @@ -498,7 +498,7 @@ intr_disestablish(struct intrhand *ih) simple_lock(&ci->ci_slock); pic->pic_hwmask(pic, ih->ih_pin); - x86_atomic_clearbits_l(&ci->ci_ipending, (1 << ih->ih_slot)); + x86_atomic_clearbits_u32(&ci->ci_ipending, (1 << ih->ih_slot)); /* * Remove the handler from the chain. Index: amd64/ipi.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/ipi.c,v retrieving revision 1.8 diff -u -p -r1.8 ipi.c --- amd64/ipi.c 26 Jun 2008 05:42:09 -0000 1.8 +++ amd64/ipi.c 25 Dec 2010 17:46:01 -0000 @@ -50,7 +50,7 @@ x86_send_ipi(struct cpu_info *ci, int ip { int ret; - x86_atomic_setbits_l(&ci->ci_ipis, ipimask); + x86_atomic_setbits_u32(&ci->ci_ipis, ipimask); /* Don't send IPI to cpu which isn't (yet) running. */ if (!(ci->ci_flags & CPUF_RUNNING)) @@ -88,7 +88,7 @@ x86_broadcast_ipi(int ipimask) continue; if ((ci->ci_flags & CPUF_RUNNING) == 0) continue; - x86_atomic_setbits_l(&ci->ci_ipis, ipimask); + x86_atomic_setbits_u32(&ci->ci_ipis, ipimask); count++; } if (!count) @@ -98,23 +98,6 @@ x86_broadcast_ipi(int ipimask) } void -x86_multicast_ipi(int cpumask, int ipimask) -{ - struct cpu_info *ci; - CPU_INFO_ITERATOR cii; - - cpumask &= ~(1U << cpu_number()); - if (cpumask == 0) - return; - - CPU_INFO_FOREACH(cii, ci) { - if ((cpumask & (1U << ci->ci_cpuid)) == 0) - continue; - x86_send_ipi(ci, ipimask); - } -} - -void x86_ipi_handler(void) { extern struct evcount ipi_count; @@ -122,7 +105,7 @@ x86_ipi_handler(void) u_int32_t pending; int bit; - pending = x86_atomic_testset_ul(&ci->ci_ipis, 0); + pending = x86_atomic_testset_u32(&ci->ci_ipis, 0); for (bit = 0; bit < X86_NIPI && pending; bit++) { if (pending & (1<<bit)) { Index: include/atomic.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/atomic.h,v retrieving revision 1.6 diff -u -p -r1.6 atomic.h --- include/atomic.h 25 May 2007 16:22:11 -0000 1.6 +++ include/atomic.h 25 Dec 2010 17:46:02 -0000 @@ -120,12 +120,10 @@ x86_atomic_clearbits_u64(volatile u_int6 __asm __volatile(LOCK " andq %1,%0" : "=m" (*ptr) : "ir" (~bits)); } -#define x86_atomic_testset_ul x86_atomic_testset_u32 +#define x86_atomic_testset_ul x86_atomic_testset_u64 #define x86_atomic_testset_i x86_atomic_testset_i32 -#define x86_atomic_setbits_l x86_atomic_setbits_u32 -#define x86_atomic_setbits_ul x86_atomic_setbits_u32 -#define x86_atomic_clearbits_l x86_atomic_clearbits_u32 -#define x86_atomic_clearbits_ul x86_atomic_clearbits_u32 +#define x86_atomic_setbits_ul x86_atomic_setbits_u64 +#define x86_atomic_clearbits_ul x86_atomic_clearbits_u64 #define atomic_setbits_int x86_atomic_setbits_u32 #define atomic_clearbits_int x86_atomic_clearbits_u32 Index: include/intr.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/intr.h,v retrieving revision 1.20 diff -u -p -r1.20 intr.h --- include/intr.h 21 Dec 2010 14:56:23 -0000 1.20 +++ include/intr.h 25 Dec 2010 17:46:02 -0000 @@ -210,7 +210,6 @@ void intr_printconfig(void); int x86_send_ipi(struct cpu_info *, int); int x86_fast_ipi(struct cpu_info *, int); void x86_broadcast_ipi(int); -void x86_multicast_ipi(int, int); void x86_ipi_handler(void); void x86_intlock(struct intrframe); void x86_intunlock(struct intrframe);