OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libpthread/] [linuxthreads/] [sysdeps/] [i386/] [pt-machine.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/* Machine-dependent pthreads configuration and inline functions.
2
   i386 version.
3
   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
4
   This file is part of the GNU C Library.
5
   Contributed by Richard Henderson <rth@tamu.edu>.
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 __ASSEMBLER__
26
#ifndef PT_EI
27
# define PT_EI extern inline
28
#endif
29
 
30
extern long int testandset (int *spinlock);
31
extern int __compare_and_swap (long int *p, long int oldval, long int newval);
32
 
33
/* Get some notion of the current stack.  Need not be exactly the top
34
   of the stack, just something somewhere in the current frame.  */
35
#define CURRENT_STACK_FRAME  __builtin_frame_address (0)
36
 
37
 
38
/* See if we can optimize for newer cpus... */
39
#if defined __GNUC__ && __GNUC__ >= 2 && defined __i486__ || defined __pentium__ || defined __pentiumpro__
40
 
41
/* Spinlock implementation; required.  */
42
PT_EI long int
43
testandset (int *spinlock)
44
{
45
  long int ret;
46
 
47
  __asm__ __volatile__ (
48
        "xchgl %0, %1"
49
        : "=r" (ret), "=m" (*spinlock)
50
        : "0" (1), "m" (*spinlock)
51
        : "memory");
52
 
53
  return ret;
54
}
55
 
56
/* Compare-and-swap for semaphores.  It's always available on i686.  */
57
#define HAS_COMPARE_AND_SWAP
58
 
59
PT_EI int
60
__compare_and_swap (long int *p, long int oldval, long int newval)
61
{
62
  char ret;
63
  long int readval;
64
 
65
  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
66
                        : "=q" (ret), "=m" (*p), "=a" (readval)
67
                        : "r" (newval), "m" (*p), "a" (oldval)
68
                        : "memory");
69
  return ret;
70
}
71
 
72
#if __ASSUME_LDT_WORKS > 0
73
#include "../useldt.h"
74
#endif
75
 
76
/* The P4 and above really want some help to prevent overheating.  */
77
#define BUSY_WAIT_NOP   __asm__ ("rep; nop")
78
 
79
 
80
#else /* Generic i386 implementation */
81
 
82
 
83
 
84
/* Spinlock implementation; required.  */
85
PT_EI long int
86
testandset (int *spinlock)
87
{
88
  long int ret;
89
 
90
  __asm__ __volatile__(
91
       "xchgl %0, %1"
92
       : "=r"(ret), "=m"(*spinlock)
93
       : "0"(1), "m"(*spinlock)
94
       : "memory");
95
 
96
  return ret;
97
}
98
 
99
 
100
/* Compare-and-swap for semaphores.
101
   Available on the 486 and above, but not on the 386.
102
   We test dynamically whether it's available or not. */
103
 
104
#define HAS_COMPARE_AND_SWAP
105
#define TEST_FOR_COMPARE_AND_SWAP
106
 
107
PT_EI int
108
__compare_and_swap (long int *p, long int oldval, long int newval)
109
{
110
  char ret;
111
  long int readval;
112
 
113
  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
114
                        : "=q" (ret), "=m" (*p), "=a" (readval)
115
                        : "r" (newval), "m" (*p), "a" (oldval)
116
                        : "memory");
117
  return ret;
118
}
119
 
120
 
121
PT_EI int
122
get_eflags (void)
123
{
124
  int res;
125
  __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
126
  return res;
127
}
128
 
129
 
130
PT_EI void
131
set_eflags (int newflags)
132
{
133
  __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
134
}
135
 
136
 
137
PT_EI int
138
compare_and_swap_is_available (void)
139
{
140
  int oldflags = get_eflags ();
141
  int changed;
142
  /* Flip AC bit in EFLAGS.  */
143
  set_eflags (oldflags ^ 0x40000);
144
  /* See if bit changed.  */
145
  changed = (get_eflags () ^ oldflags) & 0x40000;
146
  /* Restore EFLAGS.  */
147
  set_eflags (oldflags);
148
  /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
149
     Otherwise, it's a 486 or above and it has cmpxchg.  */
150
  return changed != 0;
151
}
152
#endif /* Generic i386 implementation */
153
 
154
#endif /* __ASSEMBLER__ */
155
 
156
#endif /* pt-machine.h */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.