Changes in kernel/arch/ppc32/include/asm.h [7a0359b:c22e964] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ppc32/include/asm.h
r7a0359b rc22e964 27 27 */ 28 28 29 /** @addtogroup ppc32 29 /** @addtogroup ppc32 30 30 * @{ 31 31 */ … … 36 36 #define KERN_ppc32_ASM_H_ 37 37 38 #include <arch/types.h> 38 39 #include <typedefs.h> 39 40 #include <config.h> 40 #include <arch/cpu.h>41 #include <arch/mm/asid.h>42 #include <trace.h>43 44 NO_TRACE static inline uint32_t msr_read(void)45 {46 uint32_t msr;47 48 asm volatile (49 "mfmsr %[msr]\n"50 : [msr] "=r" (msr)51 );52 53 return msr;54 }55 56 NO_TRACE static inline void msr_write(uint32_t msr)57 {58 asm volatile (59 "mtmsr %[msr]\n"60 :: [msr] "r" (msr)61 );62 }63 64 NO_TRACE static inline void sr_set(uint32_t flags, asid_t asid, uint32_t sr)65 {66 asm volatile (67 "mtsrin %[value], %[sr]\n"68 :: [value] "r" ((flags << 16) + (asid << 4) + sr),69 [sr] "r" (sr << 28)70 );71 }72 73 NO_TRACE static inline uint32_t sr_get(uint32_t vaddr)74 {75 uint32_t vsid;76 77 asm volatile (78 "mfsrin %[vsid], %[vaddr]\n"79 : [vsid] "=r" (vsid)80 : [vaddr] "r" (vaddr)81 );82 83 return vsid;84 }85 86 NO_TRACE static inline uint32_t sdr1_get(void)87 {88 uint32_t sdr1;89 90 asm volatile (91 "mfsdr1 %[sdr1]\n"92 : [sdr1] "=r" (sdr1)93 );94 95 return sdr1;96 }97 41 98 42 /** Enable interrupts. … … 102 46 * 103 47 * @return Old interrupt priority level. 104 *105 48 */ 106 NO_TRACEstatic inline ipl_t interrupts_enable(void)49 static inline ipl_t interrupts_enable(void) 107 50 { 108 ipl_t ipl = msr_read(); 109 msr_write(ipl | MSR_EE); 110 return ipl; 51 ipl_t v; 52 ipl_t tmp; 53 54 asm volatile ( 55 "mfmsr %0\n" 56 "mfmsr %1\n" 57 "ori %1, %1, 1 << 15\n" 58 "mtmsr %1\n" 59 : "=r" (v), "=r" (tmp) 60 ); 61 return v; 111 62 } 112 63 … … 117 68 * 118 69 * @return Old interrupt priority level. 119 *120 70 */ 121 NO_TRACEstatic inline ipl_t interrupts_disable(void)71 static inline ipl_t interrupts_disable(void) 122 72 { 123 ipl_t ipl = msr_read(); 124 msr_write(ipl & (~MSR_EE)); 125 return ipl; 73 ipl_t v; 74 ipl_t tmp; 75 76 asm volatile ( 77 "mfmsr %0\n" 78 "mfmsr %1\n" 79 "rlwinm %1, %1, 0, 17, 15\n" 80 "mtmsr %1\n" 81 : "=r" (v), "=r" (tmp) 82 ); 83 return v; 126 84 } 127 85 … … 131 89 * 132 90 * @param ipl Saved interrupt priority level. 133 *134 91 */ 135 NO_TRACEstatic inline void interrupts_restore(ipl_t ipl)92 static inline void interrupts_restore(ipl_t ipl) 136 93 { 137 msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE)); 94 ipl_t tmp; 95 96 asm volatile ( 97 "mfmsr %1\n" 98 "rlwimi %0, %1, 0, 17, 15\n" 99 "cmpw 0, %0, %1\n" 100 "beq 0f\n" 101 "mtmsr %0\n" 102 "0:\n" 103 : "=r" (ipl), "=r" (tmp) 104 : "0" (ipl) 105 : "cr0" 106 ); 138 107 } 139 108 … … 143 112 * 144 113 * @return Current interrupt priority level. 145 *146 114 */ 147 NO_TRACEstatic inline ipl_t interrupts_read(void)115 static inline ipl_t interrupts_read(void) 148 116 { 149 return msr_read(); 150 } 151 152 /** Check whether interrupts are disabled. 153 * 154 * @return True if interrupts are disabled. 155 * 156 */ 157 NO_TRACE static inline bool interrupts_disabled(void) 158 { 159 return ((msr_read() & MSR_EE) == 0); 117 ipl_t v; 118 119 asm volatile ( 120 "mfmsr %0\n" 121 : "=r" (v) 122 ); 123 return v; 160 124 } 161 125 … … 165 129 * The stack is assumed to be STACK_SIZE bytes long. 166 130 * The stack must start on page boundary. 167 *168 131 */ 169 NO_TRACEstatic inline uintptr_t get_stack_base(void)132 static inline uintptr_t get_stack_base(void) 170 133 { 171 uintptr_t base;134 uintptr_t v; 172 135 173 136 asm volatile ( 174 "and % [base], %%sp, %[mask]\n"175 : [base] "=r" (base)176 : [mask]"r" (~(STACK_SIZE - 1))137 "and %0, %%sp, %1\n" 138 : "=r" (v) 139 : "r" (~(STACK_SIZE - 1)) 177 140 ); 178 179 return base; 141 return v; 180 142 } 181 143 182 NO_TRACEstatic inline void cpu_sleep(void)144 static inline void cpu_sleep(void) 183 145 { 184 146 } 185 147 186 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v) 148 void cpu_halt(void); 149 void asm_delay_loop(uint32_t t); 150 151 extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry); 152 153 static inline void pio_write_8(ioport8_t *port, uint8_t v) 187 154 { 188 *port = v; 155 *port = v; 189 156 } 190 157 191 NO_TRACEstatic inline void pio_write_16(ioport16_t *port, uint16_t v)158 static inline void pio_write_16(ioport16_t *port, uint16_t v) 192 159 { 193 *port = v; 160 *port = v; 194 161 } 195 162 196 NO_TRACEstatic inline void pio_write_32(ioport32_t *port, uint32_t v)163 static inline void pio_write_32(ioport32_t *port, uint32_t v) 197 164 { 198 *port = v; 165 *port = v; 199 166 } 200 167 201 NO_TRACEstatic inline uint8_t pio_read_8(ioport8_t *port)168 static inline uint8_t pio_read_8(ioport8_t *port) 202 169 { 203 return *port; 170 return *port; 204 171 } 205 172 206 NO_TRACEstatic inline uint16_t pio_read_16(ioport16_t *port)173 static inline uint16_t pio_read_16(ioport16_t *port) 207 174 { 208 return *port; 175 return *port; 209 176 } 210 177 211 NO_TRACEstatic inline uint32_t pio_read_32(ioport32_t *port)178 static inline uint32_t pio_read_32(ioport32_t *port) 212 179 { 213 return *port; 180 return *port; 214 181 } 215 216 extern void cpu_halt(void) __attribute__((noreturn));217 extern void asm_delay_loop(uint32_t t);218 extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry);219 182 220 183 #endif
Note:
See TracChangeset
for help on using the changeset viewer.