RISC-V port mostly links now
[akaros.git] / kern / arch / riscv / boot.S
1 /* See COPYRIGHT for copyright information. */
2
3 #include <arch/pcr.h>
4 #include <ros/arch/arch.h>
5 #include <ros/memlayout.h>
6
7 ///////////////////////////////////////////////////////////////////
8 // The kernel (this code) is linked at address (KERNBASE + 0x00000000),
9 // but we tell the bootloader to load it at physical address 
10 // 0x00000000, which is the start of extended memory.
11 // (See kernel.ld)
12 ///////////////////////////////////////////////////////////////////
13
14 ///////////////////////////////////////////////////////////////////
15 // entry point
16 ///////////////////////////////////////////////////////////////////
17
18 .text
19
20 .global _start
21 .ent    _start
22 _start:
23   // This is the first kernel code that executes; it is run only by core 0.
24
25   // set up stack and terminate frame pointer for backtracing
26   li     $fp, 0
27   la     $sp, bootstacktop
28         li     $t1, KERNBASE
29         sub    $sp, $sp, $t1
30
31   // set up trap entry point
32   la     $t0, trap_entry
33         sub    $t0, $t0, $t1
34   mtpcr  $t0, ASM_CR(PCR_EVEC)
35
36   // enable traps
37   li     $t0, SR_S | SR_ET | SR_SX
38   mtpcr  $t0, ASM_CR(PCR_SR)
39
40         jal    mmu_init
41
42   // relocate stack and call into C code using absolute jump, not pc-relative
43   la     $sp, bootstacktop
44         lui    $t0, %hi(cmain)
45         jalr.j $t0, %lo(cmain)
46
47 .end    _start
48
49 ///////////////////////////////////////////////////////////////////
50 // boot stack and regular stacks.
51 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
52 ///////////////////////////////////////////////////////////////////
53
54 .data
55   .align  PGSHIFT
56   .space  KSTKSIZE
57   .global bootstacktop
58 bootstacktop:
59
60 .bss
61   .align  PGSHIFT
62   .global percore_stacks
63 percore_stacks:
64   .space  KSTKSIZE*MAX_NUM_CPUS