source: trunk/libs/newlib/src/libgloss/sparc_leon/asm-leon/spinlock.h @ 588

Last change on this file since 588 was 444, checked in by satin@…, 7 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.2 KB
Line 
1/*
2 * Copyright (c) 2011 Aeroflex Gaisler
3 *
4 * BSD license:
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25
26#ifndef _INCLUDE_LEONSPINLOCK_h
27#define _INCLUDE_LEONSPINLOCK_h
28
29typedef struct
30{
31  unsigned char lock;
32} raw_spinlock_t;
33
34#define __RAW_SPIN_LOCK_UNLOCKED        { 0 }
35
36typedef struct
37{
38  volatile unsigned int lock;
39} raw_rwlock_t;
40
41#define __RAW_RW_LOCK_UNLOCKED          { 0 }
42
43static inline void
44__raw_spin_lock (raw_spinlock_t * lock)
45{
46  __asm__ __volatile__ ("\n1:\n\t" "ldstuba     [%0]1, %%g2\n\t"        /* ASI_LEON23_DCACHE_MISS */
47                        "orcc   %%g2, 0x0, %%g0\n\t" "bne,a     2f\n\t" " ldub  [%0], %%g2\n\t" ".subsection    2\n" "2:\n\t" "orcc     %%g2, 0x0, %%g0\n\t" "bne,a     2b\n\t" " ldub  [%0], %%g2\n\t" "b,a    1b\n\t" ".previous\n":  /* no outputs */
48                        :"r" (lock):"g2", "memory", "cc");
49}
50
51static inline int
52__raw_spin_trylock (raw_spinlock_t * lock)
53{
54  unsigned int result;
55  __asm__ __volatile__ ("ldstuba [%1]1, %0"     /* ASI_LEON23_DCACHE_MISS */
56                        :"=r" (result):"r" (lock):"memory");
57  return (result == 0);
58}
59
60static inline void
61__raw_spin_unlock (raw_spinlock_t * lock)
62{
63  __asm__ __volatile__ ("stb %%g0, [%0]"::"r" (lock):"memory");
64}
65
66
67
68#endif /* _INCLUDE_LEONSPINLOCK_h */
69/* end of include file */
Note: See TracBrowser for help on using the repository browser.