blob: 8aba48b9869b6800db1ea17e40212a59b5614d4f [file] [log] [blame]
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -07001/*
2 * Early initialization code for riscv
3 *
4 * Copyright 2015 Google Inc.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; version 2 of
9 * the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
14 * GNU General Public License for more details.
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -070015 */
16
17#include <bits.h>
Ronald G. Minnich6f3a53b2017-01-15 17:40:51 +010018#include <mcall.h>
19
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -070020.macro restore_regs
21 # restore x registers
22 LOAD x1,1*REGBYTES(a0)
23 LOAD x2,2*REGBYTES(a0)
24 LOAD x3,3*REGBYTES(a0)
25 LOAD x4,4*REGBYTES(a0)
26 LOAD x5,5*REGBYTES(a0)
27 LOAD x6,6*REGBYTES(a0)
28 LOAD x7,7*REGBYTES(a0)
29 LOAD x8,8*REGBYTES(a0)
30 LOAD x9,9*REGBYTES(a0)
31 LOAD x11,11*REGBYTES(a0)
32 LOAD x12,12*REGBYTES(a0)
33 LOAD x13,13*REGBYTES(a0)
34 LOAD x14,14*REGBYTES(a0)
35 LOAD x15,15*REGBYTES(a0)
36 LOAD x16,16*REGBYTES(a0)
37 LOAD x17,17*REGBYTES(a0)
38 LOAD x18,18*REGBYTES(a0)
39 LOAD x19,19*REGBYTES(a0)
40 LOAD x20,20*REGBYTES(a0)
41 LOAD x21,21*REGBYTES(a0)
42 LOAD x22,22*REGBYTES(a0)
43 LOAD x23,23*REGBYTES(a0)
44 LOAD x24,24*REGBYTES(a0)
45 LOAD x25,25*REGBYTES(a0)
46 LOAD x26,26*REGBYTES(a0)
47 LOAD x27,27*REGBYTES(a0)
48 LOAD x28,28*REGBYTES(a0)
49 LOAD x29,29*REGBYTES(a0)
50 LOAD x30,30*REGBYTES(a0)
51 LOAD x31,31*REGBYTES(a0)
52 # restore a0 last
53 LOAD x10,10*REGBYTES(a0)
54
55
56 .endm
57.macro save_tf
58 # save gprs
59 STORE x1,1*REGBYTES(x2)
60 STORE x3,3*REGBYTES(x2)
61 STORE x4,4*REGBYTES(x2)
62 STORE x5,5*REGBYTES(x2)
63 STORE x6,6*REGBYTES(x2)
64 STORE x7,7*REGBYTES(x2)
65 STORE x8,8*REGBYTES(x2)
66 STORE x9,9*REGBYTES(x2)
67 STORE x10,10*REGBYTES(x2)
68 STORE x11,11*REGBYTES(x2)
69 STORE x12,12*REGBYTES(x2)
70 STORE x13,13*REGBYTES(x2)
71 STORE x14,14*REGBYTES(x2)
72 STORE x15,15*REGBYTES(x2)
73 STORE x16,16*REGBYTES(x2)
74 STORE x17,17*REGBYTES(x2)
75 STORE x18,18*REGBYTES(x2)
76 STORE x19,19*REGBYTES(x2)
77 STORE x20,20*REGBYTES(x2)
78 STORE x21,21*REGBYTES(x2)
79 STORE x22,22*REGBYTES(x2)
80 STORE x23,23*REGBYTES(x2)
81 STORE x24,24*REGBYTES(x2)
82 STORE x25,25*REGBYTES(x2)
83 STORE x26,26*REGBYTES(x2)
84 STORE x27,27*REGBYTES(x2)
85 STORE x28,28*REGBYTES(x2)
86 STORE x29,29*REGBYTES(x2)
87 STORE x30,30*REGBYTES(x2)
88 STORE x31,31*REGBYTES(x2)
89
90 # get sr, epc, badvaddr, cause
91 csrrw t0,mscratch,x0
92 csrr s0,mstatus
93 csrr t1,mepc
94 csrr t2,mbadaddr
95 csrr t3,mcause
96 STORE t0,2*REGBYTES(x2)
97 STORE s0,32*REGBYTES(x2)
98 STORE t1,33*REGBYTES(x2)
99 STORE t2,34*REGBYTES(x2)
100 STORE t3,35*REGBYTES(x2)
101
102 # get faulting insn, if it wasn't a fetch-related trap
103 li x5,-1
104 STORE x5,36*REGBYTES(x2)
Ronald G. Minnich6f3a53b2017-01-15 17:40:51 +0100105
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700106 .endm
107
Ronald G. Minnich6f3a53b2017-01-15 17:40:51 +0100108.globl estack
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700109 .text
Jonathan Neuschäfer64d855d2017-09-29 01:37:00 +0200110
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700111 .global trap_entry
Jonathan Neuschäfer27d34022018-01-08 18:31:42 +0100112 .align 2 # four byte alignment, as required by mtvec
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700113trap_entry:
114 csrw mscratch, sp
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200115
116 # SMP isn't supported yet, to avoid overwriting the same stack with different
117 # harts that handle traps at the same time.
Ronald G. Minnich571c2302016-10-28 15:08:59 -0700118 # someday this gets fixed.
119 //csrr sp, mhartid
120 csrr sp, 0xf14
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200121.Lsmp_hang:
122 bnez sp, .Lsmp_hang
123
Jonathan Neuschäfer5a6e3892017-09-26 01:44:46 +0200124 # Use a different stack than in the main context, to to avoid overwriting
125 # stack data.
126 # TODO: Maybe use the old stack pointer (plus an offset) instead. But only if
127 # the previous mode was M, because it would be a very bad idea to use a stack
128 # pointer provided by unprivileged code!
129 la sp, _estack
130 addi sp, sp, -2048 # 2 KiB is half of the stack space
131 addi sp, sp, -MENTRY_FRAME_SIZE
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200132
Thaminda Edirisooriya95ba4c82015-08-26 14:54:31 -0700133 save_tf
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700134 move a0,sp
135 jal trap_handler
Jonathan Neuschäfer3f75f5d2017-11-24 23:12:14 +0100136
Jonathan Neuschäfer3f75f5d2017-11-24 23:12:14 +0100137trap_return:
138 csrr a0, mscratch
139 restore_regs
140 # go back to the previous mode
141 mret