new 64b kernel memory map (not userspace yet)
[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 .section ".boottext"
20
21 .global _start
22 _start:
23   // This is the first kernel code that executes; it is run only by core 0.
24
25   // set up trap entry point.  this is not a relocated address, as we
26   // do not support trapping before the MMU is set up.
27   la     $t0, trap_entry
28   mtpcr  $t0, ASM_CR(PCR_EVEC)
29
30   // enable traps
31   li     $t0, SR_S | SR_ET | SR_SX
32   mtpcr  $t0, ASM_CR(PCR_SR)
33
34   // core 0?
35   mfpcr  $t0, ASM_CR(PCR_COREID)
36   bnez   $t0, notcore0
37
38   // set up stack and terminate frame pointer for backtracing
39   li     $fp, 0
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 and terminate frame pointer for backtracing
69   // sp = percoore_stacks+(core_id()+1)*KSTKSIZE
70   li     $fp, 0
71   la     $sp, percore_stacks
72   add    $t0, $t0, 1
73   sll    $t0, $t0, KSTKSHIFT
74   add    $sp, $sp, $t0
75   li     $t1, KERN_LOAD_ADDR
76   sub    $sp, $sp, $t1
77   
78   // turn on MMU
79   la     $a0, l1pt_boot
80   sub    $a0, $a0, $t1
81   jal    mmu_init
82
83   // relocate stack and call into C code
84   li     $t1, KERN_LOAD_ADDR
85   add    $sp, $sp, $t1
86   lui    $t0, %hi(smp_init)
87   jalr.j $t0, %lo(smp_init)
88
89 ///////////////////////////////////////////////////////////////////
90 // boot stack and regular stacks.
91 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
92 ///////////////////////////////////////////////////////////////////
93
94 .data
95   .align  PGSHIFT
96   .space  KSTKSIZE
97   .global bootstacktop
98 bootstacktop:
99
100 .bss
101   .align  PGSHIFT
102   .global percore_stacks
103 percore_stacks:
104   .space  KSTKSIZE*MAX_NUM_CPUS