blob: ae32379562a074b8c555b5b5a95ebb457f018d6e [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
110 .global supervisor_trap_entry
111supervisor_trap_entry:
112 csrw mscratch, sp
113 # load in the top of the machine stack
Ronald G. Minnich6f3a53b2017-01-15 17:40:51 +0100114 la sp, _estack
115 addi sp,sp,-MENTRY_FRAME_SIZE
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700116 save_tf
117 move a0,sp
118 jal trap_handler
119 .global trap_entry
120trap_entry:
121 csrw mscratch, sp
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200122
123 # SMP isn't supported yet, to avoid overwriting the same stack with different
124 # harts that handle traps at the same time.
Ronald G. Minnich571c2302016-10-28 15:08:59 -0700125 # someday this gets fixed.
126 //csrr sp, mhartid
127 csrr sp, 0xf14
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200128.Lsmp_hang:
129 bnez sp, .Lsmp_hang
130
131 # TODO: Use the old stack pointer (plus an offset) for exceptions in machine
132 # mode, to avoid overwriting stack data.
Ronald G. Minnich6f3a53b2017-01-15 17:40:51 +0100133 la sp, _estack
134 addi sp,sp,-MENTRY_FRAME_SIZE
Jonathan Neuschäfer4d6ef3a2016-08-11 22:49:10 +0200135
Thaminda Edirisooriya95ba4c82015-08-26 14:54:31 -0700136 save_tf
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700137 move a0,sp
138 jal trap_handler
139 .global supervisor_call_return
140supervisor_call_return:
141 csrr a0, mscratch
142 restore_regs
Jonathan Neuschäferb8e67ac2016-07-18 17:56:59 +0200143 # go back into supervisor call
144 .word 0x30200073 # mret
Thaminda Edirisooriya31f05212015-08-26 12:22:29 -0700145 .global machine_call_return
146machine_call_return:
147 csrr a0, mscratch
148 restore_regs
Jonathan Neuschäferb8e67ac2016-07-18 17:56:59 +0200149 # go back into machine call
150 .word 0x30200073 # mret