Changes in kernel/arch/ppc32/include/asm.h [3500f75:d99c1d2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ppc32/include/asm.h
r3500f75 rd99c1d2 38 38 #include <typedefs.h> 39 39 #include <config.h> 40 #include <arch/cpu.h>41 42 static inline uint32_t msr_read(void)43 {44 uint32_t msr;45 46 asm volatile (47 "mfmsr %[msr]\n"48 : [msr] "=r" (msr)49 );50 51 return msr;52 }53 54 static inline void msr_write(uint32_t msr)55 {56 asm volatile (57 "mtmsr %[msr]\n"58 :: [msr] "r" (msr)59 );60 }61 40 62 41 /** Enable interrupts. … … 66 45 * 67 46 * @return Old interrupt priority level. 68 *69 47 */ 70 48 static inline ipl_t interrupts_enable(void) 71 49 { 72 ipl_t ipl = msr_read(); 73 msr_write(ipl | MSR_EE); 74 return ipl; 50 ipl_t v; 51 ipl_t tmp; 52 53 asm volatile ( 54 "mfmsr %0\n" 55 "mfmsr %1\n" 56 "ori %1, %1, 1 << 15\n" 57 "mtmsr %1\n" 58 : "=r" (v), "=r" (tmp) 59 ); 60 return v; 75 61 } 76 62 … … 81 67 * 82 68 * @return Old interrupt priority level. 83 *84 69 */ 85 70 static inline ipl_t interrupts_disable(void) 86 71 { 87 ipl_t ipl = msr_read(); 88 msr_write(ipl & (~MSR_EE)); 89 return ipl; 72 ipl_t v; 73 ipl_t tmp; 74 75 asm volatile ( 76 "mfmsr %0\n" 77 "mfmsr %1\n" 78 "rlwinm %1, %1, 0, 17, 15\n" 79 "mtmsr %1\n" 80 : "=r" (v), "=r" (tmp) 81 ); 82 return v; 90 83 } 91 84 … … 95 88 * 96 89 * @param ipl Saved interrupt priority level. 97 *98 90 */ 99 91 static inline void interrupts_restore(ipl_t ipl) 100 92 { 101 msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE)); 93 ipl_t tmp; 94 95 asm volatile ( 96 "mfmsr %1\n" 97 "rlwimi %0, %1, 0, 17, 15\n" 98 "cmpw 0, %0, %1\n" 99 "beq 0f\n" 100 "mtmsr %0\n" 101 "0:\n" 102 : "=r" (ipl), "=r" (tmp) 103 : "0" (ipl) 104 : "cr0" 105 ); 102 106 } 103 107 … … 107 111 * 108 112 * @return Current interrupt priority level. 109 *110 113 */ 111 114 static inline ipl_t interrupts_read(void) 112 115 { 113 return msr_read(); 114 } 115 116 /** Check whether interrupts are disabled. 117 * 118 * @return True if interrupts are disabled. 119 * 120 */ 121 static inline bool interrupts_disabled(void) 122 { 123 return ((msr_read() & MSR_EE) == 0); 116 ipl_t v; 117 118 asm volatile ( 119 "mfmsr %0\n" 120 : "=r" (v) 121 ); 122 return v; 124 123 } 125 124 … … 129 128 * The stack is assumed to be STACK_SIZE bytes long. 130 129 * The stack must start on page boundary. 131 *132 130 */ 133 131 static inline uintptr_t get_stack_base(void) 134 132 { 135 uintptr_t base;133 uintptr_t v; 136 134 137 135 asm volatile ( 138 "and % [base], %%sp, %[mask]\n"139 : [base] "=r" (base)140 : [mask]"r" (~(STACK_SIZE - 1))136 "and %0, %%sp, %1\n" 137 : "=r" (v) 138 : "r" (~(STACK_SIZE - 1)) 141 139 ); 142 143 return base; 140 return v; 144 141 } 145 142
Note:
See TracChangeset
for help on using the changeset viewer.