Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / arch / parisc / include / asm / special_insns.h
blob51f40eaf7780659263f37b7c10fa7bd4ecf4ced7
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PARISC_SPECIAL_INSNS_H
3 #define __PARISC_SPECIAL_INSNS_H
5 #define lpa(va) ({ \
6 unsigned long pa; \
7 __asm__ __volatile__( \
8 "copy %%r0,%0\n" \
9 "8:\tlpa %%r0(%1),%0\n" \
10 "9:\n" \
11 ASM_EXCEPTIONTABLE_ENTRY(8b, 9b, \
12 "or %%r0,%%r0,%%r0") \
13 : "=&r" (pa) \
14 : "r" (va) \
15 : "memory" \
16 ); \
17 pa; \
20 #define lpa_user(va) ({ \
21 unsigned long pa; \
22 __asm__ __volatile__( \
23 "copy %%r0,%0\n" \
24 "8:\tlpa %%r0(%%sr3,%1),%0\n" \
25 "9:\n" \
26 ASM_EXCEPTIONTABLE_ENTRY(8b, 9b, \
27 "or %%r0,%%r0,%%r0") \
28 : "=&r" (pa) \
29 : "r" (va) \
30 : "memory" \
31 ); \
32 pa; \
35 #define CR_EIEM 15 /* External Interrupt Enable Mask */
36 #define CR_CR16 16 /* CR16 Interval Timer */
37 #define CR_EIRR 23 /* External Interrupt Request Register */
39 #define mfctl(reg) ({ \
40 unsigned long cr; \
41 __asm__ __volatile__( \
42 "mfctl %1,%0" : \
43 "=r" (cr) : "i" (reg) \
44 ); \
45 cr; \
48 #define mtctl(gr, cr) \
49 __asm__ __volatile__("mtctl %0,%1" \
50 : /* no outputs */ \
51 : "r" (gr), "i" (cr) : "memory")
53 #define get_eiem() mfctl(CR_EIEM)
54 #define set_eiem(val) mtctl(val, CR_EIEM)
56 #define mfsp(reg) ({ \
57 unsigned long cr; \
58 __asm__ __volatile__( \
59 "mfsp %%sr%1,%0" \
60 : "=r" (cr) : "i"(reg) \
61 ); \
62 cr; \
65 #define mtsp(val, cr) \
66 { if (__builtin_constant_p(val) && ((val) == 0)) \
67 __asm__ __volatile__("mtsp %%r0,%0" : : "i" (cr) : "memory"); \
68 else \
69 __asm__ __volatile__("mtsp %0,%1" \
70 : /* no outputs */ \
71 : "r" (val), "i" (cr) : "memory"); }
73 #endif /* __PARISC_SPECIAL_INSNS_H */