FreeBSD kernel kern code
subr_atomic64.c File Reference
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/smp.h>
#include <sys/systm.h>
#include <machine/atomic.h>
#include <machine/param.h>
#include <vm/vm.h>
#include <vm/pmap.h>
Include dependency graph for subr_atomic64.c:

Go to the source code of this file.

Macros

#define LOCK_A64()   { register_t s = intr_disable()
 
#define UNLOCK_A64()   intr_restore(s); }
 
#define ATOMIC64_EMU_UN(op, rt, block, ret)
 
#define ATOMIC64_EMU_BIN(op, rt, block, ret)
 

Enumerations

enum  {
  ATOMIC64_ADD , ATOMIC64_CLEAR , ATOMIC64_CMPSET , ATOMIC64_FCMPSET ,
  ATOMIC64_FETCHADD , ATOMIC64_LOAD , ATOMIC64_SET , ATOMIC64_SUBTRACT ,
  ATOMIC64_STORE , ATOMIC64_SWAP
}
 

Functions

 ATOMIC64_EMU_BIN (add, void,(*p= *p+v), return)
 
 ATOMIC64_EMU_BIN (clear, void, *p &=~v, return)
 
 ATOMIC64_EMU_BIN (fetchadd, uint64_t,(*p= *p+v, v= *p - v), return(v))
 
 ATOMIC64_EMU_UN (load, uint64_t,(tmp= *p), return(tmp))
 
 ATOMIC64_EMU_BIN (set, void, *p|=v, return)
 
 ATOMIC64_EMU_BIN (subtract, void,(*p= *p - v), return)
 
 ATOMIC64_EMU_BIN (store, void, *p=v, return)
 
 ATOMIC64_EMU_BIN (swap, uint64_t, tmp= *p; *p=v;v=tmp, return(v))
 
int atomic_cmpset_64 (volatile uint64_t *p, uint64_t old, uint64_t new)
 
int atomic_fcmpset_64 (volatile uint64_t *p, uint64_t *old, uint64_t new)
 

Macro Definition Documentation

◆ ATOMIC64_EMU_BIN

#define ATOMIC64_EMU_BIN (   op,
  rt,
  block,
  ret 
)
Value:
rt \
atomic_##op##_64(volatile uint64_t *p, uint64_t v) { \
uint64_t tmp __unused; \
LOCK_A64(); \
block; \
UNLOCK_A64(); \
ret; } struct hack

Definition at line 90 of file subr_atomic64.c.

◆ ATOMIC64_EMU_UN

#define ATOMIC64_EMU_UN (   op,
  rt,
  block,
  ret 
)
Value:
rt \
atomic_##op##_64(volatile uint64_t *p) { \
uint64_t tmp __unused; \
LOCK_A64(); \
block; \
UNLOCK_A64(); \
ret; } struct hack

Definition at line 81 of file subr_atomic64.c.

◆ LOCK_A64

#define LOCK_A64 ( )    { register_t s = intr_disable()

Definition at line 76 of file subr_atomic64.c.

◆ UNLOCK_A64

#define UNLOCK_A64 ( )    intr_restore(s); }

Definition at line 77 of file subr_atomic64.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
ATOMIC64_ADD 
ATOMIC64_CLEAR 
ATOMIC64_CMPSET 
ATOMIC64_FCMPSET 
ATOMIC64_FETCHADD 
ATOMIC64_LOAD 
ATOMIC64_SET 
ATOMIC64_SUBTRACT 
ATOMIC64_STORE 
ATOMIC64_SWAP 

Definition at line 44 of file subr_atomic64.c.

Function Documentation

◆ ATOMIC64_EMU_BIN() [1/7]

ATOMIC64_EMU_BIN ( add  ,
void  ,
*= *+  v,
return   
)

◆ ATOMIC64_EMU_BIN() [2/7]

ATOMIC64_EMU_BIN ( clear  ,
void  ,
*p &  = ~v,
return   
)

◆ ATOMIC64_EMU_BIN() [3/7]

ATOMIC64_EMU_BIN ( fetchadd  ,
uint64_t  ,
*= *+,= *-  v,
return(v)   
)

◆ ATOMIC64_EMU_BIN() [4/7]

ATOMIC64_EMU_BIN ( set  ,
void  ,
*p|  = v,
return   
)

◆ ATOMIC64_EMU_BIN() [5/7]

ATOMIC64_EMU_BIN ( store  ,
void  ,
p = v,
return   
)

◆ ATOMIC64_EMU_BIN() [6/7]

ATOMIC64_EMU_BIN ( subtract  ,
void  ,
*= *-  v,
return   
)

◆ ATOMIC64_EMU_BIN() [7/7]

ATOMIC64_EMU_BIN ( swap  ,
uint64_t  ,
tmp  = *p; *p=v;v=tmp,
return(v)   
)

◆ ATOMIC64_EMU_UN()

ATOMIC64_EMU_UN ( load  ,
uint64_t  ,
(tmp=*p)  ,
return(tmp)   
)

◆ atomic_cmpset_64()

int atomic_cmpset_64 ( volatile uint64_t *  p,
uint64_t  old,
uint64_t  new 
)

Definition at line 108 of file subr_atomic64.c.

References LOCK_A64, and UNLOCK_A64.

Referenced by smr_lazy_advance(), and trace_cmp().

Here is the caller graph for this function:

◆ atomic_fcmpset_64()

int atomic_fcmpset_64 ( volatile uint64_t *  p,
uint64_t *  old,
uint64_t  new 
)

Definition at line 121 of file subr_atomic64.c.

References LOCK_A64, and UNLOCK_A64.