Miscellaneous RISC-V compiler updates
[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_ET | SR_SX)
20 .text
21
22 .global _start
23 .ent _start
24 _start:
25   // This is the first kernel code that executes; it is run only by core 0.
26
27   // set up trap entry point.  this is not a relocated address, as we
28   // do not support trapping before the MMU is set up.
29   la     t0, trap_entry
30   mtpcr  t0, ASM_CR(PCR_EVEC)
31
32   // enable traps
33   li     t0, PCR0
34   mtpcr  t0, ASM_CR(PCR_SR)
35
36   // core 0?
37   mfpcr  t0, ASM_CR(PCR_COREID)
38   bnez   t0, notcore0
39
40   // terminate frame pointer for backtracing and set up stack
41   li     s9, 0
42   la     sp, bootstacktop
43   li     t1, KERN_LOAD_ADDR
44   sub    sp, sp, t1
45
46   // set up initial page mappings
47   la     a0, l1pt
48   sub    a0, a0, t1
49   la     a1, l1pt_boot
50   sub    a1, a1, t1
51 #ifdef __riscv64
52   la     a2, l2pt
53   sub    a2, a1, t1
54 #endif
55   jal    pagetable_init
56   jal    enable_mmu
57
58   // relocate stack and call into C code using absolute jump, not pc-relative
59   la     sp, bootstacktop
60   la     t0, cmain
61   jr     t0
62
63 notcore0:
64   // set up stack: sp = percoore_stacks+(core_id()+1)*KSTKSIZE
65   la     sp, percore_stacks
66   add    t0, t0, 1
67   sll    t0, t0, KSTKSHIFT
68   add    sp, sp, t0
69   li     t1, KERN_LOAD_ADDR
70   sub    sp, sp, t1
71   
72   jal    enable_mmu
73
74   // relocate stack and call into C code
75   li     t1, KERN_LOAD_ADDR
76   add    sp, sp, t1
77   la     t0, smp_init
78   jr     t0
79
80 .end _start
81
82 .ent enable_mmu
83 enable_mmu:
84   la     t0, l1pt_boot
85   li     t1, KERN_LOAD_ADDR
86   sub    t0, t0, t1
87   mtpcr  t0, ASM_CR(PCR_PTBR)
88   li     t0, PCR0 | SR_VM
89   mtpcr  t0, ASM_CR(PCR_SR)
90   ret
91 .end enable_mmu
92
93 ///////////////////////////////////////////////////////////////////
94 // boot stack and regular stacks.
95 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
96 ///////////////////////////////////////////////////////////////////
97
98 .data
99   .align  PGSHIFT
100 l1pt_boot:
101   .space  PGSIZE
102 .global l1pt
103 l1pt:
104   .space  PGSIZE
105 l2pt:
106   .space  PGSIZE
107
108   .space  KSTKSIZE
109   .global bootstacktop
110 bootstacktop:
111
112 .bss
113   .align  PGSHIFT
114   .global percore_stacks
115 percore_stacks:
116   .space  KSTKSIZE*MAX_NUM_CPUS