Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 1 | /* |
| 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 Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 15 | */ |
| 16 | |
| 17 | #include <bits.h> |
Ronald G. Minnich | 6f3a53b | 2017-01-15 17:40:51 +0100 | [diff] [blame] | 18 | #include <mcall.h> |
| 19 | |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 20 | .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. Minnich | 6f3a53b | 2017-01-15 17:40:51 +0100 | [diff] [blame] | 105 | |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 106 | .endm |
| 107 | |
Ronald G. Minnich | 6f3a53b | 2017-01-15 17:40:51 +0100 | [diff] [blame] | 108 | .globl estack |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 109 | .text |
| 110 | .global supervisor_trap_entry |
| 111 | supervisor_trap_entry: |
| 112 | csrw mscratch, sp |
| 113 | # load in the top of the machine stack |
Ronald G. Minnich | 6f3a53b | 2017-01-15 17:40:51 +0100 | [diff] [blame] | 114 | la sp, _estack |
| 115 | addi sp,sp,-MENTRY_FRAME_SIZE |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 116 | save_tf |
| 117 | move a0,sp |
| 118 | jal trap_handler |
| 119 | .global trap_entry |
| 120 | trap_entry: |
| 121 | csrw mscratch, sp |
Jonathan Neuschäfer | 4d6ef3a | 2016-08-11 22:49:10 +0200 | [diff] [blame] | 122 | |
| 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. Minnich | 571c230 | 2016-10-28 15:08:59 -0700 | [diff] [blame] | 125 | # someday this gets fixed. |
| 126 | //csrr sp, mhartid |
| 127 | csrr sp, 0xf14 |
Jonathan Neuschäfer | 4d6ef3a | 2016-08-11 22:49:10 +0200 | [diff] [blame] | 128 | .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. Minnich | 6f3a53b | 2017-01-15 17:40:51 +0100 | [diff] [blame] | 133 | la sp, _estack |
| 134 | addi sp,sp,-MENTRY_FRAME_SIZE |
Jonathan Neuschäfer | 4d6ef3a | 2016-08-11 22:49:10 +0200 | [diff] [blame] | 135 | |
Thaminda Edirisooriya | 95ba4c8 | 2015-08-26 14:54:31 -0700 | [diff] [blame] | 136 | save_tf |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 137 | move a0,sp |
| 138 | jal trap_handler |
| 139 | .global supervisor_call_return |
| 140 | supervisor_call_return: |
| 141 | csrr a0, mscratch |
| 142 | restore_regs |
Jonathan Neuschäfer | b8e67ac | 2016-07-18 17:56:59 +0200 | [diff] [blame] | 143 | # go back into supervisor call |
| 144 | .word 0x30200073 # mret |
Thaminda Edirisooriya | 31f0521 | 2015-08-26 12:22:29 -0700 | [diff] [blame] | 145 | .global machine_call_return |
| 146 | machine_call_return: |
| 147 | csrr a0, mscratch |
| 148 | restore_regs |
Jonathan Neuschäfer | b8e67ac | 2016-07-18 17:56:59 +0200 | [diff] [blame] | 149 | # go back into machine call |
| 150 | .word 0x30200073 # mret |