set_current_tf() no longer sets the local *tf var
[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 and terminate frame pointer for backtracing
40   li     $fp, 0
41   la     $sp, bootstacktop
42   li     $t1, KERN_LOAD_ADDR
43   sub    $sp, $sp, $t1
44
45   // set up initial page mappings
46   la     $a0, l1pt
47   sub    $a0, $a0, $t1
48   la     $a1, l1pt_boot
49   sub    $a1, $a1, $t1
50 #ifdef __riscv64
51   la     $a2, l2pt_kernbase
52   sub    $a2, $a2, $t1
53   la     $a3, l2pt_load
54   sub    $a3, $a3, $t1
55 #endif
56   jal    pagetable_init
57
58   // turn on MMU
59   la     $a0, l1pt_boot
60   sub    $a0, $a0, $t1
61   jal    mmu_init
62
63   // relocate stack and call into C code using absolute jump, not pc-relative
64   la     $sp, bootstacktop
65   lui    $t0, %hi(cmain)
66   jalr.j $t0, %lo(cmain)
67
68 notcore0:
69   // set up stack and terminate frame pointer for backtracing
70   // sp = percoore_stacks+(core_id()+1)*KSTKSIZE
71   li     $fp, 0
72   la     $sp, percore_stacks
73   add    $t0, $t0, 1
74   sll    $t0, $t0, KSTKSHIFT
75   add    $sp, $sp, $t0
76   li     $t1, KERN_LOAD_ADDR
77   sub    $sp, $sp, $t1
78   
79   // turn on MMU
80   la     $a0, l1pt_boot
81   sub    $a0, $a0, $t1
82   jal    mmu_init
83
84   // relocate stack and call into C code
85   li     $t1, KERN_LOAD_ADDR
86   add    $sp, $sp, $t1
87   lui    $t0, %hi(smp_init)
88   jalr.j $t0, %lo(smp_init)
89
90 .end _start
91 ///////////////////////////////////////////////////////////////////
92 // boot stack and regular stacks.
93 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
94 ///////////////////////////////////////////////////////////////////
95
96 .data
97   .align  PGSHIFT
98   .space  KSTKSIZE
99   .global bootstacktop
100 bootstacktop:
101
102 .bss
103   .align  PGSHIFT
104   .global percore_stacks
105 percore_stacks:
106   .space  KSTKSIZE*MAX_NUM_CPUS