Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
This commit is contained in:
262
include/asm-arm/locks.h
Normal file
262
include/asm-arm/locks.h
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
* linux/include/asm-arm/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
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
|
||||
#define __down_op(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" sub lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movmi ip, %0\n" \
|
||||
" blmi " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __down_op_ret(ptr,fail) \
|
||||
({ \
|
||||
unsigned int ret; \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_ret\n" \
|
||||
"1: ldrex lr, [%1]\n" \
|
||||
" sub lr, lr, %2\n" \
|
||||
" strex ip, lr, [%1]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movmi ip, %1\n" \
|
||||
" movpl ip, #0\n" \
|
||||
" blmi " #fail "\n" \
|
||||
" mov %0, ip" \
|
||||
: "=&r" (ret) \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#define __up_op(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" add lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movle ip, %0\n" \
|
||||
" blle " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* 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_write\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" sub lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" movne ip, %0\n" \
|
||||
" blne " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __up_op_write(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" add lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" movcs ip, %0\n" \
|
||||
" blcs " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __down_op_read(ptr,fail) \
|
||||
__down_op(ptr, fail)
|
||||
|
||||
#define __up_op_read(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
"1: ldrex lr, [%0]\n" \
|
||||
" add lr, lr, %1\n" \
|
||||
" strex ip, lr, [%0]\n" \
|
||||
" teq ip, #0\n" \
|
||||
" bne 1b\n" \
|
||||
" teq lr, #0\n" \
|
||||
" moveq ip, %0\n" \
|
||||
" bleq " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
#define __down_op(ptr,fail) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" subs lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movmi ip, %0\n" \
|
||||
" blmi " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __down_op_ret(ptr,fail) \
|
||||
({ \
|
||||
unsigned int ret; \
|
||||
__asm__ __volatile__( \
|
||||
"@ down_op_ret\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%1]\n" \
|
||||
" subs lr, lr, %2\n" \
|
||||
" str lr, [%1]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movmi ip, %1\n" \
|
||||
" movpl ip, #0\n" \
|
||||
" blmi " #fail "\n" \
|
||||
" mov %0, ip" \
|
||||
: "=&r" (ret) \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#define __up_op(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movle ip, %0\n" \
|
||||
" blle " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
/*
|
||||
* 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_write\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" subs lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movne ip, %0\n" \
|
||||
" blne " #fail \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __up_op_write(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" movcs ip, %0\n" \
|
||||
" blcs " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (RW_LOCK_BIAS) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#define __down_op_read(ptr,fail) \
|
||||
__down_op(ptr, fail)
|
||||
|
||||
#define __up_op_read(ptr,wake) \
|
||||
({ \
|
||||
__asm__ __volatile__( \
|
||||
"@ up_op_read\n" \
|
||||
" mrs ip, cpsr\n" \
|
||||
" orr lr, ip, #128\n" \
|
||||
" msr cpsr_c, lr\n" \
|
||||
" ldr lr, [%0]\n" \
|
||||
" adds lr, lr, %1\n" \
|
||||
" str lr, [%0]\n" \
|
||||
" msr cpsr_c, ip\n" \
|
||||
" moveq ip, %0\n" \
|
||||
" bleq " #wake \
|
||||
: \
|
||||
: "r" (ptr), "I" (1) \
|
||||
: "ip", "lr", "cc", "memory"); \
|
||||
})
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user