OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [sys/] [linux/] [linuxthreads/] [machine/] [i386/] [pt-machine.h] - Blame information for rev 345

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 207 jeremybenn
/* Machine-dependent pthreads configuration and inline functions.
2
   i386 version.
3
   Copyright (C) 1996,1997,1998,1999,2000,2001 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 Library General Public License as
9
   published by the Free Software Foundation; either version 2 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
   Library General Public License for more details.
16
 
17
   You should have received a copy of the GNU Library 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_EI
23
# define PT_EI extern inline
24
#endif
25
 
26
/* Get some notion of the current stack.  Need not be exactly the top
27
   of the stack, just something somewhere in the current frame.  */
28
#define CURRENT_STACK_FRAME  __builtin_frame_address (0)
29
 
30
 
31
/* Spinlock implementation; required.  */
32
PT_EI long int
33
testandset (int *spinlock)
34
{
35
  long int ret;
36
 
37
  __asm__ __volatile__(
38
       "xchgl %0, %1"
39
       : "=r"(ret), "=m"(*spinlock)
40
       : "0"(1), "m"(*spinlock)
41
       : "memory");
42
 
43
  return ret;
44
}
45
 
46
 
47
/* Compare-and-swap for semaphores.
48
   Available on the 486 and above, but not on the 386.
49
   We test dynamically whether it's available or not. */
50
 
51
#define HAS_COMPARE_AND_SWAP
52
#define TEST_FOR_COMPARE_AND_SWAP
53
 
54
PT_EI int
55
__compare_and_swap (long int *p, long int oldval, long int newval)
56
{
57
  char ret;
58
  long int readval;
59
 
60
  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
61
                        : "=q" (ret), "=m" (*p), "=a" (readval)
62
                        : "r" (newval), "m" (*p), "a" (oldval)
63
                        : "memory");
64
  return ret;
65
}
66
 
67
 
68
PT_EI int
69
get_eflags (void)
70
{
71
  int res;
72
  __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
73
  return res;
74
}
75
 
76
 
77
PT_EI void
78
set_eflags (int newflags)
79
{
80
  __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
81
}
82
 
83
 
84
PT_EI int
85
compare_and_swap_is_available (void)
86
{
87
  int oldflags = get_eflags ();
88
  int changed;
89
  /* Flip AC bit in EFLAGS.  */
90
  set_eflags (oldflags ^ 0x40000);
91
  /* See if bit changed.  */
92
  changed = (get_eflags () ^ oldflags) & 0x40000;
93
  /* Restore EFLAGS.  */
94
  set_eflags (oldflags);
95
  /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
96
     Otherwise, it's a 486 or above and it has cmpxchg.  */
97
  return changed != 0;
98
}

powered by: WebSVN 2.1.0

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