linux/arch/sparc/lib/locks.S
<<
>>
Prefs
   1/*
   2 * locks.S: SMP low-level lock primitives on Sparc.
   3 *
   4 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
   5 * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
   6 * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
   7 */
   8
   9#include <asm/ptrace.h>
  10#include <asm/psr.h>
  11#include <asm/smp.h>
  12#include <asm/spinlock.h>
  13
  14        .text
  15        .align  4
  16
  17        /* Read/writer locks, as usual this is overly clever to make it
  18         * as fast as possible.
  19         */
  20
  21        /* caches... */
  22___rw_read_enter_spin_on_wlock:
  23        orcc    %g2, 0x0, %g0
  24        be,a    ___rw_read_enter
  25         ldstub [%g1 + 3], %g2
  26        b       ___rw_read_enter_spin_on_wlock
  27         ldub   [%g1 + 3], %g2
  28___rw_read_try_spin_on_wlock:
  29        andcc   %g2, 0xff, %g0
  30        be,a    ___rw_read_try
  31         ldstub [%g1 + 3], %g2
  32        xnorcc  %g2, 0x0, %o0   /* if g2 is ~0, set o0 to 0 and bugger off */
  33        bne,a   ___rw_read_enter_spin_on_wlock
  34         ld     [%g1], %g2
  35        retl
  36         mov    %g4, %o7
  37___rw_read_exit_spin_on_wlock:
  38        orcc    %g2, 0x0, %g0
  39        be,a    ___rw_read_exit
  40         ldstub [%g1 + 3], %g2
  41        b       ___rw_read_exit_spin_on_wlock
  42         ldub   [%g1 + 3], %g2
  43___rw_write_enter_spin_on_wlock:
  44        orcc    %g2, 0x0, %g0
  45        be,a    ___rw_write_enter
  46         ldstub [%g1 + 3], %g2
  47        b       ___rw_write_enter_spin_on_wlock
  48         ld     [%g1], %g2
  49
  50        .globl  ___rw_read_enter
  51___rw_read_enter:
  52        orcc    %g2, 0x0, %g0
  53        bne,a   ___rw_read_enter_spin_on_wlock
  54         ldub   [%g1 + 3], %g2
  55        ld      [%g1], %g2
  56        add     %g2, 1, %g2
  57        st      %g2, [%g1]
  58        retl
  59         mov    %g4, %o7
  60
  61        .globl  ___rw_read_exit
  62___rw_read_exit:
  63        orcc    %g2, 0x0, %g0
  64        bne,a   ___rw_read_exit_spin_on_wlock
  65         ldub   [%g1 + 3], %g2
  66        ld      [%g1], %g2
  67        sub     %g2, 0x1ff, %g2
  68        st      %g2, [%g1]
  69        retl
  70         mov    %g4, %o7
  71
  72        .globl  ___rw_read_try
  73___rw_read_try:
  74        orcc    %g2, 0x0, %g0
  75        bne     ___rw_read_try_spin_on_wlock
  76         ld     [%g1], %g2
  77        add     %g2, 1, %g2
  78        st      %g2, [%g1]
  79        set     1, %o1
  80        retl
  81         mov    %g4, %o7
  82
  83        .globl  ___rw_write_enter
  84___rw_write_enter:
  85        orcc    %g2, 0x0, %g0
  86        bne     ___rw_write_enter_spin_on_wlock
  87         ld     [%g1], %g2
  88        andncc  %g2, 0xff, %g0
  89        bne,a   ___rw_write_enter_spin_on_wlock
  90         stb    %g0, [%g1 + 3]
  91        retl
  92         mov    %g4, %o7
  93