/branches/arm/kernel/arch/arm32/include/atomic.h |
---|
1,5 → 1,5 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
53,8 → 53,24 |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
/* TODO */ |
return (val->count += i); |
int ret; |
volatile long * mem = &(val->count); |
asm volatile ( |
"1: \n" |
"ldr r2, [%1] \n" |
"add r3, r2, %2 \n" |
"str r3, %0 \n" |
"swp r3, r3, [%1] \n" |
"cmp r3, r2 \n" |
"bne 1b \n" |
: "=m" (ret) |
: "r" (mem), "r" (i) |
: "r3", "r2" |
); |
return ret; |
} |
#endif |