Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rwlock.h
Go to the documentation of this file.
1 /*
2  * Helpers used by both rw spinlocks and rw semaphores.
3  *
4  * Based in part on code from semaphore.h and
5  * spinlock.h Copyright 1996 Linus Torvalds.
6  *
7  * Copyright 1999 Red Hat, Inc.
8  *
9  * Written by Benjamin LaHaise.
10  *
11  * Modified by Matsushita Electric Industrial Co., Ltd.
12  * Modifications:
13  * 13-Nov-2006 MEI Temporarily delete lock functions for SMP support.
14  *
15  * This program is free software; you can redistribute it and/or modify it
16  * under the terms of the GNU General Public License as published by the Free
17  * Software Foundation; either version 2 of the License, or (at your option)
18  * any later version.
19  */
20 #ifndef _ASM_RWLOCK_H
21 #define _ASM_RWLOCK_H
22 
23 #define RW_LOCK_BIAS 0x01000000
24 
25 #ifndef CONFIG_SMP
26 
27 typedef struct { unsigned long a[100]; } __dummy_lock_t;
28 #define __dummy_lock(lock) (*(__dummy_lock_t *)(lock))
29 
30 #define RW_LOCK_BIAS_STR "0x01000000"
31 
32 #define __build_read_lock_ptr(rw, helper) \
33  do { \
34  asm volatile( \
35  " mov (%0),d3 \n" \
36  " sub 1,d3 \n" \
37  " mov d3,(%0) \n" \
38  " blt 1f \n" \
39  " bra 2f \n" \
40  "1: jmp 3f \n" \
41  "2: \n" \
42  " .section .text.lock,\"ax\" \n" \
43  "3: call "helper"[],0 \n" \
44  " jmp 2b \n" \
45  " .previous" \
46  : \
47  : "d" (rw) \
48  : "memory", "d3", "cc"); \
49  } while (0)
50 
51 #define __build_read_lock_const(rw, helper) \
52  do { \
53  asm volatile( \
54  " mov (%0),d3 \n" \
55  " sub 1,d3 \n" \
56  " mov d3,(%0) \n" \
57  " blt 1f \n" \
58  " bra 2f \n" \
59  "1: jmp 3f \n" \
60  "2: \n" \
61  " .section .text.lock,\"ax\" \n" \
62  "3: call "helper"[],0 \n" \
63  " jmp 2b \n" \
64  " .previous" \
65  : \
66  : "d" (rw) \
67  : "memory", "d3", "cc"); \
68  } while (0)
69 
70 #define __build_read_lock(rw, helper) \
71  do { \
72  if (__builtin_constant_p(rw)) \
73  __build_read_lock_const(rw, helper); \
74  else \
75  __build_read_lock_ptr(rw, helper); \
76  } while (0)
77 
78 #define __build_write_lock_ptr(rw, helper) \
79  do { \
80  asm volatile( \
81  " mov (%0),d3 \n" \
82  " sub 1,d3 \n" \
83  " mov d3,(%0) \n" \
84  " blt 1f \n" \
85  " bra 2f \n" \
86  "1: jmp 3f \n" \
87  "2: \n" \
88  " .section .text.lock,\"ax\" \n" \
89  "3: call "helper"[],0 \n" \
90  " jmp 2b \n" \
91  " .previous" \
92  : \
93  : "d" (rw) \
94  : "memory", "d3", "cc"); \
95  } while (0)
96 
97 #define __build_write_lock_const(rw, helper) \
98  do { \
99  asm volatile( \
100  " mov (%0),d3 \n" \
101  " sub 1,d3 \n" \
102  " mov d3,(%0) \n" \
103  " blt 1f \n" \
104  " bra 2f \n" \
105  "1: jmp 3f \n" \
106  "2: \n" \
107  " .section .text.lock,\"ax\" \n" \
108  "3: call "helper"[],0 \n" \
109  " jmp 2b \n" \
110  " .previous" \
111  : \
112  : "d" (rw) \
113  : "memory", "d3", "cc"); \
114  } while (0)
115 
116 #define __build_write_lock(rw, helper) \
117  do { \
118  if (__builtin_constant_p(rw)) \
119  __build_write_lock_const(rw, helper); \
120  else \
121  __build_write_lock_ptr(rw, helper); \
122  } while (0)
123 
124 #endif /* CONFIG_SMP */
125 #endif /* _ASM_RWLOCK_H */