Changeset View
Changeset View
Standalone View
Standalone View
head/sys/riscv/riscv/locore.S
Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | #include <machine/pte.h> | ||||
.globl _start | .globl _start | ||||
_start: | _start: | ||||
/* Get the physical address kernel loaded to */ | /* Get the physical address kernel loaded to */ | ||||
la t0, virt_map | la t0, virt_map | ||||
ld t1, 0(t0) | ld t1, 0(t0) | ||||
sub t1, t1, t0 | sub t1, t1, t0 | ||||
li t2, KERNBASE | li t2, KERNBASE | ||||
sub s9, t2, t1 /* s9 = physmem base */ | sub s9, t2, t1 /* s9 = physmem base */ | ||||
mv s10, a0 /* s10 = hart id */ | |||||
mv s11, a1 /* s11 = dtbp */ | |||||
/* Direct secondary cores to mpentry */ | /* | ||||
bnez s10, mpentry | * a0 = hart id | ||||
* a1 = dtbp | |||||
*/ | |||||
/* Pick a hart to run the boot process. */ | |||||
la t0, hart_lottery | |||||
li t1, 1 | |||||
amoadd.w t0, t1, 0(t0) | |||||
bnez t0, mpentry | |||||
/* | /* | ||||
* Page tables | * Page tables | ||||
*/ | */ | ||||
/* Add L1 entry for kernel */ | /* Add L1 entry for kernel */ | ||||
la s1, pagetable_l1 | la s1, pagetable_l1 | ||||
la s2, pagetable_l2 /* Link to next level PN */ | la s2, pagetable_l2 /* Link to next level PN */ | ||||
srli s2, s2, PAGE_SHIFT | srli s2, s2, PAGE_SHIFT | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | 2: | ||||
/* Store single level1 PTE entry to position */ | /* Store single level1 PTE entry to position */ | ||||
li a6, PTE_SIZE | li a6, PTE_SIZE | ||||
mulw a5, a5, a6 | mulw a5, a5, a6 | ||||
add t0, s1, a5 | add t0, s1, a5 | ||||
sd t6, (t0) | sd t6, (t0) | ||||
/* Create an L2 page superpage for DTB */ | /* Create an L2 page superpage for DTB */ | ||||
la s1, pagetable_l2_devmap | la s1, pagetable_l2_devmap | ||||
mv s2, s11 | mv s2, a1 | ||||
srli s2, s2, PAGE_SHIFT | srli s2, s2, PAGE_SHIFT | ||||
li t0, (PTE_KERN) | li t0, (PTE_KERN) | ||||
slli t2, s2, PTE_PPN0_S /* << PTE_PPN0_S */ | slli t2, s2, PTE_PPN0_S /* << PTE_PPN0_S */ | ||||
or t0, t0, t2 | or t0, t0, t2 | ||||
/* Store PTE entry to position */ | /* Store PTE entry to position */ | ||||
li a6, PTE_SIZE | li a6, PTE_SIZE | ||||
Show All 31 Lines | va: | ||||
csrw sscratch, t0 | csrw sscratch, t0 | ||||
/* Initialize stack pointer */ | /* Initialize stack pointer */ | ||||
la s3, initstack_end | la s3, initstack_end | ||||
mv sp, s3 | mv sp, s3 | ||||
addi sp, sp, -PCB_SIZE | addi sp, sp, -PCB_SIZE | ||||
/* Clear BSS */ | /* Clear BSS */ | ||||
la a0, _C_LABEL(__bss_start) | la s0, _C_LABEL(__bss_start) | ||||
la s1, _C_LABEL(_end) | la s1, _C_LABEL(_end) | ||||
1: | 1: | ||||
sd zero, 0(a0) | sd zero, 0(s0) | ||||
addi a0, a0, 8 | addi s0, s0, 8 | ||||
bltu a0, s1, 1b | bltu s0, s1, 1b | ||||
#ifdef SMP | |||||
/* Store boot hart id. */ | |||||
la t0, boot_hart | |||||
sw a0, 0(t0) | |||||
#endif | |||||
/* Fill riscv_bootparams */ | /* Fill riscv_bootparams */ | ||||
addi sp, sp, -40 | addi sp, sp, -40 | ||||
la t0, pagetable_l1 | la t0, pagetable_l1 | ||||
sd t0, 0(sp) /* kern_l1pt */ | sd t0, 0(sp) /* kern_l1pt */ | ||||
sd s9, 8(sp) /* kern_phys */ | sd s9, 8(sp) /* kern_phys */ | ||||
la t0, initstack_end | la t0, initstack_end | ||||
sd t0, 16(sp) /* kern_stack */ | sd t0, 16(sp) /* kern_stack */ | ||||
li t0, (VM_MAX_KERNEL_ADDRESS - 2 * L2_SIZE) | li t0, (VM_MAX_KERNEL_ADDRESS - 2 * L2_SIZE) | ||||
sd t0, 24(sp) /* dtbp_virt */ | sd t0, 24(sp) /* dtbp_virt */ | ||||
sd s11, 32(sp) /* dtbp_phys */ | sd a1, 32(sp) /* dtbp_phys */ | ||||
mv a0, sp | mv a0, sp | ||||
call _C_LABEL(initriscv) /* Off we go */ | call _C_LABEL(initriscv) /* Off we go */ | ||||
call _C_LABEL(mi_startup) | call _C_LABEL(mi_startup) | ||||
.align 4 | .align 4 | ||||
initstack: | initstack: | ||||
.space (PAGE_SIZE * KSTACK_PAGES) | .space (PAGE_SIZE * KSTACK_PAGES) | ||||
Show All 26 Lines | szsigcode: | ||||
.align 12 | .align 12 | ||||
pagetable_l1: | pagetable_l1: | ||||
.space PAGE_SIZE | .space PAGE_SIZE | ||||
pagetable_l2: | pagetable_l2: | ||||
.space PAGE_SIZE | .space PAGE_SIZE | ||||
pagetable_l2_devmap: | pagetable_l2_devmap: | ||||
.space PAGE_SIZE | .space PAGE_SIZE | ||||
.align 3 | .align 3 | ||||
virt_map: | virt_map: | ||||
.quad virt_map | .quad virt_map | ||||
hart_lottery: | |||||
.space 4 | |||||
/* Not in use, but required for linking. */ | /* Not in use, but required for linking. */ | ||||
.align 3 | .align 3 | ||||
.globl __global_pointer$ | .globl __global_pointer$ | ||||
__global_pointer$: | __global_pointer$: | ||||
.space 8 | .space 8 | ||||
.globl init_pt_va | .globl init_pt_va | ||||
Show All 26 Lines | |||||
1: | 1: | ||||
/* Wait the kernel to be ready */ | /* Wait the kernel to be ready */ | ||||
lw t1, 0(t0) | lw t1, 0(t0) | ||||
beqz t1, 1b | beqz t1, 1b | ||||
/* Setup stack pointer */ | /* Setup stack pointer */ | ||||
la t0, secondary_stacks | la t0, secondary_stacks | ||||
li t1, (PAGE_SIZE * KSTACK_PAGES) | li t1, (PAGE_SIZE * KSTACK_PAGES) | ||||
mulw t1, t1, s10 | mulw t2, t1, a0 | ||||
add t0, t0, t2 | |||||
add t0, t0, t1 | add t0, t0, t1 | ||||
sub t0, t0, s9 | sub t0, t0, s9 | ||||
li t1, KERNBASE | li t1, KERNBASE | ||||
add sp, t0, t1 | add sp, t0, t1 | ||||
/* Setup supervisor trap vector */ | /* Setup supervisor trap vector */ | ||||
la t0, mpva | la t0, mpva | ||||
sub t0, t0, s9 | sub t0, t0, s9 | ||||
Show All 25 Lines |