Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * locks.S: SMP low-level lock primitives on Sparc.
0004  *
0005  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
0006  * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
0007  * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
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     /* Read/writer locks, as usual this is overly clever to make it
0020      * as fast as possible.
0021      */
0022 
0023     /* caches... */
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   /* if g2 is ~0, set o0 to 0 and bugger off */
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