system.h 1.8 KB
Newer Older
1 2 3 4 5
#ifndef _ASM_CRIS_ARCH_SYSTEM_H
#define _ASM_CRIS_ARCH_SYSTEM_H


/* Read the CPU version register. */
6
static inline unsigned long rdvr(void)
7 8 9 10 11 12 13 14 15 16
{
	unsigned char vr;

	__asm__ __volatile__ ("move $vr, %0" : "=rm" (vr));
	return vr;
}

#define cris_machine_name "crisv32"

/* Read the user-mode stack pointer. */
17
static inline unsigned long rdusp(void)
18 19 20 21 22 23 24 25
{
	unsigned long usp;

	__asm__ __volatile__ ("move $usp, %0" : "=rm" (usp));
	return usp;
}

/* Read the current stack pointer. */
26
static inline unsigned long rdsp(void)
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
{
	unsigned long sp;

	__asm__ __volatile__ ("move.d $sp, %0" : "=rm" (sp));
	return sp;
}

/* Write the user-mode stack pointer. */
#define wrusp(usp) __asm__ __volatile__ ("move %0, $usp" : : "rm" (usp))

#define nop() __asm__ __volatile__ ("nop");

#define xchg(ptr,x) \
	((__typeof__(*(ptr)))__xchg((unsigned long) (x),(ptr),sizeof(*(ptr))))

#define tas(ptr) (xchg((ptr),1))

struct __xchg_dummy { unsigned long a[100]; };
#define __xg(x) ((struct __xchg_dummy *)(x))

/* Used for interrupt control. */
#define local_save_flags(x) \
	__asm__ __volatile__ ("move $ccs, %0" : "=rm" (x) : : "memory");

#define local_irq_restore(x) \
	__asm__ __volatile__ ("move %0, $ccs" : : "rm" (x) : "memory");

#define local_irq_disable()  __asm__ __volatile__ ("di" : : : "memory");
#define local_irq_enable()   __asm__ __volatile__ ("ei" : : : "memory");

#define irqs_disabled()		\
({				\
	unsigned long flags;	\
				\
	local_save_flags(flags);\
	!(flags & (1 << I_CCS_BITNR));	\
})

/* Used for spinlocks, etc. */
#define local_irq_save(x) \
	__asm__ __volatile__ ("move $ccs, %0\n\tdi" : "=rm" (x) : : "memory");

#ifdef CONFIG_SMP
typedef struct {
	volatile unsigned int lock __attribute__ ((aligned(4)));
#ifdef CONFIG_PREEMPT
	unsigned int break_lock;
#endif
} spinlock_t;
#endif

#endif /* _ASM_CRIS_ARCH_SYSTEM_H */