1Chinese translated version of Documentation/arm/kernel_user_helpers.txt
2
3If you have any comment or update to the content, please contact the
4original document maintainer directly.  However, if you have a problem
5communicating in English you can also ask the Chinese maintainer for
6help.  Contact the Chinese maintainer if this translation is outdated
7or if there is a problem with the translation.
8
9Maintainer: Nicolas Pitre <nicolas.pitre@linaro.org>
10		Dave Martin <dave.martin@linaro.org>
11Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
12---------------------------------------------------------------------
13Documentation/arm/kernel_user_helpers.txt ���������������
14
15������������������������������������������������������������������������������������������������������
16������������������������������������������������������������������������������������������������������
17������������������������������������������������
18��������������������� Nicolas Pitre <nicolas.pitre@linaro.org>
19		Dave Martin <dave.martin@linaro.org>
20��������������������� ������ Fu Wei <tekkamanninja@gmail.com>
21��������������������� ������ Fu Wei <tekkamanninja@gmail.com>
22��������������������� ��������� Dongsheng Song <dongshneg.song@gmail.com>
23		������ Fu Wei <tekkamanninja@gmail.com>
24
25
26���������������
27---------------------------------------------------------------------
28���������������������������������������
29=========================
30
31������������������������������������������������������������������������������������������������������
32������������������������������������������������ ARM CPU ������������������������/���������������
33������������������������������������������������������������������������������������������������������
34���������������������������������������������������������������������������������������������������������
35��������������������������������������������� CPU ������������������������������������������������
36��������� SMP ������������������������������������������������������������������������������������
37���������������������������������������������������������������������������������������
38
39��������������������� VDSO ���������������������������������������������������������VDSO ���������
40���������������������������������������������������������������������������������������������������������
41��������������������������������������������������� VDSO ������������������������������������������
42������������������������������������������
43
44������������������������������������������������������������������������������������������������������
45��������������������������������������������������������������� ARM ���������������������������������
46������������������������������������������������������������������������������������������������������
47������������������������������������������������������������������������������������������������������
48������������������������������������������������������������������������������������������������������
49������������������������������������������������������������������������������
50
51������������������������������������������������������������������������������������������������������
52������������������������������������������������������������������������������������������������������
53������ __kuser_helper_version ������������������������������������������������������������
54���������������������������������������������������������������������������������������������������������
55���������������
56
57kuser_helper_version
58--------------------
59
60������:	0xffff0ffc
61
62������������:
63
64  extern int32_t __kuser_helper_version;
65
66������:
67
68  ���������������������������������������������������������������������������������������������������
69  ������������������������������������������������������������
70
71������������:
72
73#define __kuser_helper_version (*(int32_t *)0xffff0ffc)
74
75void check_kuser_version(void)
76{
77	if (__kuser_helper_version < 2) {
78		fprintf(stderr, "can't do atomic operations, kernel too old\n");
79		abort();
80	}
81}
82
83������:
84
85  ������������������������������������������������������������������������������������������������
86  ���������������������������������������������������������������������������������������
87
88kuser_get_tls
89-------------
90
91������:	0xffff0fe0
92
93������������:
94
95  void * __kuser_get_tls(void);
96
97������:
98
99  lr = ������������
100
101������:
102
103  r0 = TLS ���
104
105���������������������:
106
107  ���
108
109������:
110
111  ������������������ __ARM_NR_set_tls ��������������������� TLS ������
112
113������������:
114
115typedef void * (__kuser_get_tls_t)(void);
116#define __kuser_get_tls (*(__kuser_get_tls_t *)0xffff0fe0)
117
118void foo()
119{
120	void *tls = __kuser_get_tls();
121	printf("TLS = %p\n", tls);
122}
123
124������:
125
126  - ������ __kuser_helper_version >= 1 ���������������������������
127    ������������������ 2.6.12 ������������
128
129kuser_cmpxchg
130-------------
131
132������:	0xffff0fc0
133
134������������:
135
136  int __kuser_cmpxchg(int32_t oldval, int32_t newval, volatile int32_t *ptr);
137
138������:
139
140  r0 = oldval
141  r1 = newval
142  r2 = ptr
143  lr = ������������
144
145������:
146
147  r0 = ������������ (������������)
148  C flag = ������ r0 == 0 ������ 1��������� r0 != 0 ������������
149
150���������������������:
151
152  r3, ip, flags
153
154������:
155
156  ������ *ptr ��� oldval ��������������� newval ��� *ptr ������
157  ������ *ptr ������������������������������������������������������
158  ������ *ptr ��������������� C flag ������������ 1������������������������������������
159  ���������
160
161������������:
162
163typedef int (__kuser_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
164#define __kuser_cmpxchg (*(__kuser_cmpxchg_t *)0xffff0fc0)
165
166int atomic_add(volatile int *ptr, int val)
167{
168	int old, new;
169
170	do {
171		old = *ptr;
172		new = old + val;
173	} while(__kuser_cmpxchg(old, new, ptr));
174
175	return new;
176}
177
178������:
179
180  - ���������������������������������������������������
181
182  - ������ __kuser_helper_version >= 2 ���������������������������
183    ������������������ 2.6.12 ������������
184
185kuser_memory_barrier
186--------------------
187
188������:	0xffff0fa0
189
190������������:
191
192  void __kuser_memory_barrier(void);
193
194������:
195
196  lr = ������������
197
198������:
199
200  ���
201
202���������������������:
203
204  ���
205
206������:
207
208  ���������������������������������������������������������������������������������������������
209  __kuser_cmpxchg ������
210
211������������:
212
213typedef void (__kuser_dmb_t)(void);
214#define __kuser_dmb (*(__kuser_dmb_t *)0xffff0fa0)
215
216������:
217
218  - ������ __kuser_helper_version >= 3 ���������������������������
219    ������������������ 2.6.15 ������������
220
221kuser_cmpxchg64
222---------------
223
224������:	0xffff0f60
225
226������������:
227
228  int __kuser_cmpxchg64(const int64_t *oldval,
229                        const int64_t *newval,
230                        volatile int64_t *ptr);
231
232������:
233
234  r0 = ������ oldval
235  r1 = ������ newval
236  r2 = ���������������
237  lr = ������������
238
239������:
240
241  r0 = ������������ (������������)
242  C flag = ������ r0 == 0 ������ 1��������� r0 != 0 ������������
243
244���������������������:
245
246  r3, lr, flags
247
248������:
249
250  ������ *ptr ������ *oldval ��������� 64 ������������������������ *newval
251  ��������� 64 ��������� *ptr ������������ *ptr ���������������������������������
252  ���������������������
253
254  ������ *ptr ��������������� C flag ������������ 1������������������������������������
255  ���������
256
257������������:
258
259typedef int (__kuser_cmpxchg64_t)(const int64_t *oldval,
260                                  const int64_t *newval,
261                                  volatile int64_t *ptr);
262#define __kuser_cmpxchg64 (*(__kuser_cmpxchg64_t *)0xffff0f60)
263
264int64_t atomic_add64(volatile int64_t *ptr, int64_t val)
265{
266	int64_t old, new;
267
268	do {
269		old = *ptr;
270		new = old + val;
271	} while(__kuser_cmpxchg64(&old, &new, ptr));
272
273	return new;
274}
275
276������:
277
278  - ���������������������������������������������������
279
280  - ��������������������������������������������������������� 2 ������������ kuser ���������������
281    ������ 0xffff0f80 ���������������������������������
282
283  - ������ __kuser_helper_version >= 5 ���������������������������
284    ������������������ 3.1 ������������
285