 34f2c0ac11
			
		
	
	
	34f2c0ac11
	
	
	
		
			
			Commitbd119c6923"Disintegrate asm/system.h for Tile" created the asm/switch_to.h file, but did not add an include of it to all its users. Also, commitb4816afa39"Move the asm-generic/system.h xchg() implementation to asm-generic/cmpxchg.h" introduced the concept of asm/cmpxchg.h but the tile arch never got one. Fork the cmpxchg content out of the asm/atomic.h file to create one. Acked-by: David Howells <dhowells@redhat.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * cmpxchg.h -- forked from asm/atomic.h with this copyright:
 | |
|  *
 | |
|  * Copyright 2010 Tilera Corporation. All Rights Reserved.
 | |
|  *
 | |
|  *   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, version 2.
 | |
|  *
 | |
|  *   This program is distributed in the hope that it will be useful, but
 | |
|  *   WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 | |
|  *   NON INFRINGEMENT.  See the GNU General Public License for
 | |
|  *   more details.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _ASM_TILE_CMPXCHG_H
 | |
| #define _ASM_TILE_CMPXCHG_H
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| 
 | |
| /* Nonexistent functions intended to cause link errors. */
 | |
| extern unsigned long __xchg_called_with_bad_pointer(void);
 | |
| extern unsigned long __cmpxchg_called_with_bad_pointer(void);
 | |
| 
 | |
| #define xchg(ptr, x)							\
 | |
| 	({								\
 | |
| 		typeof(*(ptr)) __x;					\
 | |
| 		switch (sizeof(*(ptr))) {				\
 | |
| 		case 4:							\
 | |
| 			__x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \
 | |
| 				(atomic_t *)(ptr),			\
 | |
| 				(u32)(typeof((x)-(x)))(x));		\
 | |
| 			break;						\
 | |
| 		case 8:							\
 | |
| 			__x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \
 | |
| 				(atomic64_t *)(ptr),			\
 | |
| 				(u64)(typeof((x)-(x)))(x));		\
 | |
| 			break;						\
 | |
| 		default:						\
 | |
| 			__xchg_called_with_bad_pointer();		\
 | |
| 		}							\
 | |
| 		__x;							\
 | |
| 	})
 | |
| 
 | |
| #define cmpxchg(ptr, o, n)						\
 | |
| 	({								\
 | |
| 		typeof(*(ptr)) __x;					\
 | |
| 		switch (sizeof(*(ptr))) {				\
 | |
| 		case 4:							\
 | |
| 			__x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \
 | |
| 				(atomic_t *)(ptr),			\
 | |
| 				(u32)(typeof((o)-(o)))(o),		\
 | |
| 				(u32)(typeof((n)-(n)))(n));		\
 | |
| 			break;						\
 | |
| 		case 8:							\
 | |
| 			__x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \
 | |
| 				(atomic64_t *)(ptr),			\
 | |
| 				(u64)(typeof((o)-(o)))(o),		\
 | |
| 				(u64)(typeof((n)-(n)))(n));		\
 | |
| 			break;						\
 | |
| 		default:						\
 | |
| 			__cmpxchg_called_with_bad_pointer();		\
 | |
| 		}							\
 | |
| 		__x;							\
 | |
| 	})
 | |
| 
 | |
| #define tas(ptr) (xchg((ptr), 1))
 | |
| 
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif /* _ASM_TILE_CMPXCHG_H */
 |