mirror of
https://github.com/golang/go
synced 2024-11-25 20:27:57 -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:
parent
0a3cb7ece3
commit
66c58cea67
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user