Rev 1293 | Rev 1686 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1293 | Rev 1386 | ||
---|---|---|---|
Line 220... | Line 220... | ||
220 | sra $k0, $k0, 0x2 # cp0_exc_cause() part 1 |
220 | sra $k0, $k0, 0x2 # cp0_exc_cause() part 1 |
221 | andi $k0, $k0, 0x1f # cp0_exc_cause() part 2 |
221 | andi $k0, $k0, 0x1f # cp0_exc_cause() part 2 |
222 | sub $k0, 8 # 8=SYSCALL |
222 | sub $k0, 8 # 8=SYSCALL |
223 | 223 | ||
224 | beqz $k0, syscall_shortcut |
224 | beqz $k0, syscall_shortcut |
225 | add $k0, 8 # Revert $k1 back to correct exc number |
225 | add $k0, 8 # Revert $k0 back to correct exc number |
226 | 226 | ||
227 | REGISTERS_STORE_AND_EXC_RESET $sp |
227 | REGISTERS_STORE_AND_EXC_RESET $sp |
228 | 228 | ||
229 | move $a1, $sp |
229 | move $a1, $sp |
230 | jal exc_dispatch # exc_dispatch(excno, register_space) |
230 | jal exc_dispatch # exc_dispatch(excno, register_space) |
Line 237... | Line 237... | ||
237 | # it seems that mips reserves some space on stack for varfuncs??? |
237 | # it seems that mips reserves some space on stack for varfuncs??? |
238 | #define SS_ARG4 16 |
238 | #define SS_ARG4 16 |
239 | #define SS_SP EOFFSET_SP |
239 | #define SS_SP EOFFSET_SP |
240 | #define SS_STATUS EOFFSET_STATUS |
240 | #define SS_STATUS EOFFSET_STATUS |
241 | #define SS_EPC EOFFSET_EPC |
241 | #define SS_EPC EOFFSET_EPC |
- | 242 | #define SS_K1 EOFFSET_K1 |
|
242 | syscall_shortcut: |
243 | syscall_shortcut: |
243 | # We have a lot of space on the stack, with free use |
244 | # We have a lot of space on the stack, with free use |
244 | mfc0 $t1, $epc |
245 | mfc0 $t1, $epc |
245 | mfc0 $t0, $status |
246 | mfc0 $t0, $status |
246 | sw $t1,SS_EPC($sp) # Save EPC |
247 | sw $t1,SS_EPC($sp) # Save EPC |
- | 248 | sw $k1,SS_K1($sp) # Save k1, which is not saved during context switch |
|
247 | 249 | ||
248 | and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE |
250 | and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE |
249 | li $t3, ~(0x1f) |
251 | li $t3, ~(0x1f) |
250 | and $t0, $t0, $t3 # Clear KSU,EXL,ERL |
252 | and $t0, $t0, $t3 # Clear KSU,EXL,ERL |
251 | ori $t0, $t0, 0x1 # Set IE |
253 | ori $t0, $t0, 0x1 # Set IE |
Line 268... | Line 270... | ||
268 | or $t0, $t0, $t1 # Copy UM,EXL,ERL,IE from saved status |
270 | or $t0, $t0, $t1 # Copy UM,EXL,ERL,IE from saved status |
269 | mtc0 $t0, $status |
271 | mtc0 $t0, $status |
270 | 272 | ||
271 | # restore epc+4 |
273 | # restore epc+4 |
272 | lw $t0,SS_EPC($sp) |
274 | lw $t0,SS_EPC($sp) |
- | 275 | lw $k1,SS_K1($sp) |
|
273 | addi $t0, $t0, 4 |
276 | addi $t0, $t0, 4 |
274 | mtc0 $t0, $epc |
277 | mtc0 $t0, $epc |
275 | 278 | ||
276 | lw $sp,SS_SP($sp) # restore sp |
279 | lw $sp,SS_SP($sp) # restore sp |
277 | 280 |