# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1656 -> 1.1657 # include/asm-x86_64/acpi.h 1.6 -> 1.7 # include/asm-x86_64/system.h 1.18 -> 1.19 # include/asm-i386/acpi.h 1.13 -> 1.14 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 04/03/05 len.brown@intel.com 1.1657 # [ACPI] global lock macro fixes (Paul Menage, Luming Yu) # http://bugzilla.kernel.org/show_bug.cgi?id=1669 # -------------------------------------------- # diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h --- a/include/asm-i386/acpi.h Fri Mar 5 00:30:04 2004 +++ b/include/asm-i386/acpi.h Fri Mar 5 00:30:04 2004 @@ -61,33 +61,36 @@ * Immediate values in the assembly are preceded by "$" as in "$0x1" * The final asm parameter are the operation altered non-output registers. */ + +static inline int +__acpi_acquire_global_lock (unsigned int *lock) +{ + unsigned int old, new, val; + do { + old = *lock; + new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); + val = cmpxchg(lock, old, new); + } while (unlikely (val != old)); + return (new < 3) ? -1 : 0; +} + +static inline int +__acpi_release_global_lock (unsigned int *lock) +{ + unsigned int old, new, val; + do { + old = *lock; + new = old & ~0x3; + val = cmpxchg(lock, old, new); + } while (unlikely (val != old)); + return old & 0x1; +} + #define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - "andl %2,%%edx;" \ - "btsl $0x1,%%edx;" \ - "adcl $0x0,%%edx;" \ - "lock; cmpxchgl %%edx,(%1);" \ - "jnz 1b;" \ - "cmpb $0x3,%%dl;" \ - "sbbl %%eax,%%eax" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \ - } while(0) + ((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr)) #define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - "andl %2,%%edx;" \ - "lock; cmpxchgl %%edx,(%1);" \ - "jnz 1b;" \ - "andl $0x1,%%eax" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ - } while(0) - + ((Acq) = __acpi_release_global_lock((unsigned int *) GLptr)) /* * Math helper asm macros diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h --- a/include/asm-x86_64/acpi.h Fri Mar 5 00:30:04 2004 +++ b/include/asm-x86_64/acpi.h Fri Mar 5 00:30:04 2004 @@ -60,7 +60,7 @@ do { old = *lock; new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); - val = cmpxchg4_locked(lock, new, old); + val = cmpxchg(lock, old, new); } while (unlikely (val != old)); return (new < 3) ? -1 : 0; } @@ -72,7 +72,7 @@ do { old = *lock; new = old & ~0x3; - val = cmpxchg4_locked(lock, new, old); + val = cmpxchg(lock, old, new); } while (unlikely (val != old)); return old & 0x1; } diff -Nru a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h --- a/include/asm-x86_64/system.h Fri Mar 5 00:30:04 2004 +++ b/include/asm-x86_64/system.h Fri Mar 5 00:30:04 2004 @@ -226,13 +226,6 @@ ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ (unsigned long)(n),sizeof(*(ptr)))) -static inline __u32 cmpxchg4_locked(__u32 *ptr, __u32 old, __u32 new) -{ - asm volatile("lock ; cmpxchgl %k1,%2" : - "=r" (new) : "0" (old), "m" (*(__u32 *)ptr) : "memory"); - return new; -} - #ifdef CONFIG_SMP #define smp_mb() mb() #define smp_rmb() rmb()