Change all references of num_cpus -> num_cores
[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 #define PCR0 (SR_S | SR_S64 | (1 << (IRQ_IPI + SR_IM_SHIFT)))
20 .text
21
22 .global _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     a6, trap_entry
29   mtpcr  a6, ASM_CR(PCR_EVEC)
30
31   // clear IPIs and enable traps
32   mtpcr  zero, ASM_CR(PCR_CLR_IPI)
33   li     a6, PCR0
34   mtpcr  a6, ASM_CR(PCR_SR)
35
36   // core 0?
37   mfpcr  a6, ASM_CR(PCR_COREID)
38   bnez   a6, notcore0
39
40   // terminate frame pointer for backtracing and set up stack
41   li     s0, 0
42   la     sp, percore_stacks + KSTKSIZE
43   li     a7, KERN_LOAD_ADDR
44   sub    sp, sp, a7
45
46   // get memory size and core count from first two words of memory
47   lw     s0, 0(zero)
48   lw     s1, 4(zero)
49
50   // set up initial page mappings
51   move   a0, s0
52   la     a1, l1pt
53   sub    a1, a1, a7
54   la     a2, l1pt_boot
55   sub    a2, a2, a7
56 #ifdef __riscv64
57   la     a3, l2pt
58   sub    a3, a3, a7
59 #endif
60   jal    pagetable_init
61   jal    enable_mmu
62
63   // relocate stack and call into C code using absolute jump, not pc-relative
64   move   a0, s0
65   move   a1, s1
66   la     sp, percore_stacks + KSTKSIZE
67   la     a6, cmain
68   jr     a6
69
70 notcore0:
71   // wait for core 0 to boot
72   la     a8, num_cores_booted - KERN_LOAD_ADDR
73 1:lw     a9, 0(a8)
74   beqz   a9, 1b
75
76   // if for some reason coreid >= num_cores, don't boot this core
77   la     a8, num_cores - KERN_LOAD_ADDR
78   lw     a8, 0(a8)
79 1:bgeu   a6, a8, 1b
80
81   // set up stack: sp = percoore_stacks+(core_id()+1)*KSTKSIZE
82   la     sp, percore_stacks
83   add    a6, a6, 1
84   sll    a6, a6, KSTKSHIFT
85   add    sp, sp, a6
86   li     a7, KERN_LOAD_ADDR
87   sub    sp, sp, a7
88   
89   jal    enable_mmu
90
91   // relocate stack and call into C code
92   li     a7, KERN_LOAD_ADDR
93   add    sp, sp, a7
94   la     a6, smp_init
95   jr     a6
96
97 enable_mmu:
98   la     a6, l1pt_boot
99   li     a7, KERN_LOAD_ADDR
100   sub    a6, a6, a7
101   mtpcr  a6, ASM_CR(PCR_PTBR)
102   li     a6, PCR0 | SR_VM
103   mtpcr  a6, ASM_CR(PCR_SR)
104   ret
105
106 ///////////////////////////////////////////////////////////////////
107 // boot stack and regular stacks.
108 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
109 ///////////////////////////////////////////////////////////////////
110
111 .data
112   .align  PGSHIFT
113 l1pt_boot:
114   .space  PGSIZE
115 .global l1pt
116 l1pt:
117   .space  PGSIZE
118 l2pt:
119   .space  PGSIZE
120
121   .global percore_stacks
122 percore_stacks:
123   .space  KSTKSIZE*MAX_NUM_CORES