0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <asm/ptrace.h>
0011 #include <asm/psr.h>
0012 #include <asm/smp.h>
0013 #include <asm/spinlock.h>
0014 #include <asm/export.h>
0015
0016 .text
0017 .align 4
0018
0019
0020
0021
0022
0023
0024 ___rw_read_enter_spin_on_wlock:
0025 orcc %g2, 0x0, %g0
0026 be,a ___rw_read_enter
0027 ldstub [%g1 + 3], %g2
0028 b ___rw_read_enter_spin_on_wlock
0029 ldub [%g1 + 3], %g2
0030 ___rw_read_try_spin_on_wlock:
0031 andcc %g2, 0xff, %g0
0032 be,a ___rw_read_try
0033 ldstub [%g1 + 3], %g2
0034 xnorcc %g2, 0x0, %o0
0035 bne,a ___rw_read_enter_spin_on_wlock
0036 ld [%g1], %g2
0037 retl
0038 mov %g4, %o7
0039 ___rw_read_exit_spin_on_wlock:
0040 orcc %g2, 0x0, %g0
0041 be,a ___rw_read_exit
0042 ldstub [%g1 + 3], %g2
0043 b ___rw_read_exit_spin_on_wlock
0044 ldub [%g1 + 3], %g2
0045 ___rw_write_enter_spin_on_wlock:
0046 orcc %g2, 0x0, %g0
0047 be,a ___rw_write_enter
0048 ldstub [%g1 + 3], %g2
0049 b ___rw_write_enter_spin_on_wlock
0050 ld [%g1], %g2
0051
0052 .globl ___rw_read_enter
0053 EXPORT_SYMBOL(___rw_read_enter)
0054 ___rw_read_enter:
0055 orcc %g2, 0x0, %g0
0056 bne,a ___rw_read_enter_spin_on_wlock
0057 ldub [%g1 + 3], %g2
0058 ld [%g1], %g2
0059 add %g2, 1, %g2
0060 st %g2, [%g1]
0061 retl
0062 mov %g4, %o7
0063
0064 .globl ___rw_read_exit
0065 EXPORT_SYMBOL(___rw_read_exit)
0066 ___rw_read_exit:
0067 orcc %g2, 0x0, %g0
0068 bne,a ___rw_read_exit_spin_on_wlock
0069 ldub [%g1 + 3], %g2
0070 ld [%g1], %g2
0071 sub %g2, 0x1ff, %g2
0072 st %g2, [%g1]
0073 retl
0074 mov %g4, %o7
0075
0076 .globl ___rw_read_try
0077 EXPORT_SYMBOL(___rw_read_try)
0078 ___rw_read_try:
0079 orcc %g2, 0x0, %g0
0080 bne ___rw_read_try_spin_on_wlock
0081 ld [%g1], %g2
0082 add %g2, 1, %g2
0083 st %g2, [%g1]
0084 set 1, %o1
0085 retl
0086 mov %g4, %o7
0087
0088 .globl ___rw_write_enter
0089 EXPORT_SYMBOL(___rw_write_enter)
0090 ___rw_write_enter:
0091 orcc %g2, 0x0, %g0
0092 bne ___rw_write_enter_spin_on_wlock
0093 ld [%g1], %g2
0094 andncc %g2, 0xff, %g0
0095 bne,a ___rw_write_enter_spin_on_wlock
0096 stb %g0, [%g1 + 3]
0097 retl
0098 mov %g4, %o7