Project / vectors.S
vectors.S
Raw
  # vectors.S
  # This file written 2015 by Axel Isaksson
  # Modified 2015 by F Lundevall
  # For copyright and licensing, see file COPYING

.macro movi reg, val
	lui \reg, %hi(\val)
	ori \reg, \reg, %lo(\val)
.endm

.macro STUB num
	.align 4
	.section .vector_new_\num,"ax",@progbits
	.global __vector_\num
	__vector_\num:
		movi $k0, _isr_primary_install
		lw $k0, \num * 4($k0)
		jr $k0
.endm

.align 4
.global __use_isr_install
__use_isr_install:
STUB 0
STUB 1
STUB 2
STUB 3
STUB 4
STUB 5
STUB 6
STUB 7

STUB 8
STUB 9
STUB 10
STUB 11
STUB 12
STUB 13
STUB 14
STUB 15

STUB 16
STUB 17
STUB 18
STUB 19
STUB 20
STUB 21
STUB 22
STUB 23

STUB 24
STUB 25
STUB 26
STUB 27
STUB 28
STUB 29
STUB 30
STUB 31

STUB 32
STUB 33
STUB 34
STUB 35
STUB 36
STUB 37
STUB 38
STUB 39

STUB 40
STUB 41
STUB 42
STUB 43
STUB 44
STUB 45
STUB 46
STUB 47

STUB 48
STUB 49
STUB 50
STUB 51
STUB 52
STUB 53
STUB 54
STUB 55

STUB 56
STUB 57
STUB 58
STUB 59
STUB 60
STUB 61
STUB 62
STUB 63

.text

.align 4
.global _isr_primary_install
_isr_primary_install:
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline
.word _isr_trampoline

# Interrupts are handled here
.align 4
.set noreorder
.global _isr_trampoline
_isr_trampoline:	
	# this is an interrupt service routine

	# tell the assembler not to use $1 right now
	.set noat

	# save all caller-save registers, and also ra
	addi $sp,$sp,-72
	sw $ra, 0($sp)
	sw  $1, 4($sp) # $at
	sw  $2, 8($sp) # $v0
	sw  $3,12($sp) # $v1
	sw  $4,16($sp) # $a0
	sw  $5,20($sp) # $a1
	sw  $6,24($sp) # $a2
	sw  $7,28($sp) # $a3
	sw  $8,32($sp) # $t0
	sw  $9,36($sp) # $t1
	sw $10,40($sp) # $t2
	sw $11,44($sp) # $t3
	sw $12,48($sp) # $t4
	sw $13,52($sp) # $t5
	sw $14,56($sp) # $t6
	sw $15,60($sp) # $t7
	sw $24,64($sp) # $t8 
	sw $25,68($sp) # $t9 

	# Any callee-saved regs ($s0 etc) used by user's handler
	# will be saved and restored by that handler
	# (the C compiler will see to that).

	# call user's handler
	jal user_isr
	nop

	# restore saved registers
	lw $25,68($sp)
	lw $24,64($sp)
	lw $15,60($sp)
	lw $14,56($sp)
	lw $13,52($sp)
	lw $12,48($sp)
	lw $11,44($sp)
	lw $10,40($sp)
	lw  $9,36($sp)
	lw  $8,32($sp)
	lw  $7,28($sp)
	lw  $6,24($sp)
	lw  $5,20($sp)
	lw  $4,16($sp)
	lw  $3,12($sp)
	lw  $2, 8($sp)
	lw  $1, 4($sp)
	lw $ra, 0($sp)
	addi $sp,$sp,72

	.set at
	# now the assembler is allowed to use $1 again

	# standard epilogue follows
	eret
	nop


# Exceptions are handled here (trap, syscall, etc)
.section .gen_handler,"ax",@progbits
.set noreorder
.ent _gen_exception
_gen_exception:
	mfc0 $k0, $14, 0
	addi $k0, $k0, 4
	mtc0 $k0, $14, 0
	eret
	nop

.end _gen_exception