| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <arch/encoding.h> |
| #include <bits.h> |
| #include <mcall.h> |
| |
| .section ".text._start", "ax", %progbits |
| .globl _start |
| _start: |
| # The romstage may pass the following arguments: |
| # a0: the value of mhartid |
| # a1: a pointer to the flattened devicetree |
| # a2: cbmem_top |
| |
| la t0, _cbmem_top_ptr |
| #if __riscv_xlen == 32 |
| sw a2, (t0) |
| #elif __riscv_xlen == 64 |
| sd a2, (t0) |
| #endif |
| # initialize stack point for each hart |
| # and the stack must be page-aligned. |
| # 0xDEADBEEF used to check stack overflow |
| csrr a0, mhartid |
| la t0, _stack |
| slli t1, a0, RISCV_PGSHIFT |
| add t0, t0, t1 |
| li t1, 0xDEADBEEF |
| STORE t1, 0(t0) |
| li t1, RISCV_PGSIZE - HLS_SIZE |
| add sp, t0, t1 |
| |
| # initialize hart-local storage |
| csrr a0, mhartid |
| #NOTE a1 contains FDT and should not be cluttered above |
| call hls_init |
| |
| li a0, CONFIG_RISCV_WORKING_HARTID |
| call smp_pause |
| |
| # initialize entry of interrupt/exception |
| la t0, trap_entry |
| csrw mtvec, t0 |
| |
| # clear any pending interrupts |
| csrwi mip, 0 |
| |
| call exit_car |
| # set up the mstatus register |
| call mstatus_init |
| tail main |
| |
| # These codes need to be implemented on a specific SoC |
| .weak exit_car |
| exit_car: |
| ret |