Home | History | Annotate | Line # | Download | only in include
spr.h revision 1.46
      1  1.46  macallan /*	$NetBSD: spr.h,v 1.46 2017/07/07 22:11:36 macallan Exp $	*/
      2  1.21       chs 
      3   1.4      matt #ifndef _POWERPC_SPR_H_
      4   1.4      matt #define	_POWERPC_SPR_H_
      5   1.1    simonb 
      6   1.1    simonb #ifndef _LOCORE
      7  1.46  macallan #ifdef PPC_OEA64_BRIDGE
      8  1.46  macallan 
      9  1.46  macallan static inline uint64_t
     10  1.46  macallan mfspr(int reg)
     11  1.46  macallan {
     12  1.46  macallan 	uint64_t ret;
     13  1.46  macallan 	register_t h, l;
     14  1.46  macallan 	__asm volatile( "mfspr %0,%2;" \
     15  1.46  macallan 			"srdi %1,%0,32;" \
     16  1.46  macallan 			 : "=r"(l), "=r"(h) : "K"(reg));
     17  1.46  macallan 	ret = ((uint64_t)h << 32) | l;
     18  1.46  macallan 	return ret;
     19  1.46  macallan }
     20  1.46  macallan 
     21  1.46  macallan #define mtspr(reg, v) \
     22  1.46  macallan ( {						\
     23  1.46  macallan 	volatile register_t h, l;		\
     24  1.46  macallan 	uint64_t val = v;			\
     25  1.46  macallan 	h = (val >> 32);			\
     26  1.46  macallan 	l = val & 0xffffffff;			\
     27  1.46  macallan 	__asm volatile( \
     28  1.46  macallan 			"sldi %2,%2,32;" \
     29  1.46  macallan 			"or %2,%2,%1;" \
     30  1.46  macallan 			"sync;" \
     31  1.46  macallan 			"mtspr %0,%1;" \
     32  1.46  macallan 			"mfspr %1,%0;" \
     33  1.46  macallan 			"mfspr %1,%0;" \
     34  1.46  macallan 			"mfspr %1,%0;" \
     35  1.46  macallan 			"mfspr %1,%0;" \
     36  1.46  macallan 			"mfspr %1,%0;" \
     37  1.46  macallan 			"mfspr %1,%0;" \
     38  1.46  macallan 			 : : "K"(reg), "r"(l), "r"(h)); \
     39  1.46  macallan } )
     40  1.46  macallan 
     41  1.46  macallan #else
     42   1.4      matt #define	mtspr(reg, val)							\
     43  1.38     perry 	__asm volatile("mtspr %0,%1" : : "K"(reg), "r"(val))
     44  1.27      matt #ifdef __GNUC__
     45   1.4      matt #define	mfspr(reg)							\
     46  1.22      matt 	( { register_t val;						\
     47  1.38     perry 	  __asm volatile("mfspr %0,%1" : "=r"(val) : "K"(reg));	\
     48   1.1    simonb 	  val; } )
     49  1.27      matt #endif
     50  1.46  macallan #endif /* PPC_OEA64_BRIDGE */
     51   1.1    simonb #endif /* _LOCORE */
     52   1.1    simonb 
     53   1.1    simonb /*
     54   1.1    simonb  * Special Purpose Register declarations.
     55   1.1    simonb  *
     56  1.45      matt  * The first column in the comments indicates which PowerPC architectures the
     57  1.45      matt  * SPR is valid on - E for BookE series, 4 for 4xx series,
     58  1.45      matt  * 6 for 6xx/7xx series and 8 for 8xx and 8xxx (but not 85xx) series.
     59   1.1    simonb  */
     60   1.1    simonb 
     61  1.45      matt #define	SPR_XER			0x001	/* E468 Fixed Point Exception Register */
     62  1.45      matt #define	SPR_LR			0x008	/* E468 Link Register */
     63  1.45      matt #define	SPR_CTR			0x009	/* E468 Count Register */
     64  1.45      matt #define	SPR_DEC			0x016	/* E468 DECrementer register */
     65  1.45      matt #define	SPR_SRR0		0x01a	/* E468 Save/Restore Register 0 */
     66  1.45      matt #define	SPR_SRR1		0x01b	/* E468 Save/Restore Register 1 */
     67  1.45      matt #define	SPR_SPRG0		0x110	/* E468 SPR General 0 */
     68  1.45      matt #define	SPR_SPRG1		0x111	/* E468 SPR General 1 */
     69  1.45      matt #define	SPR_SPRG2		0x112	/* E468 SPR General 2 */
     70  1.45      matt #define	SPR_SPRG3		0x113	/* E468 SPR General 3 */
     71  1.45      matt #define	SPR_SPRG4		0x114	/* E4.. SPR General 4 */
     72  1.45      matt #define	SPR_SPRG5		0x115	/* E4.. SPR General 5 */
     73  1.45      matt #define	SPR_SPRG6		0x116	/* E4.. SPR General 6 */
     74  1.45      matt #define	SPR_SPRG7		0x117	/* E4.. SPR General 7 */
     75  1.45      matt #define	SPR_TBL			0x11c	/* E468 Time Base Lower */
     76  1.45      matt #define	SPR_TBU			0x11d	/* E468 Time Base Upper */
     77  1.45      matt #define	SPR_PVR			0x11f	/* E468 Processor Version Register */
     78   1.1    simonb 
     79   1.1    simonb /* Time Base Register declarations */
     80  1.45      matt #define	TBR_TBL			0x10c	/* E468 Time Base Lower */
     81  1.45      matt #define	TBR_TBU			0x10d	/* E468 Time Base Upper */
     82  1.40   sanjayl 
     83   1.4      matt #endif /* !_POWERPC_SPR_H_ */
     84