]>
Commit | Line | Data |
---|---|---|
5afdca00 UD |
1 | /* Machine-dependent pthreads configuration and inline functions. |
2 | ARM version. | |
d347a4ab | 3 | Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. |
5afdca00 UD |
4 | This file is part of the GNU C Library. |
5 | Contributed by Philip Blundell <philb@gnu.org>. | |
6 | ||
7 | The GNU C Library is free software; you can redistribute it and/or | |
cc7375ce RM |
8 | modify it under the terms of the GNU Lesser General Public License as |
9 | published by the Free Software Foundation; either version 2.1 of the | |
5afdca00 UD |
10 | License, or (at your option) any later version. |
11 | ||
12 | The GNU C Library is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
cc7375ce | 15 | Lesser General Public License for more details. |
5afdca00 | 16 | |
cc7375ce | 17 | You should have received a copy of the GNU Lesser General Public |
5afdca00 UD |
18 | License along with the GNU C Library; see the file COPYING.LIB. If not, |
19 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, USA. */ | |
21 | ||
3fc2f6c8 UD |
22 | #ifndef _PT_MACHINE_H |
23 | #define _PT_MACHINE_H 1 | |
f68137c9 | 24 | |
9a29bc37 | 25 | #ifndef PT_EI |
d347a4ab | 26 | # define PT_EI extern inline __attribute__ ((always_inline)) |
9a29bc37 UD |
27 | #endif |
28 | ||
f68137c9 AJ |
29 | extern long int testandset (int *spinlock); |
30 | extern int __compare_and_swap (long int *p, long int oldval, long int newval); | |
5afdca00 UD |
31 | |
32 | /* This will not work on ARM1 or ARM2 because SWP is lacking on those | |
33 | machines. Unfortunately we have no way to detect this at compile | |
34 | time; let's hope nobody tries to use one. */ | |
35 | ||
36 | /* Spinlock implementation; required. */ | |
308afe5f | 37 | PT_EI long int |
5afdca00 UD |
38 | testandset (int *spinlock) |
39 | { | |
40 | register unsigned int ret; | |
41 | ||
42 | __asm__ __volatile__("swp %0, %1, [%2]" | |
43 | : "=r"(ret) | |
44 | : "0"(1), "r"(spinlock)); | |
45 | ||
46 | return ret; | |
47 | } | |
48 | ||
49 | ||
50 | /* Get some notion of the current stack. Need not be exactly the top | |
51 | of the stack, just something somewhere in the current frame. */ | |
52 | #define CURRENT_STACK_FRAME stack_pointer | |
53 | register char * stack_pointer __asm__ ("sp"); | |
3fc2f6c8 UD |
54 | |
55 | #endif /* pt-machine.h */ |