aboutsummaryrefslogtreecommitdiff
path: root/arch/metag/include/asm/core_reg.h
blob: bdbc3a51f31cc70efd302596161f7c5bb90c901b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef __ASM_METAG_CORE_REG_H_
#define __ASM_METAG_CORE_REG_H_

#include <asm/metag_regs.h>

extern void core_reg_write(int unit, int reg, int thread, unsigned int val);
extern unsigned int core_reg_read(int unit, int reg, int thread);

/*
 * These macros allow direct access from C to any register known to the
 * assembler. Example candidates are TXTACTCYC, TXIDLECYC, and TXPRIVEXT.
 */

#define __core_reg_get(reg) ({						\
	unsigned int __grvalue;						\
	asm volatile("MOV	%0," #reg				\
		     : "=r" (__grvalue));				\
	__grvalue;							\
})

#define __core_reg_set(reg, value) do {					\
	unsigned int __srvalue = (value);				\
	asm volatile("MOV	" #reg ",%0"				\
		     :							\
		     : "r" (__srvalue));				\
} while (0)

#define __core_reg_swap(reg, value) do {				\
	unsigned int __srvalue = (value);				\
	asm volatile("SWAP	" #reg ",%0"				\
		     : "+r" (__srvalue));				\
	(value) = __srvalue;						\
} while (0)

#endif