| ////////////////////////////////////////////////////////////////////////////// | 
 | // SPDX-FileCopyrightText: 2021, Dinesh Annayya                           //// | 
 | //                                                                        //// | 
 | // Licensed under the Apache License, Version 2.0 (the "License");        //// | 
 | // you may not use this file except in compliance with the License.       //// | 
 | // You may obtain a copy of the License at                                //// | 
 | //                                                                        //// | 
 | //      http://www.apache.org/licenses/LICENSE-2.0                        //// | 
 | //                                                                        //// | 
 | // Unless required by applicable law or agreed to in writing, software    //// | 
 | // distributed under the License is distributed on an "AS IS" BASIS,      //// | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied./// | 
 | // See the License for the specific language governing permissions and    //// | 
 | // limitations under the License.                                         //// | 
 | // SPDX-License-Identifier: Apache-2.0                                    //// | 
 | // SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>           //// | 
 | ////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | #include "riscv_csr_encoding.h" | 
 | #include "reloc.h" | 
 | #include "sc_test.h" | 
 |  | 
 | # define LREG lw | 
 | # define SREG sw | 
 | # define REGBYTES 4 | 
 |  | 
 |     .globl _start | 
 |     .globl main | 
 |     .globl trap_entry | 
 |     .globl handle_trap | 
 |     .globl sc_exit | 
 |     .weak trap_entry, handle_trap | 
 |  | 
 |     .section .text.init | 
 |     .org (64*3) | 
 |     .align 6; | 
 | machine_trap_entry: | 
 |     j trap_entry | 
 |  | 
 |     .align 6 | 
 | _start: | 
 | #ifndef __RVE_EXT | 
 |     zero_int_regs 1, 31 | 
 | #else | 
 |     zero_int_regs 1, 15 | 
 | #endif | 
 |     # Global pointer init | 
 |     .option push | 
 |     .option norelax | 
 |     la    gp, __global_pointer$ | 
 |     .option pop | 
 |  | 
 |     RELOC_PROC; | 
 |  | 
 |     // init tdata | 
 |     mv    a1, tp | 
 |     la    a2, _tdata_end | 
 |     j     6f | 
 | 5:  lw    a3, 0(a0) | 
 |     sw    a3, 0(a1) | 
 |     add   a0, a0, 4 | 
 |     add   a1, a1, 4 | 
 | 6:  bne   a0, a2, 5b | 
 |     // clear tbss | 
 |     j     8f | 
 | 7:  sw    zero, 0(a1) | 
 |     add   a1, a1, 4 | 
 | 8:  bne   a1, a4, 7b | 
 |  | 
 |     // Timer init | 
 |     li    t0, mtime_ctrl | 
 |     li    t1, (1 << YCR1_MTIME_CTRL_EN)   // enable, use internal clock | 
 |     sw    t1, (t0) | 
 |     li    t0, mtime_div | 
 |     li    t1, (100-1)                     // divide by 100 | 
 |     sw    t1, (t0) | 
 |     li    t0, mtimecmp | 
 |     li    t1, -1 | 
 |     sw    t1, (t0)                        // max value for mtimecmp | 
 |     sw    t1, 4(t0) | 
 |  | 
 |     li    a0, 0 | 
 |     li    a1, 0 | 
 | 9:  auipc t0, %pcrel_hi(main) | 
 |     jalr  t0, %pcrel_lo(9b) | 
 |     la    t0, sc_exit | 
 |     //j     sc_exit | 
 |  | 
 | trap_entry: | 
 |     addi sp, sp, -272 | 
 |  | 
 |     SREG x1, 1*REGBYTES(sp) | 
 |     SREG x2, 2*REGBYTES(sp) | 
 |     SREG x3, 3*REGBYTES(sp) | 
 |     SREG x4, 4*REGBYTES(sp) | 
 |     SREG x5, 5*REGBYTES(sp) | 
 |     SREG x6, 6*REGBYTES(sp) | 
 |     SREG x7, 7*REGBYTES(sp) | 
 |     SREG x8, 8*REGBYTES(sp) | 
 |     SREG x9, 9*REGBYTES(sp) | 
 |     SREG x10, 10*REGBYTES(sp) | 
 |     SREG x11, 11*REGBYTES(sp) | 
 |     SREG x12, 12*REGBYTES(sp) | 
 |     SREG x13, 13*REGBYTES(sp) | 
 |     SREG x14, 14*REGBYTES(sp) | 
 |     SREG x15, 15*REGBYTES(sp) | 
 | #ifndef __RVE_EXT | 
 |     SREG x16, 16*REGBYTES(sp) | 
 |     SREG x17, 17*REGBYTES(sp) | 
 |     SREG x18, 18*REGBYTES(sp) | 
 |     SREG x19, 19*REGBYTES(sp) | 
 |     SREG x20, 20*REGBYTES(sp) | 
 |     SREG x21, 21*REGBYTES(sp) | 
 |     SREG x22, 22*REGBYTES(sp) | 
 |     SREG x23, 23*REGBYTES(sp) | 
 |     SREG x24, 24*REGBYTES(sp) | 
 |     SREG x25, 25*REGBYTES(sp) | 
 |     SREG x26, 26*REGBYTES(sp) | 
 |     SREG x27, 27*REGBYTES(sp) | 
 |     SREG x28, 28*REGBYTES(sp) | 
 |     SREG x29, 29*REGBYTES(sp) | 
 |     SREG x30, 30*REGBYTES(sp) | 
 |     SREG x31, 31*REGBYTES(sp) | 
 | #endif // __RVE_EXT | 
 |  | 
 |     csrr a0, mcause | 
 |     csrr a1, mepc | 
 |     mv a2, sp | 
 |     jal handle_trap | 
 |  | 
 |     LREG x1, 1*REGBYTES(sp) | 
 |     LREG x2, 2*REGBYTES(sp) | 
 |     LREG x3, 3*REGBYTES(sp) | 
 |     LREG x4, 4*REGBYTES(sp) | 
 |     LREG x5, 5*REGBYTES(sp) | 
 |     LREG x6, 6*REGBYTES(sp) | 
 |     LREG x7, 7*REGBYTES(sp) | 
 |     LREG x8, 8*REGBYTES(sp) | 
 |     LREG x9, 9*REGBYTES(sp) | 
 |     LREG x10, 10*REGBYTES(sp) | 
 |     LREG x11, 11*REGBYTES(sp) | 
 |     LREG x12, 12*REGBYTES(sp) | 
 |     LREG x13, 13*REGBYTES(sp) | 
 |     LREG x14, 14*REGBYTES(sp) | 
 |     LREG x15, 15*REGBYTES(sp) | 
 | #ifndef __RVE_EXT | 
 |     LREG x16, 16*REGBYTES(sp) | 
 |     LREG x17, 17*REGBYTES(sp) | 
 |     LREG x18, 18*REGBYTES(sp) | 
 |     LREG x19, 19*REGBYTES(sp) | 
 |     LREG x20, 20*REGBYTES(sp) | 
 |     LREG x21, 21*REGBYTES(sp) | 
 |     LREG x22, 22*REGBYTES(sp) | 
 |     LREG x23, 23*REGBYTES(sp) | 
 |     LREG x24, 24*REGBYTES(sp) | 
 |     LREG x25, 25*REGBYTES(sp) | 
 |     LREG x26, 26*REGBYTES(sp) | 
 |     LREG x27, 27*REGBYTES(sp) | 
 |     LREG x28, 28*REGBYTES(sp) | 
 |     LREG x29, 29*REGBYTES(sp) | 
 |     LREG x30, 30*REGBYTES(sp) | 
 |     LREG x31, 31*REGBYTES(sp) | 
 | #endif // __RVE_EXT | 
 |  | 
 |     addi sp, sp, 272 | 
 |     mret | 
 |  | 
 | handle_trap: | 
 |     j SIM_EXIT | 
 |  | 
 | // end of crt.S |