code changes for new RISC-V GCC toolchain
[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 #incldue <arch/mmu.h>
7
8 ///////////////////////////////////////////////////////////////////
9 // The kernel (this code) is linked at address 0xFFFFFFFF80000000,
10 // but we tell the bootloader to load it at physical address 
11 // 0x00000000, which is the start of extended memory.
12 // (See kernel.ld)
13 ///////////////////////////////////////////////////////////////////
14
15 ///////////////////////////////////////////////////////////////////
16 // entry point
17 ///////////////////////////////////////////////////////////////////
18
19 .text
20
21 .global _start
22 .ent _start
23 _start:
24   // This is the first kernel code that executes; it is run only by core 0.
25
26   // set up trap entry point.  this is not a relocated address, as we
27   // do not support trapping before the MMU is set up.
28   la     t0, trap_entry
29   mtpcr  t0, ASM_CR(PCR_EVEC)
30
31   // enable traps
32   li     t0, SR_S | SR_ET | SR_SX
33   mtpcr  t0, ASM_CR(PCR_SR)
34
35   // core 0?
36   mfpcr  t0, ASM_CR(PCR_COREID)
37   bnez   t0, notcore0
38
39   // set up stack
40   la     sp, bootstacktop
41   li     t1, KERN_LOAD_ADDR
42   sub    sp, sp, t1
43
44   // set up initial page mappings
45   la     a0, l1pt
46   sub    a0, a0, t1
47   la     a1, l1pt_boot
48   sub    a1, a1, t1
49 #ifdef __riscv64
50   la     a2, l2pt_kernbase
51   sub    a2, a2, t1
52   la     a3, l2pt_load
53   sub    a3, a3, t1
54 #endif
55   jal    pagetable_init
56
57   // turn on MMU
58   la     a0, l1pt_boot
59   sub    a0, a0, t1
60   jal    mmu_init
61
62   // relocate stack and call into C code using absolute jump, not pc-relative
63   la     sp, bootstacktop
64   lui    t0, %hi(cmain)
65   jalr.j t0, %lo(cmain)
66
67 notcore0:
68   // set up stack: sp = percoore_stacks+(core_id()+1)*KSTKSIZE
69   la     sp, percore_stacks
70   add    t0, t0, 1
71   sll    t0, t0, KSTKSHIFT
72   add    sp, sp, t0
73   li     t1, KERN_LOAD_ADDR
74   sub    sp, sp, t1
75   
76   // turn on MMU
77   la     a0, l1pt_boot
78   sub    a0, a0, t1
79   jal    mmu_init
80
81   // relocate stack and call into C code
82   li     t1, KERN_LOAD_ADDR
83   add    sp, sp, t1
84   lui    t0, %hi(smp_init)
85   jalr.j t0, %lo(smp_init)
86
87 .end _start
88 ///////////////////////////////////////////////////////////////////
89 // boot stack and regular stacks.
90 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
91 ///////////////////////////////////////////////////////////////////
92
93 .data
94   .align  PGSHIFT
95   .space  KSTKSIZE
96   .global bootstacktop
97 bootstacktop:
98
99 .bss
100   .align  PGSHIFT
101   .global percore_stacks
102 percore_stacks:
103   .space  KSTKSIZE*MAX_NUM_CPUS