locks.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
- /*
- * linux/include/asm-arm/proc-armv/locks.h
- *
- * Copyright (C) 2000 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Interrupt safe locking assembler.
- */
- #ifndef __ASM_PROC_LOCKS_H
- #define __ASM_PROC_LOCKS_H
- #define __down_op(ptr,fail)
- ({
- __asm__ __volatile__(
- "@ down_opn"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%0]n"
- " subs lr, lr, %1n"
- " str lr, [%0]n"
- " msr cpsr_c, ipn"
- " movmi ip, %0n"
- " blmi " SYMBOL_NAME_STR(fail)
- :
- : "r" (ptr), "I" (1)
- : "ip", "lr", "cc");
- })
- #define __down_op_ret(ptr,fail)
- ({
- unsigned int ret;
- __asm__ __volatile__(
- "@ down_op_retn"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%1]n"
- " subs lr, lr, %2n"
- " str lr, [%1]n"
- " msr cpsr_c, ipn"
- " movmi ip, %1n"
- " movpl ip, #0n"
- " blmi " SYMBOL_NAME_STR(fail) "n"
- " mov %0, ip"
- : "=&r" (ret)
- : "r" (ptr), "I" (1)
- : "ip", "lr", "cc");
- ret;
- })
- #define __up_op(ptr,wake)
- ({
- __asm__ __volatile__(
- "@ up_opn"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%0]n"
- " adds lr, lr, %1n"
- " str lr, [%0]n"
- " msr cpsr_c, ipn"
- " movle ip, %0n"
- " blle " SYMBOL_NAME_STR(wake)
- :
- : "r" (ptr), "I" (1)
- : "ip", "lr", "cc");
- })
- /*
- * The value 0x01000000 supports up to 128 processors and
- * lots of processes. BIAS must be chosen such that sub'ing
- * BIAS once per CPU will result in the long remaining
- * negative.
- */
- #define RW_LOCK_BIAS 0x01000000
- #define RW_LOCK_BIAS_STR "0x01000000"
- #define __down_op_write(ptr,fail)
- ({
- __asm__ __volatile__(
- "@ down_op_writen"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%0]n"
- " subs lr, lr, %1n"
- " str lr, [%0]n"
- " msr cpsr_c, ipn"
- " movne ip, %0n"
- " blne " SYMBOL_NAME_STR(fail)
- :
- : "r" (ptr), "I" (RW_LOCK_BIAS)
- : "ip", "lr", "cc");
- })
- #define __up_op_write(ptr,wake)
- ({
- __asm__ __volatile__(
- "@ up_op_readn"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%0]n"
- " adds lr, lr, %1n"
- " str lr, [%0]n"
- " msr cpsr_c, ipn"
- " movcs ip, %0n"
- " blcs " SYMBOL_NAME_STR(wake)
- :
- : "r" (ptr), "I" (RW_LOCK_BIAS)
- : "ip", "lr", "cc");
- })
- #define __down_op_read(ptr,fail)
- __down_op(ptr, fail)
- #define __up_op_read(ptr,wake)
- ({
- __asm__ __volatile__(
- "@ up_op_readn"
- " mrs ip, cpsrn"
- " orr lr, ip, #128n"
- " msr cpsr_c, lrn"
- " ldr lr, [%0]n"
- " adds lr, lr, %1n"
- " str lr, [%0]n"
- " msr cpsr_c, ipn"
- " moveq ip, %0n"
- " bleq " SYMBOL_NAME_STR(wake)
- :
- : "r" (ptr), "I" (1)
- : "ip", "lr", "cc");
- })
- #endif