| /* |
| * Copyright (C) 1996 Paul Mackerras. |
| */ |
| #include <linux/config.h> |
| |
| #define GETREG(reg) \ |
| static inline int get_ ## reg (void) \ |
| { int ret; asm volatile ("mf" #reg " %0" : "=r" (ret) :); return ret; } |
| |
| #define SETREG(reg) \ |
| static inline void set_ ## reg (int val) \ |
| { asm volatile ("mt" #reg " %0" : : "r" (val)); } |
| |
| GETREG(msr) |
| SETREG(msr) |
| GETREG(cr) |
| |
| #define GSETSPR(n, name) \ |
| static inline int get_ ## name (void) \ |
| { int ret; asm volatile ("mfspr %0," #n : "=r" (ret) : ); return ret; } \ |
| static inline void set_ ## name (int val) \ |
| { asm volatile ("mtspr " #n ",%0" : : "r" (val)); } |
| |
| GSETSPR(0, mq) |
| GSETSPR(1, xer) |
| GSETSPR(4, rtcu) |
| GSETSPR(5, rtcl) |
| GSETSPR(8, lr) |
| GSETSPR(9, ctr) |
| GSETSPR(18, dsisr) |
| GSETSPR(19, dar) |
| GSETSPR(22, dec) |
| GSETSPR(25, sdr1) |
| GSETSPR(26, srr0) |
| GSETSPR(27, srr1) |
| GSETSPR(272, sprg0) |
| GSETSPR(273, sprg1) |
| GSETSPR(274, sprg2) |
| GSETSPR(275, sprg3) |
| GSETSPR(282, ear) |
| GSETSPR(287, pvr) |
| #ifndef CONFIG_8xx |
| GSETSPR(528, bat0u) |
| GSETSPR(529, bat0l) |
| GSETSPR(530, bat1u) |
| GSETSPR(531, bat1l) |
| GSETSPR(532, bat2u) |
| GSETSPR(533, bat2l) |
| GSETSPR(534, bat3u) |
| GSETSPR(535, bat3l) |
| GSETSPR(1008, hid0) |
| GSETSPR(1009, hid1) |
| GSETSPR(1010, iabr) |
| GSETSPR(1013, dabr) |
| GSETSPR(1023, pir) |
| #else |
| GSETSPR(144, cmpa) |
| GSETSPR(145, cmpb) |
| GSETSPR(146, cmpc) |
| GSETSPR(147, cmpd) |
| GSETSPR(158, ictrl) |
| #endif |
| |
| static inline int get_sr(int n) |
| { |
| int ret; |
| |
| asm (" mfsrin %0,%1" : "=r" (ret) : "r" (n << 28)); |
| return ret; |
| } |
| |
| static inline void set_sr(int n, int val) |
| { |
| asm ("mtsrin %0,%1" : : "r" (val), "r" (n << 28)); |
| } |
| |
| static inline void store_inst(void *p) |
| { |
| asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p)); |
| } |
| |
| static inline void cflush(void *p) |
| { |
| asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p)); |
| } |
| |
| static inline void cinval(void *p) |
| { |
| asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p)); |
| } |
| |