Fix for (1) power deadlock problem due to incorrect lock implementation. We now use...
[dyninst.git] / dyninstAPI_RT / src / RTthread-power-asm.s
1 #include "RTconst.h"
2 #include "../../dyninstAPI/src/inst-power.h"
3    .machine "push"      
4    .machine "ppc"       
5    .globl   DYNINSTthreadIndexFAST
6    .globl   .DYNINSTthreadIndexFAST
7 DYNINSTthreadIndexFAST:
8 .DYNINSTthreadIndexFAST:
9    mr       3,12
10    br
11    .globl   DYNINSTthreadContext
12    .globl   .DYNINSTthreadContext
13 DYNINSTthreadContext:
14 .DYNINSTthreadContext:
15    liu      3,0
16    oril     3,3,49152
17    l        4,0(3)
18    l        3,4(3)
19    cmpi     0,4,0
20    beq      DYNINSTthreadContext_NOT_SPR
21    mfspr    3,275
22 DYNINSTthreadContext_NOT_SPR:
23    br
24    .globl   DYNINSTthreadSelf
25    .globl   .DYNINSTthreadSelf
26 DYNINSTthreadSelf:
27 .DYNINSTthreadSelf:
28    liu      3,0
29    oril     3,3,49152
30    l        4,0(3)
31    l        3,4(3)
32    cmpi     0,4,0
33    beq      DYNINSTthreadSelf_NOT_SPR
34    mfspr    3,275
35 DYNINSTthreadSelf_NOT_SPR:
36    l        3,200(3)
37    br
38    .globl compare_and_swap2
39    .globl .compare_and_swap2
40 compare_and_swap2:
41 .compare_and_swap2:
42    lwarx    5,0,3
43    stwcx.   4,0,3
44    bne-     compare_and_swap2
45    mr       3,5
46    blr
47    .globl tc_lock_lock2
48    .globl .tc_lock_lock2
49 tc_lock_lock2:
50 .tc_lock_lock2:
51    mflr     0
52    stw      0,8(1)
53    mr       10,3      # &t in R10
54    bl       .dyn_pthread_self
55    cror     31,31,31
56    lil      6,1       # r6 == 1
57 tc_lock_lock_loop:
58    lwarx    4,0,10    # r4 == old value of mutex
59    stwcx.   6,0,10    # t->mutex = 1
60    bne-     tc_lock_lock_loop
61    cmpwi    4,1
62    bne-     tc_lock_lock_done
63 tc_lock_lock_failed:  # Someone else has the lock
64    l        5,4(10)   # r5 == old tid value
65         cmpw     5,3
66         bne     tc_lock_lock_loop       # Don't have lock, try again
67         lil     3,-2            # Already have lock, return error, -2 == DYNINST_DEAD_LOCK
68         b       tc_lock_lock_ret
69 tc_lock_lock_done:              # Need to record new tid, return
70         st      3,4(10)         # t->tid = pid
71         lil     3,0             # Return 0
72 tc_lock_lock_ret:
73    lwz 0,8(1)
74    mtlr 0
75    blr
76
77    .globl tc_lock_trylock
78    .globl .tc_lock_trylock
79 tc_lock_trylock:
80 .tc_lock_trylock:
81    mflr 0
82    stw  0,8(1)
83    mr   10,3            # &t in R10
84    bl   .DYNINSTthreadSelf
85    cror 31,31,31
86         lil     6,1             # r6 == 1
87 tc_lock_trylock_loop:
88         lwarx   4,0,10          # r4 == old value of mutex
89         stwcx.  6,0,10          # t->mutex = 1
90         bne-    tc_lock_trylock_loop
91         cmpwi   4,1
92         bne-    tc_lock_trylock_done
93 tc_lock_trylock_failed:         # Someone else has the lock
94         l       5,4(10)         # r5 == old tid value
95         cmpw    5,3
96         bne     tc_lock_trylock_live    # Don't have lock, try again
97         lil     3,-2                    # Already have lock, return error
98         b       tc_lock_trylock_ret
99 tc_lock_trylock_live:
100         lil     3,-1                    # Someone else has lock, LIVE_LOCK == -1
101         b       tc_lock_trylock_ret
102 tc_lock_trylock_done:           # Need to record new tid, return
103         st      3,4(10)         # t->tid = pid
104         lil     3,0             # Return 0
105 tc_lock_trylock_ret:
106    lwz 0,8(1)
107    mtlr 0
108    blr
109    .machine "pop"