diff options
author | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-03-16 08:54:38 +0000 |
---|---|---|
committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2008-03-16 08:54:38 +0000 |
commit | e0a7506f8ec11c1c524fe1d6b52781d168e988db (patch) | |
tree | 2dcf7858f0c7d236efe32db885baa9379358ec8a /libpthread/linuxthreads/sysdeps/avr32 | |
parent | e772b90e7e8190112a987f7c18c19a33766acfd0 (diff) | |
download | uClibc-alpine-e0a7506f8ec11c1c524fe1d6b52781d168e988db.tar.bz2 uClibc-alpine-e0a7506f8ec11c1c524fe1d6b52781d168e988db.tar.xz |
Merge nptl branch tree with trunk.
Step 7: merge linuxthreads and linuxthread.old folders
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/avr32')
-rw-r--r-- | libpthread/linuxthreads/sysdeps/avr32/pt-machine.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h b/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h new file mode 100644 index 000000000..903a7ed54 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h @@ -0,0 +1,73 @@ +/* Machine-dependent pthreads configuration and inline functions. + * + * Copyright (C) 2005-2007 Atmel Corporation + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file "COPYING.LIB" in the main directory of this + * archive for more details. + */ +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H 1 + +#include <features.h> + +#ifndef PT_EI +# define PT_EI __extern_always_inline +#endif + +static inline int +_test_and_set (int *p, int v) __THROW +{ + int result; + + __asm__ __volatile__( + "/* Inline test and set */\n" + " xchg %[old], %[mem], %[new]" + : [old] "=&r"(result) + : [mem] "r"(p), [new] "r"(v) + : "memory"); + + return result; +} + +extern long int testandset (int *spinlock); +extern int __compare_and_swap (long int *p, long int oldval, long int newval); + +/* Spinlock implementation; required. */ +PT_EI long int +testandset (int *spinlock) +{ + return _test_and_set(spinlock, 1); +} + + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#define CURRENT_STACK_FRAME stack_pointer +register char * stack_pointer __asm__ ("sp"); + +/* Compare-and-swap for semaphores. */ + +#define HAS_COMPARE_AND_SWAP +PT_EI int +__compare_and_swap(long int *p, long int oldval, long int newval) +{ + int result; + + __asm__ __volatile__( + "/* Inline compare and swap */\n" + "1: ssrf 5\n" + " ld.w %[result], %[mem]\n" + " eor %[result], %[old]\n" + " brne 2f\n" + " stcond %[mem], %[new]\n" + " brne 1b\n" + "2:" + : [result] "=&r"(result), [mem] "=m"(*p) + : "m"(*p), [new] "r"(newval), [old] "r"(oldval) + : "cc", "memory"); + + return result == 0; +} + +#endif /* pt-machine.h */ |