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