aboutsummaryrefslogtreecommitdiff
path: root/entry.S
blob: ae7696269ca2354499772639be948800e03c1e74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
	.text
	.set noat
save_tf:	# write the trap frame onto the stack
	# save gprs
	sd		$1,8($k1)
	sd		$2,16($k1)
	sd		$3,24($k1)
	sd		$4,32($k1)
	sd		$5,40($k1)
	sd		$6,48($k1)
	sd		$7,56($k1)
	sd		$8,64($k1)
	sd		$9,72($k1)
	sd		$10,80($k1)
	sd		$11,88($k1)
	sd		$12,96($k1)
	sd		$13,104($k1)
	sd		$14,112($k1)
	sd		$15,120($k1)
	sd		$16,128($k1)
	sd		$17,136($k1)
	sd		$18,144($k1)
	sd		$19,152($k1)
	sd		$20,160($k1)
	sd		$21,168($k1)
	sd		$22,176($k1)
	sd		$23,184($k1)
	sd		$24,192($k1)
	sd		$25,200($k1)
	sd		$28,224($k1)
	sd		$29,232($k1)
	sd		$30,240($k1)
	sd		$k0,248($k1)	# $ra is actually in $k0
	# get sr, epc, badvaddr
	mfpcr	$t0,$0			# sr
	sd		$t0,256($k1)
	mfpcr	$t0,$1			# epc
	sd		$t0,264($k1)
	mfpcr	$t0,$2			# badvaddr
	sd		$t0,272($k1)
	jr		$ra

	.global pop_tf
pop_tf:	# write the trap frame onto the stack
	# restore gprs
	di
	move	$k0,$a0
	ld		$1,8($k0)
	ld		$2,16($k0)
	ld		$3,24($k0)
	ld		$4,32($k0)
	ld		$5,40($k0)
	ld		$6,48($k0)
	ld		$7,56($k0)
	ld		$8,64($k0)
	ld		$9,72($k0)
	ld		$10,80($k0)
	ld		$11,88($k0)
	ld		$12,96($k0)
	ld		$13,104($k0)
	ld		$14,112($k0)
	ld		$15,120($k0)
	ld		$16,128($k0)
	ld		$17,136($k0)
	ld		$18,144($k0)
	ld		$19,152($k0)
	ld		$20,160($k0)
	ld		$21,168($k0)
	ld		$22,176($k0)
	ld		$23,184($k0)
	ld		$24,192($k0)
	ld		$25,200($k0)
	ld		$28,224($k0)
	ld		$29,232($k0)
	ld		$30,240($k0)
	ld		$31,248($k0)

	# gtfo!
	ld		$k0,264($k0)
	mtpcr	$k0,$1
	eret



	#define TRAP_TABLE_ENTRY(x) \
	.align	7; \
	move	$k0,$ra; \
	la		$k1,stack_top-320; \
	jal		save_tf; \
	move	$sp,$k1; \
	move	$a0,$k1; \
	ei; \
	jal		x; \
	unimp

	.align	12
	.global	trap_table
trap_table:
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(unhandled_trap)
	TRAP_TABLE_ENTRY(handle_syscall)
	TRAP_TABLE_ENTRY(handle_breakpoint)
	.align 12

	.bss
	.global stack_bot
	.global stack_top
stack_bot:
	.skip	4096
stack_top: