diff options
Diffstat (limited to 'arch/mn10300/include/asm/rwlock.h')
-rw-r--r-- | arch/mn10300/include/asm/rwlock.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/arch/mn10300/include/asm/rwlock.h b/arch/mn10300/include/asm/rwlock.h new file mode 100644 index 000000000000..6d594d4a0e10 --- /dev/null +++ b/arch/mn10300/include/asm/rwlock.h | |||
@@ -0,0 +1,125 @@ | |||
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 */ | ||