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