| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * include/asm-v850/system.h -- Low-level interrupt/thread ops | 
 | 3 |  * | 
 | 4 |  *  Copyright (C) 2001,02,03  NEC Electronics Corporation | 
 | 5 |  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org> | 
 | 6 |  * | 
 | 7 |  * This file is subject to the terms and conditions of the GNU General | 
 | 8 |  * Public License.  See the file COPYING in the main directory of this | 
 | 9 |  * archive for more details. | 
 | 10 |  * | 
 | 11 |  * Written by Miles Bader <miles@gnu.org> | 
 | 12 |  */ | 
 | 13 |  | 
 | 14 | #ifndef __V850_SYSTEM_H__ | 
 | 15 | #define __V850_SYSTEM_H__ | 
 | 16 |  | 
 | 17 | #include <linux/linkage.h> | 
 | 18 | #include <asm/ptrace.h> | 
 | 19 |  | 
 | 20 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 21 | /* | 
 | 22 |  * switch_to(n) should switch tasks to task ptr, first checking that | 
 | 23 |  * ptr isn't the current task, in which case it does nothing. | 
 | 24 |  */ | 
 | 25 | struct thread_struct; | 
 | 26 | extern void *switch_thread (struct thread_struct *last, | 
 | 27 | 			    struct thread_struct *next); | 
 | 28 | #define switch_to(prev,next,last)					      \ | 
 | 29 |   do {									      \ | 
 | 30 |         if (prev != next) {						      \ | 
 | 31 |  		(last) = switch_thread (&prev->thread, &next->thread);	      \ | 
 | 32 | 	}								      \ | 
 | 33 |   } while (0) | 
 | 34 |  | 
 | 35 |  | 
 | 36 | /* Enable/disable interrupts.  */ | 
 | 37 | #define local_irq_enable()	__asm__ __volatile__ ("ei") | 
 | 38 | #define local_irq_disable()	__asm__ __volatile__ ("di") | 
 | 39 |  | 
 | 40 | #define local_save_flags(flags) \ | 
 | 41 |   __asm__ __volatile__ ("stsr %1, %0" : "=r" (flags) : "i" (SR_PSW)) | 
 | 42 | #define local_restore_flags(flags) \ | 
 | 43 |   __asm__ __volatile__ ("ldsr %0, %1" :: "r" (flags), "i" (SR_PSW)) | 
 | 44 |  | 
 | 45 | /* For spinlocks etc */ | 
 | 46 | #define	local_irq_save(flags) \ | 
 | 47 |   do { local_save_flags (flags); local_irq_disable (); } while (0)  | 
 | 48 | #define local_irq_restore(flags) \ | 
 | 49 |   local_restore_flags (flags); | 
 | 50 |  | 
 | 51 |  | 
 | 52 | static inline int irqs_disabled (void) | 
 | 53 | { | 
 | 54 | 	unsigned flags; | 
 | 55 | 	local_save_flags (flags); | 
 | 56 | 	return !!(flags & 0x20); | 
 | 57 | } | 
 | 58 |  | 
 | 59 |  | 
 | 60 | /* | 
 | 61 |  * Force strict CPU ordering. | 
 | 62 |  * Not really required on v850... | 
 | 63 |  */ | 
 | 64 | #define nop()			__asm__ __volatile__ ("nop") | 
 | 65 | #define mb()			__asm__ __volatile__ ("" ::: "memory") | 
 | 66 | #define rmb()			mb () | 
 | 67 | #define wmb()			mb () | 
 | 68 | #define read_barrier_depends()	((void)0) | 
| Stefan Richter | b2fff3f | 2007-10-20 02:30:47 +0200 | [diff] [blame] | 69 | #define set_mb(var, value)	do { xchg (&var, value); } while (0) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 |  | 
 | 71 | #define smp_mb()	mb () | 
 | 72 | #define smp_rmb()	rmb () | 
 | 73 | #define smp_wmb()	wmb () | 
 | 74 | #define smp_read_barrier_depends()	read_barrier_depends() | 
 | 75 |  | 
 | 76 | #define xchg(ptr, with) \ | 
 | 77 |   ((__typeof__ (*(ptr)))__xchg ((unsigned long)(with), (ptr), sizeof (*(ptr)))) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 |  | 
| Adrian Bunk | 23f88fe | 2005-11-07 00:59:00 -0800 | [diff] [blame] | 79 | static inline unsigned long __xchg (unsigned long with, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 80 | 				    __volatile__ void *ptr, int size) | 
 | 81 | { | 
 | 82 | 	unsigned long tmp, flags; | 
 | 83 |  | 
 | 84 | 	local_irq_save (flags); | 
 | 85 |  | 
 | 86 | 	switch (size) { | 
 | 87 | 	case 1: | 
 | 88 | 		tmp = *(unsigned char *)ptr; | 
 | 89 | 		*(unsigned char *)ptr = with; | 
 | 90 | 		break; | 
 | 91 | 	case 2: | 
 | 92 | 		tmp = *(unsigned short *)ptr; | 
 | 93 | 		*(unsigned short *)ptr = with; | 
 | 94 | 		break; | 
 | 95 | 	case 4: | 
 | 96 | 		tmp = *(unsigned long *)ptr; | 
 | 97 | 		*(unsigned long *)ptr = with; | 
 | 98 | 		break; | 
 | 99 | 	} | 
 | 100 |  | 
 | 101 | 	local_irq_restore (flags); | 
 | 102 |  | 
 | 103 | 	return tmp; | 
 | 104 | } | 
 | 105 |  | 
| Mathieu Desnoyers | b62f134 | 2008-02-07 00:16:26 -0800 | [diff] [blame] | 106 | #include <asm-generic/cmpxchg-local.h> | 
 | 107 |  | 
 | 108 | /* | 
 | 109 |  * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | 
 | 110 |  * them available. | 
 | 111 |  */ | 
 | 112 | #define cmpxchg_local(ptr, o, n)				  	       \ | 
 | 113 | 	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ | 
 | 114 | 			(unsigned long)(n), sizeof(*(ptr)))) | 
 | 115 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | 
 | 116 |  | 
 | 117 | #ifndef CONFIG_SMP | 
 | 118 | #include <asm-generic/cmpxchg.h> | 
 | 119 | #endif | 
 | 120 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 | #define arch_align_stack(x) (x) | 
 | 122 |  | 
 | 123 | #endif /* __V850_SYSTEM_H__ */ |