1/* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $ 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_exit_spin_on_wlock: 29 orcc %g2, 0x0, %g0 30 be,a ___rw_read_exit 31 ldstub [%g1 + 3], %g2 32 b ___rw_read_exit_spin_on_wlock 33 ldub [%g1 + 3], %g2 34___rw_write_enter_spin_on_wlock: 35 orcc %g2, 0x0, %g0 36 be,a ___rw_write_enter 37 ldstub [%g1 + 3], %g2 38 b ___rw_write_enter_spin_on_wlock 39 ld [%g1], %g2 40 41 .globl ___rw_read_enter 42___rw_read_enter: 43 orcc %g2, 0x0, %g0 44 bne,a ___rw_read_enter_spin_on_wlock 45 ldub [%g1 + 3], %g2 46 ld [%g1], %g2 47 add %g2, 1, %g2 48 st %g2, [%g1] 49 retl 50 mov %g4, %o7 51 52 .globl ___rw_read_exit 53___rw_read_exit: 54 orcc %g2, 0x0, %g0 55 bne,a ___rw_read_exit_spin_on_wlock 56 ldub [%g1 + 3], %g2 57 ld [%g1], %g2 58 sub %g2, 0x1ff, %g2 59 st %g2, [%g1] 60 retl 61 mov %g4, %o7 62 63 .globl ___rw_write_enter 64___rw_write_enter: 65 orcc %g2, 0x0, %g0 66 bne ___rw_write_enter_spin_on_wlock 67 ld [%g1], %g2 68 andncc %g2, 0xff, %g0 69 bne,a ___rw_write_enter_spin_on_wlock 70 stb %g0, [%g1 + 3] 71 retl 72 mov %g4, %o7 73