| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | /* 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#endifstatic 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 inttestandset (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_pointerregister char * stack_pointer __asm__ ("sp");/* Compare-and-swap for semaphores. */#define HAS_COMPARE_AND_SWAPPT_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 */
 |