Changes in kernel/arch/mips32/src/start.S [0c334805:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/mips32/src/start.S
r0c334805 ra35b458 89 89 sw $s7, ISTATE_OFFSET_S7(\r) 90 90 sw $s8, ISTATE_OFFSET_S8(\r) 91 91 92 92 mflo $at 93 93 sw $at, ISTATE_OFFSET_LO(\r) 94 94 mfhi $at 95 95 sw $at, ISTATE_OFFSET_HI(\r) 96 96 97 97 sw $gp, ISTATE_OFFSET_GP(\r) 98 98 sw $ra, ISTATE_OFFSET_RA(\r) 99 99 sw $k0, ISTATE_OFFSET_KT0(\r) 100 100 sw $k1, ISTATE_OFFSET_KT1(\r) 101 101 102 102 mfc0 $t0, $status 103 103 mfc0 $t1, $epc 104 104 105 105 /* save only KSU, EXL, ERL, IE */ 106 106 and $t2, $t0, REG_SAVE_MASK 107 107 108 108 /* clear KSU, EXL, ERL, IE */ 109 109 li $t3, ~(REG_SAVE_MASK) 110 110 and $t0, $t0, $t3 111 111 112 112 sw $t2, ISTATE_OFFSET_STATUS(\r) 113 113 sw $t1, ISTATE_OFFSET_EPC(\r) … … 122 122 mfc0 $t0, $status 123 123 lw $t1, ISTATE_OFFSET_STATUS(\r) 124 124 125 125 /* mask UM, EXL, ERL, IE */ 126 126 li $t2, ~REG_SAVE_MASK 127 127 and $t0, $t0, $t2 128 128 129 129 /* copy UM, EXL, ERL, IE from saved status */ 130 130 or $t0, $t0, $t1 131 131 mtc0 $t0, $status 132 132 133 133 lw $v0, ISTATE_OFFSET_V0(\r) 134 134 lw $v1, ISTATE_OFFSET_V1(\r) … … 147 147 lw $t8, ISTATE_OFFSET_T8(\r) 148 148 lw $t9, ISTATE_OFFSET_T9(\r) 149 149 150 150 lw $gp, ISTATE_OFFSET_GP(\r) 151 151 lw $ra, ISTATE_OFFSET_RA(\r) 152 152 lw $k1, ISTATE_OFFSET_KT1(\r) 153 153 154 154 lw $at, ISTATE_OFFSET_LO(\r) 155 155 mtlo $at 156 156 lw $at, ISTATE_OFFSET_HI(\r) 157 157 mthi $at 158 158 159 159 lw $at, ISTATE_OFFSET_EPC(\r) 160 160 mtc0 $at, $epc 161 161 162 162 lw $at, ISTATE_OFFSET_AT(\r) 163 163 lw $sp, ISTATE_OFFSET_SP(\r) … … 172 172 mfc0 $k0, $status 173 173 andi $k0, 0x10 174 174 175 175 beq $k0, $0, 1f 176 176 move $k0, $sp 177 177 178 178 /* move $k0 pointer to kernel stack */ 179 179 la $k0, supervisor_sp 180 180 181 181 /* move $k0 (supervisor_sp) */ 182 182 lw $k0, ($k0) 183 183 184 184 1: 185 185 .endm … … 190 190 lui $sp, %hi(end_stack) 191 191 ori $sp, $sp, %lo(end_stack) 192 192 193 193 /* not sure about this, but might be needed for PIC code */ 194 194 lui $gp, 0x8000 195 195 196 196 /* $a1 contains physical address of bootinfo_t */ 197 197 jal mips32_pre_main 198 198 addiu $sp, -ABI_STACK_FRAME 199 199 200 200 j main_bsp 201 201 nop … … 219 219 exception_handler: 220 220 KERNEL_STACK_TO_K0 221 221 222 222 sub $k0, ISTATE_SIZE 223 223 sw $sp, ISTATE_OFFSET_SP($k0) 224 224 move $sp, $k0 225 225 226 226 mfc0 $k0, $cause 227 227 228 228 sra $k0, $k0, 0x2 /* cp0_exc_cause() part 1 */ 229 229 andi $k0, $k0, 0x1f /* cp0_exc_cause() part 2 */ 230 230 sub $k0, 8 /* 8 = SYSCALL */ 231 231 232 232 beqz $k0, syscall_shortcut 233 233 add $k0, 8 /* revert $k0 back to correct exc number */ 234 234 235 235 REGISTERS_STORE_AND_EXC_RESET $sp 236 236 237 237 move $a1, $sp 238 238 move $a0, $k0 … … 240 240 addiu $sp, -ABI_STACK_FRAME 241 241 addiu $sp, ABI_STACK_FRAME 242 242 243 243 REGISTERS_LOAD $sp 244 244 /* the $sp is automatically restored to former value */ … … 265 265 sw $t3, ISTATE_OFFSET_EPC($sp) /* save EPC */ 266 266 sw $k1, ISTATE_OFFSET_KT1($sp) /* save $k1 not saved on context switch */ 267 267 268 268 and $t4, $t2, REG_SAVE_MASK /* save only KSU, EXL, ERL, IE */ 269 269 li $t5, ~(0x1f) 270 270 and $t2, $t2, $t5 /* clear KSU, EXL, ERL */ 271 271 ori $t2, $t2, 0x1 /* set IE */ 272 272 273 273 sw $t4, ISTATE_OFFSET_STATUS($sp) 274 274 mtc0 $t2, $status 275 275 276 276 /* 277 277 * Call the higher level system call handler. … … 280 280 sw $t0, ISTATE_OFFSET_T0($sp) /* save the 5th argument on the stack */ 281 281 sw $t1, ISTATE_OFFSET_T1($sp) /* save the 6th argument on the stack */ 282 282 283 283 jal syscall_handler 284 284 sw $v0, ISTATE_OFFSET_V0($sp) /* save the syscall number on the stack */ 285 285 286 286 /* restore status */ 287 287 mfc0 $t2, $status 288 288 lw $t3, ISTATE_OFFSET_STATUS($sp) 289 289 290 290 /* 291 291 * Change back to EXL = 1 (from last exception), otherwise … … 297 297 or $t2, $t2, $t3 /* copy saved UM, EXL, ERL, IE */ 298 298 mtc0 $t2, $status 299 299 300 300 /* restore epc + 4 */ 301 301 lw $t2, ISTATE_OFFSET_EPC($sp) … … 303 303 addi $t2, $t2, 4 304 304 mtc0 $t2, $epc 305 305 306 306 lw $sp, ISTATE_OFFSET_SP($sp) /* restore $sp */ 307 307 eret … … 314 314 sw $sp, ISTATE_OFFSET_SP($k0) 315 315 move $sp, $k0 316 316 317 317 move $a0, $sp 318 318 jal tlb_refill 319 319 addiu $sp, -ABI_STACK_FRAME 320 320 addiu $sp, ABI_STACK_FRAME 321 321 322 322 REGISTERS_LOAD $sp 323 323 eret … … 330 330 sw $sp, ISTATE_OFFSET_SP($k0) 331 331 move $sp, $k0 332 332 333 333 move $a0, $sp 334 334 jal cache_error 335 335 addiu $sp, -ABI_STACK_FRAME 336 336 addiu $sp, ABI_STACK_FRAME 337 337 338 338 REGISTERS_LOAD $sp 339 339 eret
Note:
See TracChangeset
for help on using the changeset viewer.