forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86: move cmpxchg fallbacks to a generic place
arch/x86/kernel/cpu/intel.c defines a few fallback functions (cmpxchg_*()) that are used when the CPU doesn't support cmpxchg and/or cmpxchg64 natively. However, while defined in an Intel-specific file, these functions are also used for CPUs from other vendors when they don't support cmpxchg and/or cmpxchg64. This breaks the compilation when support for Intel CPUs is disabled. This patch moves these functions to a new arch/x86/kernel/cpu/cmpxchg.c file, unconditionally compiled when X86_32 is enabled. Signed-off-by: Thomas Petazzoni <[email protected]> Cc: [email protected] Signed-off-by: Ingo Molnar <[email protected]>
- Loading branch information
1 parent
8bfcb39
commit 774400a
Showing
3 changed files
with
73 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* cmpxchg*() fallbacks for CPU not supporting these instructions | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/smp.h> | ||
#include <linux/module.h> | ||
|
||
#ifndef CONFIG_X86_CMPXCHG | ||
unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new) | ||
{ | ||
u8 prev; | ||
unsigned long flags; | ||
|
||
/* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
local_irq_save(flags); | ||
prev = *(u8 *)ptr; | ||
if (prev == old) | ||
*(u8 *)ptr = new; | ||
local_irq_restore(flags); | ||
return prev; | ||
} | ||
EXPORT_SYMBOL(cmpxchg_386_u8); | ||
|
||
unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new) | ||
{ | ||
u16 prev; | ||
unsigned long flags; | ||
|
||
/* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
local_irq_save(flags); | ||
prev = *(u16 *)ptr; | ||
if (prev == old) | ||
*(u16 *)ptr = new; | ||
local_irq_restore(flags); | ||
return prev; | ||
} | ||
EXPORT_SYMBOL(cmpxchg_386_u16); | ||
|
||
unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new) | ||
{ | ||
u32 prev; | ||
unsigned long flags; | ||
|
||
/* Poor man's cmpxchg for 386. Unsuitable for SMP */ | ||
local_irq_save(flags); | ||
prev = *(u32 *)ptr; | ||
if (prev == old) | ||
*(u32 *)ptr = new; | ||
local_irq_restore(flags); | ||
return prev; | ||
} | ||
EXPORT_SYMBOL(cmpxchg_386_u32); | ||
#endif | ||
|
||
#ifndef CONFIG_X86_CMPXCHG64 | ||
unsigned long long cmpxchg_486_u64(volatile void *ptr, u64 old, u64 new) | ||
{ | ||
u64 prev; | ||
unsigned long flags; | ||
|
||
/* Poor man's cmpxchg8b for 386 and 486. Unsuitable for SMP */ | ||
local_irq_save(flags); | ||
prev = *(u64 *)ptr; | ||
if (prev == old) | ||
*(u64 *)ptr = new; | ||
local_irq_restore(flags); | ||
return prev; | ||
} | ||
EXPORT_SYMBOL(cmpxchg_486_u64); | ||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters