Index: sh/include/atomic.h =================================================================== RCS file: /cvs/src/sys/arch/sh/include/atomic.h,v retrieving revision 1.5 diff -u -p -r1.5 atomic.h --- sh/include/atomic.h 29 Mar 2014 18:09:30 -0000 1.5 +++ sh/include/atomic.h 23 Sep 2014 23:18:53 -0000 @@ -9,26 +9,139 @@ #include -static __inline void +static inline unsigned int +__atomic_enter(void) +{ + unsigned int sr; + + asm volatile ("stc sr, %0" : "=r"(sr)); + asm volatile ("ldc %0, sr" : : "r"(sr | PSL_IMASK)); + + return (sr); +} + +static inline void +__atomic_leave(unsigned int sr) +{ + asm volatile ("ldc %0, sr" : : "r"(sr)); +} + +static inline unsigned int +_atomic_cas_word(volatile unsigned int *uip, unsigned int o, unsigned int n) +{ + unsigned int sr; + unsigned int rv; + + sr = __atomic_enter(); + rv = *uip; + if (rv == o) + *uip = n; + __atomic_leave(sr); + + return (rv); +} +#define atomic_cas_uint(_p, _o, _n) _atomic_cas_word((_p), (_o), (_n)) +#define atomic_cas_ulong(_p, _o, _n) _atomic_cas_word((_p), (_o), (_n)) + +static inline void * +_atomic_cas_ptr(volatile void *uip, void *o, void *n) +{ + unsigned int sr; + void * volatile *uipp = (void * volatile *)uip; + void *rv; + + sr = __atomic_enter(); + rv = *uipp; + if (rv == o) + *uipp = n; + __atomic_leave(sr); + + return (rv); +} +#define atomic_cas_ptr(_p, _o, _n) _atomic_cas_ptr((_p), (_o), (_n)) + +static inline unsigned int +_atomic_swap_word(volatile unsigned int *uip, unsigned int n) +{ + unsigned int sr; + unsigned int rv; + + sr = __atomic_enter(); + rv = *uip; + *uip = n; + __atomic_leave(sr); + + return (rv); +} +#define atomic_swap_uint(_p, _n) _atomic_swap_word((_p), (_n)) +#define atomic_swap_ulong(_p, _n) _atomic_swap_word((_p), (_n)) + +static inline void * +_atomic_swap_ptr(volatile void *uip, void *n) +{ + unsigned int sr; + void * volatile *uipp = (void * volatile *)uip; + void *rv; + + sr = __atomic_enter(); + rv = *uipp; + *uipp = n; + __atomic_leave(sr); + + return (rv); +} +#define atomic_swap_ptr(_p, _o, _n) _atomic_swap_ptr((_p), (_o), (_n)) + +static inline unsigned int +_atomic_add_word_nv(volatile unsigned int *uip, unsigned int v) +{ + unsigned int sr; + unsigned int rv; + + sr = __atomic_enter(); + rv = *uip + v; + *uip = rv; + __atomic_leave(sr); + + return (rv); +} +#define atomic_add_int_nv(_p, _v) _atomic_add_word_nv((_p), (_v)) +#define atomic_add_long_nv(_p, _v) _atomic_add_word_nv((_p), (_v)) + +static inline unsigned int +_atomic_sub_word_nv(volatile unsigned int *uip, unsigned int v) +{ + unsigned int sr; + unsigned int rv; + + sr = __atomic_enter(); + rv = *uip - v; + *uip = rv; + __atomic_leave(sr); + + return (rv); +} +#define atomic_sub_int_nv(_p, _v) _atomic_sub_word_nv((_p), (_v)) +#define atomic_sub_long_nv(_p, _v) _atomic_sub_word_nv((_p), (_v)) + +static inline void atomic_setbits_int(volatile unsigned int *uip, unsigned int v) { unsigned int sr; - __asm__ volatile ("stc sr, %0" : "=r"(sr)); - __asm__ volatile ("ldc %0, sr" : : "r"(sr | PSL_IMASK)); + sr = __atomic_enter(); *uip |= v; - __asm__ volatile ("ldc %0, sr" : : "r"(sr)); + __atomic_leave(sr); } -static __inline void +static inline void atomic_clearbits_int(volatile unsigned int *uip, unsigned int v) { unsigned int sr; - __asm__ volatile ("stc sr, %0" : "=r"(sr)); - __asm__ volatile ("ldc %0, sr" : : "r"(sr | PSL_IMASK)); + sr = __atomic_enter(); *uip &= ~v; - __asm__ volatile ("ldc %0, sr" : : "r"(sr)); + __atomic_leave(sr); } #endif /* defined(_KERNEL) */ Index: sparc/include/atomic.h =================================================================== RCS file: /cvs/src/sys/arch/sparc/include/atomic.h,v retrieving revision 1.6 diff -u -p -r1.6 atomic.h --- sparc/include/atomic.h 29 Mar 2014 18:09:30 -0000 1.6 +++ sparc/include/atomic.h 23 Sep 2014 23:18:53 -0000 @@ -9,7 +9,111 @@ #include -static __inline void +static inline unsigned int +_atomic_cas_word(volatile unsigned int *uip, unsigned int o, unsigned int n) +{ + int psr; + unsigned int rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uip; + if (rv == o) + *uip = n; + setpsr(psr); + + return (rv); +} +#define atomic_cas_uint(_p, _o, _n) _atomic_cas_word((_p), (_o), (_n)) +#define atomic_cas_ulong(_p, _o, _n) _atomic_cas_word((_p), (_o), (_n)) + +static inline void * +_atomic_cas_ptr(volatile void *uip, void *o, void *n) +{ + int psr; + void * volatile *uipp = (void * volatile *)uip; + void *rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uipp; + if (rv == o) + *uipp = n; + setpsr(psr); + + return (rv); +} +#define atomic_cas_ptr(_p, _o, _n) _atomic_cas_ptr((_p), (_o), (_n)) + +static inline unsigned int +_atomic_swap_word(volatile unsigned int *uip, unsigned int n) +{ + int psr; + unsigned int rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uip; + *uip = n; + setpsr(psr); + + return (rv); +} +#define atomic_swap_uint(_p, _n) _atomic_swap_word((_p), (_n)) +#define atomic_swap_ulong(_p, _n) _atomic_swap_word((_p), (_n)) + +static inline void * +_atomic_swap_ptr(volatile void *uip, void *n) +{ + int psr; + void * volatile *uipp = (void * volatile *)uip; + void *rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uipp; + *uipp = n; + setpsr(psr); + + return (rv); +} +#define atomic_swap_ptr(_p, _o, _n) _atomic_swap_ptr((_p), (_o), (_n)) + +static inline unsigned int +_atomic_add_word_nv(volatile unsigned int *uip, unsigned int v) +{ + int psr; + unsigned int rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uip + v; + *uip = rv; + setpsr(psr); + + return (rv); +} +#define atomic_add_int_nv(_p, _v) _atomic_add_word_nv((_p), (_v)) +#define atomic_add_long_nv(_p, _v) _atomic_add_word_nv((_p), (_v)) + +static inline unsigned int +_atomic_sub_word_nv(volatile unsigned int *uip, unsigned int v) +{ + int psr; + unsigned int rv; + + psr = getpsr(); + setpsr(psr | PSR_PIL); + rv = *uip - v; + *uip = rv; + setpsr(psr); + + return (rv); +} +#define atomic_sub_int_nv(_p, _v) _atomic_sub_word_nv((_p), (_v)) +#define atomic_sub_long_nv(_p, _v) _atomic_sub_word_nv((_p), (_v)) + +static inline void atomic_setbits_int(volatile unsigned int *uip, unsigned int v) { int psr; @@ -20,7 +124,7 @@ atomic_setbits_int(volatile unsigned int setpsr(psr); } -static __inline void +static inline void atomic_clearbits_int(volatile unsigned int *uip, unsigned int v) { int psr;