linux/arch/x86/kernel/cpu/cmpxchg.c
<<
>>
Prefs
   1/*
   2 * cmpxchg*() fallbacks for CPU not supporting these instructions
   3 */
   4
   5#include <linux/kernel.h>
   6#include <linux/smp.h>
   7#include <linux/module.h>
   8
   9#ifndef CONFIG_X86_CMPXCHG
  10unsigned long cmpxchg_386_u8(volatile void *ptr, u8 old, u8 new)
  11{
  12        u8 prev;
  13        unsigned long flags;
  14
  15        /* Poor man's cmpxchg for 386. Unsuitable for SMP */
  16        local_irq_save(flags);
  17        prev = *(u8 *)ptr;
  18        if (prev == old)
  19                *(u8 *)ptr = new;
  20        local_irq_restore(flags);
  21        return prev;
  22}
  23EXPORT_SYMBOL(cmpxchg_386_u8);
  24
  25unsigned long cmpxchg_386_u16(volatile void *ptr, u16 old, u16 new)
  26{
  27        u16 prev;
  28        unsigned long flags;
  29
  30        /* Poor man's cmpxchg for 386. Unsuitable for SMP */
  31        local_irq_save(flags);
  32        prev = *(u16 *)ptr;
  33        if (prev == old)
  34                *(u16 *)ptr = new;
  35        local_irq_restore(flags);
  36        return prev;
  37}
  38EXPORT_SYMBOL(cmpxchg_386_u16);
  39
  40unsigned long cmpxchg_386_u32(volatile void *ptr, u32 old, u32 new)
  41{
  42        u32 prev;
  43        unsigned long flags;
  44
  45        /* Poor man's cmpxchg for 386. Unsuitable for SMP */
  46        local_irq_save(flags);
  47        prev = *(u32 *)ptr;
  48        if (prev == old)
  49                *(u32 *)ptr = new;
  50        local_irq_restore(flags);
  51        return prev;
  52}
  53EXPORT_SYMBOL(cmpxchg_386_u32);
  54#endif
  55
  56#ifndef CONFIG_X86_CMPXCHG64
  57unsigned long long cmpxchg_486_u64(volatile void *ptr, u64 old, u64 new)
  58{
  59        u64 prev;
  60        unsigned long flags;
  61
  62        /* Poor man's cmpxchg8b for 386 and 486. Unsuitable for SMP */
  63        local_irq_save(flags);
  64        prev = *(u64 *)ptr;
  65        if (prev == old)
  66                *(u64 *)ptr = new;
  67        local_irq_restore(flags);
  68        return prev;
  69}
  70EXPORT_SYMBOL(cmpxchg_486_u64);
  71#endif
  72
  73