Changes in kernel/arch/mips32/src/start.S [0cb47cf:96e0748d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/mips32/src/start.S
r0cb47cf r96e0748d 45 45 .global userspace_asm 46 46 47 /* 48 * Which status bits should are thread-local: 49 * KSU(UM), EXL, ERL, IE 50 */ 51 #define REG_SAVE_MASK 0x1f 52 53 /* 54 * Save registers to space defined by \r 55 * We will change status: Disable ERL, EXL, UM, IE 56 * These changes will be automatically reversed in REGISTER_LOAD 57 * %sp is NOT saved as part of these registers 58 */ 47 # Which status bits should are thread-local 48 #define REG_SAVE_MASK 0x1f # KSU(UM), EXL, ERL, IE 49 50 # Save registers to space defined by \r 51 # We will change status: Disable ERL,EXL,UM,IE 52 # These changes will be automatically reversed in REGISTER_LOAD 53 # SP is NOT saved as part of these registers 59 54 .macro REGISTERS_STORE_AND_EXC_RESET r 60 55 sw $at, EOFFSET_AT(\r) … … 75 70 sw $t8, EOFFSET_T8(\r) 76 71 sw $t9, EOFFSET_T9(\r) 77 72 78 73 mflo $at 79 74 sw $at, EOFFSET_LO(\r) … … 84 79 sw $ra, EOFFSET_RA(\r) 85 80 sw $k1, EOFFSET_K1(\r) 86 81 87 82 mfc0 $t0, $status 88 83 mfc0 $t1, $epc 89 84 90 /* save only KSU, EXL, ERL, IE */ 91 and $t2, $t0, REG_SAVE_MASK 92 93 /* clear KSU, EXL, ERL, IE */ 94 li $t3, ~(REG_SAVE_MASK) 95 and $t0, $t0, $t3 96 97 sw $t2, EOFFSET_STATUS(\r) 98 sw $t1, EOFFSET_EPC(\r) 85 and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE 86 li $t3, ~(0x1f) 87 and $t0, $t0, $t3 # Clear KSU,EXL,ERL,IE 88 89 sw $t2,EOFFSET_STATUS(\r) 90 sw $t1,EOFFSET_EPC(\r) 99 91 mtc0 $t0, $status 100 92 .endm 101 93 102 94 .macro REGISTERS_LOAD r 103 /* 104 * Update only UM, EXR, IE from status, the rest 105 * is controlled by OS and not bound to task. 106 */ 95 # Update only UM,EXR,IE from status, the rest 96 # is controlled by OS and not bound to task 107 97 mfc0 $t0, $status 108 98 lw $t1,EOFFSET_STATUS(\r) 109 110 /* mask UM, EXL, ERL, IE */ 111 li $t2, ~REG_SAVE_MASK 99 100 li $t2, ~REG_SAVE_MASK # Mask UM,EXL,ERL,IE 112 101 and $t0, $t0, $t2 113 102 114 /* copy UM, EXL, ERL, IE from saved status */ 115 or $t0, $t0, $t1 103 or $t0, $t0, $t1 # Copy UM,EXL, ERL, IE from saved status 116 104 mtc0 $t0, $status 117 105 … … 141 129 lw $at, EOFFSET_HI(\r) 142 130 mthi $at 143 131 144 132 lw $at, EOFFSET_EPC(\r) 145 133 mtc0 $at, $epc … … 149 137 .endm 150 138 151 /* 152 * Move kernel stack pointer address to register $k0. 153 * If we are in user mode, load the appropriate stack address. 154 */ 139 # Move kernel stack pointer address to register K0 140 # - if we are in user mode, load the appropriate stack 141 # address 155 142 .macro KERNEL_STACK_TO_K0 156 /* if we are in user mode */143 # If we are in user mode 157 144 mfc0 $k0, $status 158 145 andi $k0, 0x10 … … 161 148 add $k0, $sp, 0 162 149 163 /* move $k0 pointer to kernel stack */150 # Move $k0 pointer to kernel stack 164 151 lui $k0, %hi(supervisor_sp) 165 152 ori $k0, $k0, %lo(supervisor_sp) 166 167 /* move $k0 (supervisor_sp) */ 153 # Move $k0 (superveisor_sp) 168 154 lw $k0, 0($k0) 169 170 1: 155 1: 171 156 .endm 172 157 173 158 .org 0x0 174 159 kernel_image_start: 175 /* load temporary stack */160 /* Load temporary stack */ 176 161 lui $sp, %hi(end_stack) 177 162 ori $sp, $sp, %lo(end_stack) 178 163 179 /* not sure about this, but might be needed for PIC code */ 164 /* Not sure about this, but might 165 be needed for PIC code */ 180 166 lui $gp, 0x8000 181 167 182 168 /* $a1 contains physical address of bootinfo_t */ 169 183 170 jal arch_pre_main 184 171 nop … … 187 174 nop 188 175 189 .space TEMP_STACK_SIZE176 .space TEMP_STACK_SIZE 190 177 end_stack: 191 178 … … 204 191 exception_handler: 205 192 KERNEL_STACK_TO_K0 206 207 193 sub $k0, REGISTER_SPACE 208 194 sw $sp, EOFFSET_SP($k0) … … 211 197 mfc0 $k0, $cause 212 198 213 sra $k0, $k0, 0x2 /* cp0_exc_cause() part 1 */214 andi $k0, $k0, 0x1f /* cp0_exc_cause() part 2 */215 sub $k0, 8 /* 8 = SYSCALL */199 sra $k0, $k0, 0x2 # cp0_exc_cause() part 1 200 andi $k0, $k0, 0x1f # cp0_exc_cause() part 2 201 sub $k0, 8 # 8 = SYSCALL 216 202 217 203 beqz $k0, syscall_shortcut 218 add $k0, 8 /* revert $k0 back to correct exc number */204 add $k0, 8 # Revert $k0 back to correct exc number 219 205 220 206 REGISTERS_STORE_AND_EXC_RESET $sp 221 207 222 208 move $a1, $sp 223 jal exc_dispatch /* exc_dispatch(excno, register_space) */209 jal exc_dispatch # exc_dispatch(excno, register_space) 224 210 move $a0, $k0 225 211 226 212 REGISTERS_LOAD $sp 227 /* the $sp is automatically restored to former value */ 228 eret 229 230 #define SS_SP EOFFSET_SP 231 #define SS_STATUS EOFFSET_STATUS 232 #define SS_EPC EOFFSET_EPC 233 #define SS_K1 EOFFSET_K1 234 235 /** Syscall entry 236 * 237 * Registers: 238 * 239 * @param $v0 Syscall number. 240 * @param $a0 1st argument. 241 * @param $a1 2nd argument. 242 * @param $a2 3rd argument. 243 * @param $a3 4th argument. 244 * @param $t0 5th argument. 245 * @param $t1 6th argument. 246 * 247 * @return The return value will be stored in $v0. 248 * 249 */ 213 # The $sp is automatically restored to former value 214 eret 215 216 ## Syscall entry 217 # 218 # Registers: 219 # 220 # @param v0 Syscall number. 221 # @param a0 1st argument. 222 # @param a1 2nd argument. 223 # @param a2 3rd argument. 224 # @param a3 4th argument. 225 # @param t0 5th argument. 226 # @param t1 6th argument. 227 # 228 # @return The return value will be stored in v0. 229 # 230 #define SS_SP EOFFSET_SP 231 #define SS_STATUS EOFFSET_STATUS 232 #define SS_EPC EOFFSET_EPC 233 #define SS_K1 EOFFSET_K1 250 234 syscall_shortcut: 251 /* we have a lot of space on the stack, with free use */235 # We have a lot of space on the stack, with free use 252 236 mfc0 $t3, $epc 253 237 mfc0 $t2, $status 254 sw $t3, SS_EPC($sp) /* save EPC */255 sw $k1, SS_K1($sp) /* save $k1 not saved on context switch */256 257 and $t4, $t2, REG_SAVE_MASK /* save only KSU, EXL, ERL, IE */238 sw $t3, SS_EPC($sp) # Save EPC 239 sw $k1, SS_K1($sp) # Save k1 not saved on context switch 240 241 and $t4, $t2, REG_SAVE_MASK # Save only KSU, EXL, ERL, IE 258 242 li $t5, ~(0x1f) 259 and $t2, $t2, $t5 /* clear KSU, EXL, ERL */260 ori $t2, $t2, 0x1 /* set IE */261 243 and $t2, $t2, $t5 # Clear KSU, EXL, ERL 244 ori $t2, $t2, 0x1 # Set IE 245 262 246 sw $t4, SS_STATUS($sp) 263 247 mtc0 $t2, $status 264 265 /* 266 * Call the higher level system call handler. 267 * We are going to reuse part of the unused exception stack frame. 268 * 269 */ 270 sw $t0, STACK_ARG4($sp) /* save the 5th argument on the stack */ 271 sw $t1, STACK_ARG5($sp) /* save the 6th argument on the stack */ 248 249 # 250 # Call the higher level system call handler 251 # We are going to reuse part of the unused exception stack frame 252 # 253 sw $t0, STACK_ARG4($sp) # save the 5th argument on the stack 254 sw $t1, STACK_ARG5($sp) # save the 6th argument on the stack 272 255 jal syscall_handler 273 sw $v0, STACK_ARG6($sp) /* save the syscall number on the stack */274 275 /* restore status */256 sw $v0, STACK_ARG6($sp) # save the syscall number on the stack 257 258 # restore status 276 259 mfc0 $t2, $status 277 260 lw $t3, SS_STATUS($sp) 278 279 /* 280 * Change back to EXL = 1 (from last exception), otherwise 281 * an interrupt could rewrite the CP0 - EPC. 282 * 283 */ 284 li $t4, ~REG_SAVE_MASK /* mask UM, EXL, ERL, IE */ 261 262 # Change back to EXL = 1 (from last exception), otherwise 263 # an interrupt could rewrite the CP0 - EPC 264 li $t4, ~REG_SAVE_MASK # Mask UM, EXL, ERL, IE 285 265 and $t2, $t2, $t4 286 or $t2, $t2, $t3 /* copy saved UM, EXL, ERL, IE */266 or $t2, $t2, $t3 # Copy saved UM, EXL, ERL, IE 287 267 mtc0 $t2, $status 288 289 /* restore epc + 4 */268 269 # restore epc + 4 290 270 lw $t2, SS_EPC($sp) 291 271 lw $k1, SS_K1($sp) … … 293 273 mtc0 $t2, $epc 294 274 295 lw $sp, SS_SP($sp) /* restore $sp */ 296 eret 297 275 lw $sp, SS_SP($sp) # restore sp 276 277 eret 278 298 279 tlb_refill_handler: 299 280 KERNEL_STACK_TO_K0 … … 302 283 sw $sp,EOFFSET_SP($k0) 303 284 add $sp, $k0, 0 304 285 305 286 jal tlb_refill 306 287 add $a0, $sp, 0 307 288 308 289 REGISTERS_LOAD $sp 290 309 291 eret 310 292 … … 315 297 sw $sp,EOFFSET_SP($k0) 316 298 add $sp, $k0, 0 317 299 318 300 jal cache_error 319 add $a0, $sp, 0 320 301 add $a0, $sp, 0 302 321 303 REGISTERS_LOAD $sp 304 322 305 eret 323 306 324 307 userspace_asm: 325 308 add $sp, $a0, 0 326 add $v0, $a1, 0 327 add $t9, $a2, 0 /* set up correct entry into PIC code */328 xor $a0, $a0, $a0 /* $a0 is defined to hold pcb_ptr */329 /* set it to 0 */330 eret 309 add $v0, $a1, 0 310 add $t9, $a2, 0 # Set up correct entry into PIC code 311 xor $a0, $a0, $a0 # $a0 is defined to hold pcb_ptr 312 # set it to 0 313 eret
Note:
See TracChangeset
for help on using the changeset viewer.