Changes to RISC-V supervisor mode
[akaros.git] / kern / arch / riscv / boot.S
index f45a9f1..14af7f1 100644 (file)
@@ -16,6 +16,7 @@
 // entry point
 ///////////////////////////////////////////////////////////////////
 
+#define PCR0 (SR_S | SR_ET | SR_SX)
 .text
 
 .global _start
@@ -25,69 +26,78 @@ _start:
 
   // set up trap entry point.  this is not a relocated address, as we
   // do not support trapping before the MMU is set up.
-  la     $t0, trap_entry
-  mtpcr  $t0, ASM_CR(PCR_EVEC)
+  la     t0, trap_entry
+  mtpcr  t0, ASM_CR(PCR_EVEC)
 
-  // enable traps
-  li     $t0, SR_S | SR_ET | SR_SX
-  mtpcr  $t0, ASM_CR(PCR_SR)
+  // clear IPIs and enable traps
+  mtpcr  zero, ASM_CR(PCR_CLR_IPI)
+  li     t0, PCR0
+  mtpcr  t0, ASM_CR(PCR_SR)
 
   // core 0?
-  mfpcr  $t0, ASM_CR(PCR_COREID)
-  bnez   $t0, notcore0
+  mfpcr  t0, ASM_CR(PCR_COREID)
+  bnez   t0, notcore0
 
-  // set up stack and terminate frame pointer for backtracing
-  li     $fp, 0
-  la     $sp, bootstacktop
-  li     $t1, KERN_LOAD_ADDR
-  sub    $sp, $sp, $t1
+  // terminate frame pointer for backtracing and set up stack
+  li     s9, 0
+  la     sp, bootstacktop
+  li     t1, KERN_LOAD_ADDR
+  sub    sp, sp, t1
+
+  // get memory size and core count from first two words of memory
+  lw     s0, 0(zero)
+  lw     s1, 4(zero)
 
   // set up initial page mappings
-  la     $a0, l1pt
-  sub    $a0, $a0, $t1
-  la     $a1, l1pt_boot
-  sub    $a1, $a1, $t1
+  move   a0, s0
+  la     a1, l1pt
+  sub    a1, a1, t1
+  la     a2, l1pt_boot
+  sub    a2, a2, t1
 #ifdef __riscv64
-  la     $a2, l2pt_kernbase
-  sub    $a2, $a2, $t1
-  la     $a3, l2pt_load
-  sub    $a3, $a3, $t1
+  la     a3, l2pt
+  sub    a3, a3, t1
 #endif
   jal    pagetable_init
-
-  // turn on MMU
-  la     $a0, l1pt_boot
-  sub    $a0, $a0, $t1
-  jal    mmu_init
+  jal    enable_mmu
 
   // relocate stack and call into C code using absolute jump, not pc-relative
-  la     $sp, bootstacktop
-  lui    $t0, %hi(cmain)
-  jalr.j $t0, %lo(cmain)
+  move   a0, s0
+  move   a1, s1
+  la     sp, bootstacktop
+  la     t0, cmain
+  jr     t0
 
 notcore0:
-  // set up stack and terminate frame pointer for backtracing
-  // sp = percoore_stacks+(core_id()+1)*KSTKSIZE
-  li     $fp, 0
-  la     $sp, percore_stacks
-  add    $t0, $t0, 1
-  sll    $t0, $t0, KSTKSHIFT
-  add    $sp, $sp, $t0
-  li     $t1, KERN_LOAD_ADDR
-  sub    $sp, $sp, $t1
+  // set up stack: sp = percoore_stacks+(core_id()+1)*KSTKSIZE
+  la     sp, percore_stacks
+  add    t0, t0, 1
+  sll    t0, t0, KSTKSHIFT
+  add    sp, sp, t0
+  li     t1, KERN_LOAD_ADDR
+  sub    sp, sp, t1
   
-  // turn on MMU
-  la     $a0, l1pt_boot
-  sub    $a0, $a0, $t1
-  jal    mmu_init
+  jal    enable_mmu
 
   // relocate stack and call into C code
-  li     $t1, KERN_LOAD_ADDR
-  add    $sp, $sp, $t1
-  lui    $t0, %hi(smp_init)
-  jalr.j $t0, %lo(smp_init)
+  li     t1, KERN_LOAD_ADDR
+  add    sp, sp, t1
+  la     t0, smp_init
+  jr     t0
 
 .end _start
+
+.ent enable_mmu
+enable_mmu:
+  la     t0, l1pt_boot
+  li     t1, KERN_LOAD_ADDR
+  sub    t0, t0, t1
+  mtpcr  t0, ASM_CR(PCR_PTBR)
+  li     t0, PCR0 | SR_VM
+  mtpcr  t0, ASM_CR(PCR_SR)
+  ret
+.end enable_mmu
+
 ///////////////////////////////////////////////////////////////////
 // boot stack and regular stacks.
 // (boot stack cannot be in .bss, as .bss is later zereoed by the kernel.)
@@ -95,6 +105,14 @@ notcore0:
 
 .data
   .align  PGSHIFT
+l1pt_boot:
+  .space  PGSIZE
+.global l1pt
+l1pt:
+  .space  PGSIZE
+l2pt:
+  .space  PGSIZE
+
   .space  KSTKSIZE
   .global bootstacktop
 bootstacktop: