1527dcdccSDavid Howells #ifndef __PARISC_SPECIAL_INSNS_H 2527dcdccSDavid Howells #define __PARISC_SPECIAL_INSNS_H 3527dcdccSDavid Howells 4527dcdccSDavid Howells #define mfctl(reg) ({ \ 5527dcdccSDavid Howells unsigned long cr; \ 6527dcdccSDavid Howells __asm__ __volatile__( \ 7527dcdccSDavid Howells "mfctl " #reg ",%0" : \ 8527dcdccSDavid Howells "=r" (cr) \ 9527dcdccSDavid Howells ); \ 10527dcdccSDavid Howells cr; \ 11527dcdccSDavid Howells }) 12527dcdccSDavid Howells 13527dcdccSDavid Howells #define mtctl(gr, cr) \ 14527dcdccSDavid Howells __asm__ __volatile__("mtctl %0,%1" \ 15527dcdccSDavid Howells : /* no outputs */ \ 16527dcdccSDavid Howells : "r" (gr), "i" (cr) : "memory") 17527dcdccSDavid Howells 18527dcdccSDavid Howells /* these are here to de-mystefy the calling code, and to provide hooks */ 19527dcdccSDavid Howells /* which I needed for debugging EIEM problems -PB */ 20527dcdccSDavid Howells #define get_eiem() mfctl(15) 21527dcdccSDavid Howells static inline void set_eiem(unsigned long val) 22527dcdccSDavid Howells { 23527dcdccSDavid Howells mtctl(val, 15); 24527dcdccSDavid Howells } 25527dcdccSDavid Howells 26527dcdccSDavid Howells #define mfsp(reg) ({ \ 27527dcdccSDavid Howells unsigned long cr; \ 28527dcdccSDavid Howells __asm__ __volatile__( \ 29527dcdccSDavid Howells "mfsp " #reg ",%0" : \ 30527dcdccSDavid Howells "=r" (cr) \ 31527dcdccSDavid Howells ); \ 32527dcdccSDavid Howells cr; \ 33527dcdccSDavid Howells }) 34527dcdccSDavid Howells 35*92b59929SHelge Deller #define mtsp(val, cr) \ 36*92b59929SHelge Deller { if (__builtin_constant_p(val) && ((val) == 0)) \ 37*92b59929SHelge Deller __asm__ __volatile__("mtsp %%r0,%0" : : "i" (cr) : "memory"); \ 38*92b59929SHelge Deller else \ 39527dcdccSDavid Howells __asm__ __volatile__("mtsp %0,%1" \ 40527dcdccSDavid Howells : /* no outputs */ \ 41*92b59929SHelge Deller : "r" (val), "i" (cr) : "memory"); } 42527dcdccSDavid Howells 43527dcdccSDavid Howells #endif /* __PARISC_SPECIAL_INSNS_H */ 44