1
0
mirror of https://github.com/golang/go synced 2024-11-25 18:27:56 -07:00

sync/atomic: trigger paging fault early on linux/arm

so that we don't need to traceback through __kuser_cmpxchg

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12869043
This commit is contained in:
Dmitriy Vyukov 2013-08-13 21:15:47 +04:00
parent 0a3cb7ece3
commit 66c58cea67

View File

@ -32,6 +32,9 @@ TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0
// Implement using kernel cas for portability. // Implement using kernel cas for portability.
TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-13 TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-13
MOVW addr+0(FP), R2 MOVW addr+0(FP), R2
// trigger potential paging fault here,
// because we don't know how to traceback through __kuser_cmpxchg
MOVW (R2), R0
MOVW old+4(FP), R0 MOVW old+4(FP), R0
casagain: casagain:
MOVW new+8(FP), R1 MOVW new+8(FP), R1
@ -102,6 +105,9 @@ TEXT cas64<>(SB),NOSPLIT,$0
TEXT kernelCAS64<>(SB),NOSPLIT,$0-21 TEXT kernelCAS64<>(SB),NOSPLIT,$0-21
// int (*__kuser_cmpxchg64_t)(const int64_t *oldval, const int64_t *newval, volatile int64_t *ptr); // int (*__kuser_cmpxchg64_t)(const int64_t *oldval, const int64_t *newval, volatile int64_t *ptr);
MOVW addr+0(FP), R2 // ptr MOVW addr+0(FP), R2 // ptr
// trigger potential paging fault here,
// because we don't know how to traceback through __kuser_cmpxchg64
MOVW (R2), R0
// make unaligned atomic access panic // make unaligned atomic access panic
AND.S $7, R2, R1 AND.S $7, R2, R1
BEQ 2(PC) BEQ 2(PC)