| /* |
| * 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 */ |