1/* $Id: rwsem.S,v 1.1.1.1 2007/08/03 18:52:17 Exp $ 2 * Assembly part of rw semaphores. 3 * 4 * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) 5 */ 6 7#include <asm/ptrace.h> 8#include <asm/psr.h> 9 10 .section .sched.text 11 .align 4 12 13 .globl ___down_read 14___down_read: 15 rd %psr, %g3 16 nop 17 nop 18 nop 19 or %g3, PSR_PIL, %g7 20 wr %g7, 0, %psr 21 nop 22 nop 23 nop 24#ifdef CONFIG_SMP 251: ldstub [%g1 + 4], %g7 26 tst %g7 27 bne 1b 28 ld [%g1], %g7 29 sub %g7, 1, %g7 30 st %g7, [%g1] 31 stb %g0, [%g1 + 4] 32#else 33 ld [%g1], %g7 34 sub %g7, 1, %g7 35 st %g7, [%g1] 36#endif 37 wr %g3, 0, %psr 38 add %g7, 1, %g7 39 nop 40 nop 41 subcc %g7, 1, %g7 42 bneg 3f 43 nop 442: jmpl %o7, %g0 45 mov %g4, %o7 463: save %sp, -64, %sp 47 mov %g1, %l1 48 mov %g4, %l4 49 bcs 4f 50 mov %g5, %l5 51 call down_read_failed 52 mov %l1, %o0 53 mov %l1, %g1 54 mov %l4, %g4 55 ba ___down_read 56 restore %l5, %g0, %g5 574: call down_read_failed_biased 58 mov %l1, %o0 59 mov %l1, %g1 60 mov %l4, %g4 61 ba 2b 62 restore %l5, %g0, %g5 63 64 .globl ___down_write 65___down_write: 66 rd %psr, %g3 67 nop 68 nop 69 nop 70 or %g3, PSR_PIL, %g7 71 wr %g7, 0, %psr 72 sethi %hi(0x01000000), %g2 73 nop 74 nop 75#ifdef CONFIG_SMP 761: ldstub [%g1 + 4], %g7 77 tst %g7 78 bne 1b 79 ld [%g1], %g7 80 sub %g7, %g2, %g7 81 st %g7, [%g1] 82 stb %g0, [%g1 + 4] 83#else 84 ld [%g1], %g7 85 sub %g7, %g2, %g7 86 st %g7, [%g1] 87#endif 88 wr %g3, 0, %psr 89 add %g7, %g2, %g7 90 nop 91 nop 92 subcc %g7, %g2, %g7 93 bne 3f 94 nop 952: jmpl %o7, %g0 96 mov %g4, %o7 973: save %sp, -64, %sp 98 mov %g1, %l1 99 mov %g4, %l4 100 bcs 4f 101 mov %g5, %l5 102 call down_write_failed 103 mov %l1, %o0 104 mov %l1, %g1 105 mov %l4, %g4 106 ba ___down_write 107 restore %l5, %g0, %g5 1084: call down_write_failed_biased 109 mov %l1, %o0 110 mov %l1, %g1 111 mov %l4, %g4 112 ba 2b 113 restore %l5, %g0, %g5 114 115 .text 116 .globl ___up_read 117___up_read: 118 rd %psr, %g3 119 nop 120 nop 121 nop 122 or %g3, PSR_PIL, %g7 123 wr %g7, 0, %psr 124 nop 125 nop 126 nop 127#ifdef CONFIG_SMP 1281: ldstub [%g1 + 4], %g7 129 tst %g7 130 bne 1b 131 ld [%g1], %g7 132 add %g7, 1, %g7 133 st %g7, [%g1] 134 stb %g0, [%g1 + 4] 135#else 136 ld [%g1], %g7 137 add %g7, 1, %g7 138 st %g7, [%g1] 139#endif 140 wr %g3, 0, %psr 141 nop 142 nop 143 nop 144 cmp %g7, 0 145 be 3f 146 nop 1472: jmpl %o7, %g0 148 mov %g4, %o7 1493: save %sp, -64, %sp 150 mov %g1, %l1 151 mov %g4, %l4 152 mov %g5, %l5 153 clr %o1 154 call __rwsem_wake 155 mov %l1, %o0 156 mov %l1, %g1 157 mov %l4, %g4 158 ba 2b 159 restore %l5, %g0, %g5 160 161 .globl ___up_write 162___up_write: 163 rd %psr, %g3 164 nop 165 nop 166 nop 167 or %g3, PSR_PIL, %g7 168 wr %g7, 0, %psr 169 sethi %hi(0x01000000), %g2 170 nop 171 nop 172#ifdef CONFIG_SMP 1731: ldstub [%g1 + 4], %g7 174 tst %g7 175 bne 1b 176 ld [%g1], %g7 177 add %g7, %g2, %g7 178 st %g7, [%g1] 179 stb %g0, [%g1 + 4] 180#else 181 ld [%g1], %g7 182 add %g7, %g2, %g7 183 st %g7, [%g1] 184#endif 185 wr %g3, 0, %psr 186 sub %g7, %g2, %g7 187 nop 188 nop 189 addcc %g7, %g2, %g7 190 bcs 3f 191 nop 1922: jmpl %o7, %g0 193 mov %g4, %o7 1943: save %sp, -64, %sp 195 mov %g1, %l1 196 mov %g4, %l4 197 mov %g5, %l5 198 mov %g7, %o1 199 call __rwsem_wake 200 mov %l1, %o0 201 mov %l1, %g1 202 mov %l4, %g4 203 ba 2b 204 restore %l5, %g0, %g5 205