| Mikael Starvik | 51533b6 | 2005-07-27 11:44:44 -0700 | [diff] [blame] | 1 | #ifndef _ASM_CRIS_ARCH_SYSTEM_H | 
 | 2 | #define _ASM_CRIS_ARCH_SYSTEM_H | 
 | 3 |  | 
| Mikael Starvik | 51533b6 | 2005-07-27 11:44:44 -0700 | [diff] [blame] | 4 |  | 
 | 5 | /* Read the CPU version register. */ | 
| Adrian Bunk | d9b5444 | 2005-11-07 00:58:44 -0800 | [diff] [blame] | 6 | static inline unsigned long rdvr(void) | 
| Mikael Starvik | 51533b6 | 2005-07-27 11:44:44 -0700 | [diff] [blame] | 7 | { | 
 | 8 | 	unsigned char vr; | 
 | 9 |  | 
 | 10 | 	__asm__ __volatile__ ("move $vr, %0" : "=rm" (vr)); | 
 | 11 | 	return vr; | 
 | 12 | } | 
 | 13 |  | 
 | 14 | #define cris_machine_name "crisv32" | 
 | 15 |  | 
 | 16 | /* Read the user-mode stack pointer. */ | 
| Adrian Bunk | d9b5444 | 2005-11-07 00:58:44 -0800 | [diff] [blame] | 17 | static inline unsigned long rdusp(void) | 
| Mikael Starvik | 51533b6 | 2005-07-27 11:44:44 -0700 | [diff] [blame] | 18 | { | 
 | 19 | 	unsigned long usp; | 
 | 20 |  | 
 | 21 | 	__asm__ __volatile__ ("move $usp, %0" : "=rm" (usp)); | 
 | 22 | 	return usp; | 
 | 23 | } | 
 | 24 |  | 
 | 25 | /* Read the current stack pointer. */ | 
| Adrian Bunk | d9b5444 | 2005-11-07 00:58:44 -0800 | [diff] [blame] | 26 | static inline unsigned long rdsp(void) | 
| Mikael Starvik | 51533b6 | 2005-07-27 11:44:44 -0700 | [diff] [blame] | 27 | { | 
 | 28 | 	unsigned long sp; | 
 | 29 |  | 
 | 30 | 	__asm__ __volatile__ ("move.d $sp, %0" : "=rm" (sp)); | 
 | 31 | 	return sp; | 
 | 32 | } | 
 | 33 |  | 
 | 34 | /* Write the user-mode stack pointer. */ | 
 | 35 | #define wrusp(usp) __asm__ __volatile__ ("move %0, $usp" : : "rm" (usp)) | 
 | 36 |  | 
 | 37 | #define nop() __asm__ __volatile__ ("nop"); | 
 | 38 |  | 
 | 39 | #define xchg(ptr,x) \ | 
 | 40 | 	((__typeof__(*(ptr)))__xchg((unsigned long) (x),(ptr),sizeof(*(ptr)))) | 
 | 41 |  | 
 | 42 | #define tas(ptr) (xchg((ptr),1)) | 
 | 43 |  | 
 | 44 | struct __xchg_dummy { unsigned long a[100]; }; | 
 | 45 | #define __xg(x) ((struct __xchg_dummy *)(x)) | 
 | 46 |  | 
 | 47 | /* Used for interrupt control. */ | 
 | 48 | #define local_save_flags(x) \ | 
 | 49 | 	__asm__ __volatile__ ("move $ccs, %0" : "=rm" (x) : : "memory"); | 
 | 50 |  | 
 | 51 | #define local_irq_restore(x) \ | 
 | 52 | 	__asm__ __volatile__ ("move %0, $ccs" : : "rm" (x) : "memory"); | 
 | 53 |  | 
 | 54 | #define local_irq_disable()  __asm__ __volatile__ ("di" : : : "memory"); | 
 | 55 | #define local_irq_enable()   __asm__ __volatile__ ("ei" : : : "memory"); | 
 | 56 |  | 
 | 57 | #define irqs_disabled()		\ | 
 | 58 | ({				\ | 
 | 59 | 	unsigned long flags;	\ | 
 | 60 | 				\ | 
 | 61 | 	local_save_flags(flags);\ | 
 | 62 | 	!(flags & (1 << I_CCS_BITNR));	\ | 
 | 63 | }) | 
 | 64 |  | 
 | 65 | /* Used for spinlocks, etc. */ | 
 | 66 | #define local_irq_save(x) \ | 
 | 67 | 	__asm__ __volatile__ ("move $ccs, %0\n\tdi" : "=rm" (x) : : "memory"); | 
 | 68 |  | 
 | 69 | #ifdef CONFIG_SMP | 
 | 70 | typedef struct { | 
 | 71 | 	volatile unsigned int lock __attribute__ ((aligned(4))); | 
 | 72 | #ifdef CONFIG_PREEMPT | 
 | 73 | 	unsigned int break_lock; | 
 | 74 | #endif | 
 | 75 | } spinlock_t; | 
 | 76 | #endif | 
 | 77 |  | 
 | 78 | #endif /* _ASM_CRIS_ARCH_SYSTEM_H */ |