| /* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $ | |
| * Assembly part of rw semaphores. | |
| * | |
| * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) | |
| */ | |
| #include <asm/ptrace.h> | |
| #include <asm/psr.h> | |
| .section .sched.text | |
| .align 4 | |
| .globl ___down_read | |
| ___down_read: | |
| rd %psr, %g3 | |
| nop | |
| nop | |
| nop | |
| or %g3, PSR_PIL, %g7 | |
| wr %g7, 0, %psr | |
| nop | |
| nop | |
| nop | |
| #ifdef CONFIG_SMP | |
| 1: ldstub [%g1 + 4], %g7 | |
| tst %g7 | |
| bne 1b | |
| ld [%g1], %g7 | |
| sub %g7, 1, %g7 | |
| st %g7, [%g1] | |
| stb %g0, [%g1 + 4] | |
| #else | |
| ld [%g1], %g7 | |
| sub %g7, 1, %g7 | |
| st %g7, [%g1] | |
| #endif | |
| wr %g3, 0, %psr | |
| add %g7, 1, %g7 | |
| nop | |
| nop | |
| subcc %g7, 1, %g7 | |
| bneg 3f | |
| nop | |
| 2: jmpl %o7, %g0 | |
| mov %g4, %o7 | |
| 3: save %sp, -64, %sp | |
| mov %g1, %l1 | |
| mov %g4, %l4 | |
| bcs 4f | |
| mov %g5, %l5 | |
| call down_read_failed | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba ___down_read | |
| restore %l5, %g0, %g5 | |
| 4: call down_read_failed_biased | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba 2b | |
| restore %l5, %g0, %g5 | |
| .globl ___down_write | |
| ___down_write: | |
| rd %psr, %g3 | |
| nop | |
| nop | |
| nop | |
| or %g3, PSR_PIL, %g7 | |
| wr %g7, 0, %psr | |
| sethi %hi(0x01000000), %g2 | |
| nop | |
| nop | |
| #ifdef CONFIG_SMP | |
| 1: ldstub [%g1 + 4], %g7 | |
| tst %g7 | |
| bne 1b | |
| ld [%g1], %g7 | |
| sub %g7, %g2, %g7 | |
| st %g7, [%g1] | |
| stb %g0, [%g1 + 4] | |
| #else | |
| ld [%g1], %g7 | |
| sub %g7, %g2, %g7 | |
| st %g7, [%g1] | |
| #endif | |
| wr %g3, 0, %psr | |
| add %g7, %g2, %g7 | |
| nop | |
| nop | |
| subcc %g7, %g2, %g7 | |
| bne 3f | |
| nop | |
| 2: jmpl %o7, %g0 | |
| mov %g4, %o7 | |
| 3: save %sp, -64, %sp | |
| mov %g1, %l1 | |
| mov %g4, %l4 | |
| bcs 4f | |
| mov %g5, %l5 | |
| call down_write_failed | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba ___down_write | |
| restore %l5, %g0, %g5 | |
| 4: call down_write_failed_biased | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba 2b | |
| restore %l5, %g0, %g5 | |
| .text | |
| .globl ___up_read | |
| ___up_read: | |
| rd %psr, %g3 | |
| nop | |
| nop | |
| nop | |
| or %g3, PSR_PIL, %g7 | |
| wr %g7, 0, %psr | |
| nop | |
| nop | |
| nop | |
| #ifdef CONFIG_SMP | |
| 1: ldstub [%g1 + 4], %g7 | |
| tst %g7 | |
| bne 1b | |
| ld [%g1], %g7 | |
| add %g7, 1, %g7 | |
| st %g7, [%g1] | |
| stb %g0, [%g1 + 4] | |
| #else | |
| ld [%g1], %g7 | |
| add %g7, 1, %g7 | |
| st %g7, [%g1] | |
| #endif | |
| wr %g3, 0, %psr | |
| nop | |
| nop | |
| nop | |
| cmp %g7, 0 | |
| be 3f | |
| nop | |
| 2: jmpl %o7, %g0 | |
| mov %g4, %o7 | |
| 3: save %sp, -64, %sp | |
| mov %g1, %l1 | |
| mov %g4, %l4 | |
| mov %g5, %l5 | |
| clr %o1 | |
| call __rwsem_wake | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba 2b | |
| restore %l5, %g0, %g5 | |
| .globl ___up_write | |
| ___up_write: | |
| rd %psr, %g3 | |
| nop | |
| nop | |
| nop | |
| or %g3, PSR_PIL, %g7 | |
| wr %g7, 0, %psr | |
| sethi %hi(0x01000000), %g2 | |
| nop | |
| nop | |
| #ifdef CONFIG_SMP | |
| 1: ldstub [%g1 + 4], %g7 | |
| tst %g7 | |
| bne 1b | |
| ld [%g1], %g7 | |
| add %g7, %g2, %g7 | |
| st %g7, [%g1] | |
| stb %g0, [%g1 + 4] | |
| #else | |
| ld [%g1], %g7 | |
| add %g7, %g2, %g7 | |
| st %g7, [%g1] | |
| #endif | |
| wr %g3, 0, %psr | |
| sub %g7, %g2, %g7 | |
| nop | |
| nop | |
| addcc %g7, %g2, %g7 | |
| bcs 3f | |
| nop | |
| 2: jmpl %o7, %g0 | |
| mov %g4, %o7 | |
| 3: save %sp, -64, %sp | |
| mov %g1, %l1 | |
| mov %g4, %l4 | |
| mov %g5, %l5 | |
| mov %g7, %o1 | |
| call __rwsem_wake | |
| mov %l1, %o0 | |
| mov %l1, %g1 | |
| mov %l4, %g4 | |
| ba 2b | |
| restore %l5, %g0, %g5 |