Changes in kernel/arch/ppc32/include/asm.h [82474ef:7a0359b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ppc32/include/asm.h
r82474ef r7a0359b 36 36 #define KERN_ppc32_ASM_H_ 37 37 38 #include <arch/types.h>39 38 #include <typedefs.h> 40 39 #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 } 41 97 42 98 /** Enable interrupts. … … 46 102 * 47 103 * @return Old interrupt priority level. 48 */ 49 static inline ipl_t interrupts_enable(void) 50 { 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; 104 * 105 */ 106 NO_TRACE static inline ipl_t interrupts_enable(void) 107 { 108 ipl_t ipl = msr_read(); 109 msr_write(ipl | MSR_EE); 110 return ipl; 62 111 } 63 112 … … 68 117 * 69 118 * @return Old interrupt priority level. 70 */ 71 static inline ipl_t interrupts_disable(void) 72 { 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; 119 * 120 */ 121 NO_TRACE static inline ipl_t interrupts_disable(void) 122 { 123 ipl_t ipl = msr_read(); 124 msr_write(ipl & (~MSR_EE)); 125 return ipl; 84 126 } 85 127 … … 89 131 * 90 132 * @param ipl Saved interrupt priority level. 91 */ 92 static inline void interrupts_restore(ipl_t ipl) 93 { 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 ); 133 * 134 */ 135 NO_TRACE static inline void interrupts_restore(ipl_t ipl) 136 { 137 msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE)); 107 138 } 108 139 … … 112 143 * 113 144 * @return Current interrupt priority level. 114 */ 115 static inline ipl_t interrupts_read(void) 116 { 117 ipl_t v; 118 119 asm volatile ( 120 "mfmsr %0\n" 121 : "=r" (v) 122 ); 123 return v; 145 * 146 */ 147 NO_TRACE static inline ipl_t interrupts_read(void) 148 { 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); 124 160 } 125 161 … … 129 165 * The stack is assumed to be STACK_SIZE bytes long. 130 166 * The stack must start on page boundary. 131 */ 132 static inline uintptr_t get_stack_base(void) 133 { 134 uintptr_t v; 135 136 asm volatile ( 137 "and %0, %%sp, %1\n" 138 : "=r" (v) 139 : "r" (~(STACK_SIZE - 1)) 140 ); 141 return v; 142 } 143 144 static inline void cpu_sleep(void) 145 { 167 * 168 */ 169 NO_TRACE static inline uintptr_t get_stack_base(void) 170 { 171 uintptr_t base; 172 173 asm volatile ( 174 "and %[base], %%sp, %[mask]\n" 175 : [base] "=r" (base) 176 : [mask] "r" (~(STACK_SIZE - 1)) 177 ); 178 179 return base; 180 } 181 182 NO_TRACE static inline void cpu_sleep(void) 183 { 184 } 185 186 NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v) 187 { 188 *port = v; 189 } 190 191 NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v) 192 { 193 *port = v; 194 } 195 196 NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v) 197 { 198 *port = v; 199 } 200 201 NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port) 202 { 203 return *port; 204 } 205 206 NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port) 207 { 208 return *port; 209 } 210 211 NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port) 212 { 213 return *port; 146 214 } 147 215 … … 150 218 extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry); 151 219 152 static inline void pio_write_8(ioport8_t *port, uint8_t v)153 {154 *port = v;155 }156 157 static inline void pio_write_16(ioport16_t *port, uint16_t v)158 {159 *port = v;160 }161 162 static inline void pio_write_32(ioport32_t *port, uint32_t v)163 {164 *port = v;165 }166 167 static inline uint8_t pio_read_8(ioport8_t *port)168 {169 return *port;170 }171 172 static inline uint16_t pio_read_16(ioport16_t *port)173 {174 return *port;175 }176 177 static inline uint32_t pio_read_32(ioport32_t *port)178 {179 return *port;180 }181 182 220 #endif 183 221
Note:
See TracChangeset
for help on using the changeset viewer.