Index: drivers/bus/acpi/acpica/include/platform/acgcc.h =================================================================== --- drivers/bus/acpi/acpica/include/platform/acgcc.h (révision 62604) +++ drivers/bus/acpi/acpica/include/platform/acgcc.h (révision 62605) @@ -147,4 +147,65 @@ #undef strchr #endif + +/* Flush CPU cache - used when going to sleep. Wbinvd or similar. */ + +#ifdef ACPI_APPLICATION +#define ACPI_FLUSH_CPU_CACHE() +#else +#define ACPI_FLUSH_CPU_CACHE() asm ("WBINVD") +#endif + +/* + * Global Lock acquire/release code + * + * Note: Taken from our old adaptation. + * TODO: Check whether it is equivalent to the MSVC code + * (which was also the same in the older version). + */ +#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) + +#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) + + +/* + * Note: This is also taken from our old adaptation. + * See acmsvc.h for where it came originally. + */ +#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ +{ \ + q32 = n_hi / d32; \ + r32 = n_lo / d32; \ +} + +#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ +{ \ + n_hi >>= 1; \ + n_lo >>= 1; \ +} + + #endif /* __ACGCC_H__ */ Index: drivers/bus/acpi/acpica/include/platform/acwin.h =================================================================== --- drivers/bus/acpi/acpica/include/platform/acwin.h (révision 62604) +++ drivers/bus/acpi/acpica/include/platform/acwin.h (révision 62605) @@ -118,9 +118,11 @@ /*! [Begin] no source code translation (Keep the include) */ -/* Windows uses VC */ -#ifdef _MSC_VER +/* Windows uses VC or GCC */ +#if defined(_MSC_VER) #include "acmsvc.h" +#elif defined(__GNUC__) +#include "acgcc.h" #endif /*! [End] no source code translation !*/ @@ -152,67 +154,10 @@ /*! [Begin] no source code translation */ -#ifdef ACPI_APPLICATION -#define ACPI_FLUSH_CPU_CACHE() -#else -#define ACPI_FLUSH_CPU_CACHE() __asm {WBINVD} -#endif - #ifdef _DEBUG #define ACPI_SIMPLE_RETURN_MACROS #endif /*! [End] no source code translation !*/ -/* - * Global Lock acquire/release code - * - * Note: Handles case where the FACS pointer is null - */ -#define ACPI_ACQUIRE_GLOBAL_LOCK(FacsPtr, Acq) __asm \ -{ \ - __asm mov eax, 0xFF \ - __asm mov ecx, FacsPtr \ - __asm or ecx, ecx \ - __asm jz exit_acq \ - __asm lea ecx, [ecx].GlobalLock \ - \ - __asm acq10: \ - __asm mov eax, [ecx] \ - __asm mov edx, eax \ - __asm and edx, 0xFFFFFFFE \ - __asm bts edx, 1 \ - __asm adc edx, 0 \ - __asm lock cmpxchg dword ptr [ecx], edx \ - __asm jnz acq10 \ - \ - __asm cmp dl, 3 \ - __asm sbb eax, eax \ - \ - __asm exit_acq: \ - __asm mov Acq, al \ -} - -#define ACPI_RELEASE_GLOBAL_LOCK(FacsPtr, Pnd) __asm \ -{ \ - __asm xor eax, eax \ - __asm mov ecx, FacsPtr \ - __asm or ecx, ecx \ - __asm jz exit_rel \ - __asm lea ecx, [ecx].GlobalLock \ - \ - __asm Rel10: \ - __asm mov eax, [ecx] \ - __asm mov edx, eax \ - __asm and edx, 0xFFFFFFFC \ - __asm lock cmpxchg dword ptr [ecx], edx \ - __asm jnz Rel10 \ - \ - __asm cmp dl, 3 \ - __asm and eax, 1 \ - \ - __asm exit_rel: \ - __asm mov Pnd, al \ -} - #endif /* __ACWIN_H__ */ Index: drivers/bus/acpi/acpica/include/platform/acmsvc.h =================================================================== --- drivers/bus/acpi/acpica/include/platform/acmsvc.h (révision 62604) +++ drivers/bus/acpi/acpica/include/platform/acmsvc.h (révision 62605) @@ -202,6 +202,67 @@ } #endif + +/* Flush CPU cache - used when going to sleep. Wbinvd or similar. */ + +#ifdef ACPI_APPLICATION +#define ACPI_FLUSH_CPU_CACHE() +#else +#define ACPI_FLUSH_CPU_CACHE() __asm {WBINVD} +#endif + +/* + * Global Lock acquire/release code + * + * Note: Handles case where the FACS pointer is null + */ +#define ACPI_ACQUIRE_GLOBAL_LOCK(FacsPtr, Acq) __asm \ +{ \ + __asm mov eax, 0xFF \ + __asm mov ecx, FacsPtr \ + __asm or ecx, ecx \ + __asm jz exit_acq \ + __asm lea ecx, [ecx].GlobalLock \ + \ + __asm acq10: \ + __asm mov eax, [ecx] \ + __asm mov edx, eax \ + __asm and edx, 0xFFFFFFFE \ + __asm bts edx, 1 \ + __asm adc edx, 0 \ + __asm lock cmpxchg dword ptr [ecx], edx \ + __asm jnz acq10 \ + \ + __asm cmp dl, 3 \ + __asm sbb eax, eax \ + \ + __asm exit_acq: \ + __asm mov Acq, al \ +} + +#define ACPI_RELEASE_GLOBAL_LOCK(FacsPtr, Pnd) __asm \ +{ \ + __asm xor eax, eax \ + __asm mov ecx, FacsPtr \ + __asm or ecx, ecx \ + __asm jz exit_rel \ + __asm lea ecx, [ecx].GlobalLock \ + \ + __asm Rel10: \ + __asm mov eax, [ecx] \ + __asm mov edx, eax \ + __asm and edx, 0xFFFFFFFC \ + __asm lock cmpxchg dword ptr [ecx], edx \ + __asm jnz Rel10 \ + \ + __asm cmp dl, 3 \ + __asm and eax, 1 \ + \ + __asm exit_rel: \ + __asm mov Pnd, al \ +} + + /* warn C4100: unreferenced formal parameter */ #pragma warning(disable:4100)