📄 trap.handler
字号:
# SPIM S20 MIPS simulator.# The default trap handler for spim.## Copyright (C) 1990-2003 James Larus, larus@cs.wisc.edu.# ALL RIGHTS RESERVED.## SPIM is distributed under the following conditions:## You may make copies of SPIM for your own use and modify those copies.## All copies of SPIM must retain my name and copyright notice.## You may not sell SPIM or distributed SPIM in conjunction with a commerical# product or service without the expressed written consent of James Larus.## THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR# PURPOSE.## $Header: $# Define the exception handling code. This must go first! .kdata__m1_: .asciiz " Exception "__m2_: .asciiz " occurred and ignored\n"__e0_: .asciiz " [Interrupt] "__e1_: .asciiz ""__e2_: .asciiz ""__e3_: .asciiz ""__e4_: .asciiz " [Unaligned address in inst/data fetch] "__e5_: .asciiz " [Unaligned address in store] "__e6_: .asciiz " [Bad address in text read] "__e7_: .asciiz " [Bad address in data/stack read] "__e8_: .asciiz " [Error in syscall] "__e9_: .asciiz " [Breakpoint] "__e10_: .asciiz " [Reserved instruction] "__e11_: .asciiz ""__e12_: .asciiz " [Arithmetic overflow] "__e13_: .asciiz " [Inexact floating point result] "__e14_: .asciiz " [Invalid floating point result] "__e15_: .asciiz " [Divide by 0] "__e16_: .asciiz " [Floating point overflow] "__e17_: .asciiz " [Floating point underflow] "__excp: .word __e0_,__e1_,__e2_,__e3_,__e4_,__e5_,__e6_,__e7_,__e8_,__e9_ .word __e10_,__e11_,__e12_,__e13_,__e14_,__e15_,__e16_,__e17_s1: .word 0s2: .word 0# This is the exception handler code that the processor runs when# an exception occurs. It only prints some information about the# exception, but scan server as a model of how to write a handler.## Because we are running in the kernel, we can use $k0/$k1 without# saving their old values. .ktext 0x80000080 .set noat move $k1 $at # Save $at .set at sw $v0 s1 # Not re-entrent and we can't trust $sp sw $a0 s2 # But, we need to use these registers mfc0 $k0 $13 # Cause register srl $a0 $k0 2 # Extract ExcCode Field andi $a0 $a0 0xf blez $a0 int_ret # Don't print interrupts nop # Print information about exception. # li $v0 4 # syscall 4 (print_str) la $a0 __m1_ syscall li $v0 1 # syscall 1 (print_int) srl $a0 $k0 2 # Extract ExcCode Field andi $a0 $a0 0xf syscall li $v0 4 # syscall 4 (print_str) lw $a0 __excp($k0) syscall bne $k0 0x18 ok_pc # Bad PC exception requires special checks nop mfc0 $a0, $14 # EPC andi $a0, $a0, 0x3 # Is EPC word-aligned? beq $a0, 0, ok_pc nop li $v0 10 # Exit on really bad PC syscallok_pc: li $v0 4 # syscall 4 (print_str) la $a0 __m2_ syscall mtc0 $0, $13 # Clear Cause register# Return from exception. Skip offending# instruction to avoid infinite loop.#ret: lw $v0 s1 # Restore regs lw $a0 s2 mfc0 $k0 $14 # EPC addiu $k0 $k0 4 # Return to next instruction .set noat move $at $k1 # Restore $at .set at rfe # Return from exception handler jr $k0 nop# Return from interrupt. Don't skip instruction# since it has not executed.#int_ret:lw $v0 s1 # Restore regs lw $a0 s2 mfc0 $k0 $14 # EPC (return to EPC) .set noat move $at $k1 # Restore $at .set at rfe # Return from exception handler jr $k0 nop# Standard startup code. Invoke the routine "main" with arguments:# main(argc, argv, envp)# .text .globl __start__start: lw $a0, 0($sp) # argc addiu $a1, $sp, 4 # argv addiu $a2, $a1, 4 # envp sll $v0, $a0, 2 addu $a2, $a2, $v0 jal main nop li $v0 10 syscall # syscall 10 (exit) .globl __eoth__eoth:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -