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