mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 11:13:58 +08:00
126 lines
3.0 KiB
C
126 lines
3.0 KiB
C
|
/*
|
||
|
* Helpers used by both rw spinlocks and rw semaphores.
|
||
|
*
|
||
|
* Based in part on code from semaphore.h and
|
||
|
* spinlock.h Copyright 1996 Linus Torvalds.
|
||
|
*
|
||
|
* Copyright 1999 Red Hat, Inc.
|
||
|
*
|
||
|
* Written by Benjamin LaHaise.
|
||
|
*
|
||
|
* Modified by Matsushita Electric Industrial Co., Ltd.
|
||
|
* Modifications:
|
||
|
* 13-Nov-2006 MEI Temporarily delete lock functions for SMP support.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it
|
||
|
* under the terms of the GNU General Public License as published by the Free
|
||
|
* Software Foundation; either version 2 of the License, or (at your option)
|
||
|
* any later version.
|
||
|
*/
|
||
|
#ifndef _ASM_RWLOCK_H
|
||
|
#define _ASM_RWLOCK_H
|
||
|
|
||
|
#define RW_LOCK_BIAS 0x01000000
|
||
|
|
||
|
#ifndef CONFIG_SMP
|
||
|
|
||
|
typedef struct { unsigned long a[100]; } __dummy_lock_t;
|
||
|
#define __dummy_lock(lock) (*(__dummy_lock_t *)(lock))
|
||
|
|
||
|
#define RW_LOCK_BIAS_STR "0x01000000"
|
||
|
|
||
|
#define __build_read_lock_ptr(rw, helper) \
|
||
|
do { \
|
||
|
asm volatile( \
|
||
|
" mov (%0),d3 \n" \
|
||
|
" sub 1,d3 \n" \
|
||
|
" mov d3,(%0) \n" \
|
||
|
" blt 1f \n" \
|
||
|
" bra 2f \n" \
|
||
|
"1: jmp 3f \n" \
|
||
|
"2: \n" \
|
||
|
" .section .text.lock,\"ax\" \n" \
|
||
|
"3: call "helper"[],0 \n" \
|
||
|
" jmp 2b \n" \
|
||
|
" .previous" \
|
||
|
: \
|
||
|
: "d" (rw) \
|
||
|
: "memory", "d3", "cc"); \
|
||
|
} while (0)
|
||
|
|
||
|
#define __build_read_lock_const(rw, helper) \
|
||
|
do { \
|
||
|
asm volatile( \
|
||
|
" mov (%0),d3 \n" \
|
||
|
" sub 1,d3 \n" \
|
||
|
" mov d3,(%0) \n" \
|
||
|
" blt 1f \n" \
|
||
|
" bra 2f \n" \
|
||
|
"1: jmp 3f \n" \
|
||
|
"2: \n" \
|
||
|
" .section .text.lock,\"ax\" \n" \
|
||
|
"3: call "helper"[],0 \n" \
|
||
|
" jmp 2b \n" \
|
||
|
" .previous" \
|
||
|
: \
|
||
|
: "d" (rw) \
|
||
|
: "memory", "d3", "cc"); \
|
||
|
} while (0)
|
||
|
|
||
|
#define __build_read_lock(rw, helper) \
|
||
|
do { \
|
||
|
if (__builtin_constant_p(rw)) \
|
||
|
__build_read_lock_const(rw, helper); \
|
||
|
else \
|
||
|
__build_read_lock_ptr(rw, helper); \
|
||
|
} while (0)
|
||
|
|
||
|
#define __build_write_lock_ptr(rw, helper) \
|
||
|
do { \
|
||
|
asm volatile( \
|
||
|
" mov (%0),d3 \n" \
|
||
|
" sub 1,d3 \n" \
|
||
|
" mov d3,(%0) \n" \
|
||
|
" blt 1f \n" \
|
||
|
" bra 2f \n" \
|
||
|
"1: jmp 3f \n" \
|
||
|
"2: \n" \
|
||
|
" .section .text.lock,\"ax\" \n" \
|
||
|
"3: call "helper"[],0 \n" \
|
||
|
" jmp 2b \n" \
|
||
|
" .previous" \
|
||
|
: \
|
||
|
: "d" (rw) \
|
||
|
: "memory", "d3", "cc"); \
|
||
|
} while (0)
|
||
|
|
||
|
#define __build_write_lock_const(rw, helper) \
|
||
|
do { \
|
||
|
asm volatile( \
|
||
|
" mov (%0),d3 \n" \
|
||
|
" sub 1,d3 \n" \
|
||
|
" mov d3,(%0) \n" \
|
||
|
" blt 1f \n" \
|
||
|
" bra 2f \n" \
|
||
|
"1: jmp 3f \n" \
|
||
|
"2: \n" \
|
||
|
" .section .text.lock,\"ax\" \n" \
|
||
|
"3: call "helper"[],0 \n" \
|
||
|
" jmp 2b \n" \
|
||
|
" .previous" \
|
||
|
: \
|
||
|
: "d" (rw) \
|
||
|
: "memory", "d3", "cc"); \
|
||
|
} while (0)
|
||
|
|
||
|
#define __build_write_lock(rw, helper) \
|
||
|
do { \
|
||
|
if (__builtin_constant_p(rw)) \
|
||
|
__build_write_lock_const(rw, helper); \
|
||
|
else \
|
||
|
__build_write_lock_ptr(rw, helper); \
|
||
|
} while (0)
|
||
|
|
||
|
#endif /* CONFIG_SMP */
|
||
|
#endif /* _ASM_RWLOCK_H */
|