diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-05-19 16:58:40 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-05-19 16:58:40 -0500 |
commit | b0e457a7589a0ee6b78ed676566c6410da371570 (patch) | |
tree | cd55d7894cce4434b21e386f22385bee902a3495 /src | |
parent | 37d92a552ef9afbef4095f2aff83587f5ebf204d (diff) | |
download | talos-hostboot-b0e457a7589a0ee6b78ed676566c6410da371570.tar.gz talos-hostboot-b0e457a7589a0ee6b78ed676566c6410da371570.zip |
Use GCC builtin for atomics for guard_acquire
Diffstat (limited to 'src')
-rw-r--r-- | src/libc++/builtins.C | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/libc++/builtins.C b/src/libc++/builtins.C index 70c9fcc35..ae046752e 100644 --- a/src/libc++/builtins.C +++ b/src/libc++/builtins.C @@ -5,7 +5,15 @@ extern "C" int __cxa_guard_acquire(volatile uint64_t* gv) // 0 -> uninitialized // 1 -> locked // 2 -> unlocked and initialized - + + uint32_t v = __sync_val_compare_and_swap((volatile uint32_t*)gv, 0, 1); + if (v == 0) + return 1; + if (v == 2) + return 0; + while(2 != *(volatile uint32_t*)gv); + return 0; +/* register volatile void* guard = gv; register uint32_t c = 0; @@ -27,13 +35,17 @@ extern "C" int __cxa_guard_acquire(volatile uint64_t* gv) } return (3 == c ? 1 : 0); // 3 means success in lock, return 1 (obtained) // 2 means initialized, return 0 +*/ } extern "C" void __cxa_guard_release(volatile uint64_t* gv) { + (*(volatile uint32_t*)gv) = 2; + /* register volatile void* guard = gv; register uint32_t c = 2; asm volatile("stw %0, 0(%1)" :: "r"(c) , "r" (guard): "memory"); + */ return; } |