00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #ifndef __ppc64_ASM_H__
00036 #define __ppc64_ASM_H__
00037
00038 #include <arch/types.h>
00039 #include <config.h>
00040
00048 static inline ipl_t interrupts_enable(void)
00049 {
00050 ipl_t v;
00051 ipl_t tmp;
00052
00053 asm volatile (
00054 "mfmsr %0\n"
00055 "mfmsr %1\n"
00056 "ori %1, %1, 1 << 15\n"
00057 "mtmsr %1\n"
00058 : "=r" (v), "=r" (tmp)
00059 );
00060 return v;
00061 }
00062
00070 static inline ipl_t interrupts_disable(void)
00071 {
00072 ipl_t v;
00073 ipl_t tmp;
00074
00075 asm volatile (
00076 "mfmsr %0\n"
00077 "mfmsr %1\n"
00078 "rlwinm %1, %1, 0, 17, 15\n"
00079 "mtmsr %1\n"
00080 : "=r" (v), "=r" (tmp)
00081 );
00082 return v;
00083 }
00084
00091 static inline void interrupts_restore(ipl_t ipl)
00092 {
00093 ipl_t tmp;
00094
00095 asm volatile (
00096 "mfmsr %1\n"
00097 "rlwimi %0, %1, 0, 17, 15\n"
00098 "cmpw 0, %0, %1\n"
00099 "beq 0f\n"
00100 "mtmsr %0\n"
00101 "0:\n"
00102 : "=r" (ipl), "=r" (tmp)
00103 : "0" (ipl)
00104 : "cr0"
00105 );
00106 }
00107
00114 static inline ipl_t interrupts_read(void)
00115 {
00116 ipl_t v;
00117
00118 asm volatile (
00119 "mfmsr %0\n"
00120 : "=r" (v)
00121 );
00122 return v;
00123 }
00124
00131 static inline __address get_stack_base(void)
00132 {
00133 __address v;
00134
00135 asm volatile (
00136 "and %0, %%sp, %1\n"
00137 : "=r" (v)
00138 : "r" (~(STACK_SIZE - 1))
00139 );
00140 return v;
00141 }
00142
00143 static inline void cpu_sleep(void)
00144 {
00145 }
00146
00147 static inline void cpu_halt(void)
00148 {
00149 asm volatile (
00150 "b 0\n"
00151 );
00152 }
00153
00154 void asm_delay_loop(__u32 t);
00155
00156 extern void userspace_asm(__address uspace_uarg, __address stack, __address entry);
00157
00158 #endif
00159