OSDN Git Service

unused
[uclinux-h8/uClibc.git] / libpthread / linuxthreads / sysdeps / arm / pt-machine.h
1 /* Machine-dependent pthreads configuration and inline functions.
2    ARM version.
3    Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
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
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
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
15    Lesser General Public License for more details.
16
17    You should have received a copy of the GNU Lesser General Public
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
22 #ifndef _PT_MACHINE_H
23 #define _PT_MACHINE_H   1
24
25 #ifndef PT_EI
26 # define PT_EI extern inline
27 #endif
28
29 extern long int testandset (int *spinlock);
30 extern int __compare_and_swap (long int *p, long int oldval, long int newval);
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.  */
37 PT_EI long int
38 testandset (int *spinlock)
39 {
40   register unsigned int ret;
41
42 #if defined(__thumb__)
43   void *pc;
44   __asm__ __volatile__(
45         ".align 0\n"
46         "\tbx pc\n"
47         "\tnop\n"
48         "\t.arm\n"
49         "\tswp %0, %2, [%3]\n"
50         "\torr %1, pc, #1\n"
51         "\tbx %1\n"
52         "\t.force_thumb"
53         : "=r"(ret), "=r"(pc)
54         : "0"(1), "r"(spinlock));
55 #else
56   __asm__ __volatile__("swp %0, %1, [%2]"
57                        : "=r"(ret)
58                        : "0"(1), "r"(spinlock));
59 #endif
60
61   return ret;
62 }
63
64
65 /* Get some notion of the current stack.  Need not be exactly the top
66    of the stack, just something somewhere in the current frame.  */
67 #define CURRENT_STACK_FRAME  stack_pointer
68 register char * stack_pointer __asm__ ("sp");
69
70 #endif /* pt-machine.h */