Use standard symbol markers in the link script
This commit is contained in:
@@ -8,30 +8,26 @@ PHDRS {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.text 0x80200000 : {
|
.text 0x80200000 : {
|
||||||
__kernel_base = .;
|
KEEP(*(.text.boot));
|
||||||
KEEP(*(.text.boot));
|
*(.text .text.*);
|
||||||
*(.text .text.*);
|
} :text
|
||||||
} :text
|
PROVIDE(estart = .);
|
||||||
|
|
||||||
.rodata : ALIGN(16) {
|
.rodata : ALIGN(16) {
|
||||||
*(.rodata .rodata.*);
|
*(.rodata .rodata.*);
|
||||||
}
|
}
|
||||||
|
|
||||||
.data : ALIGN(16) {
|
.data : ALIGN(16) {
|
||||||
*(.data .data.*);
|
*(.data .data.*);
|
||||||
} :data
|
} :data
|
||||||
|
|
||||||
.bss : ALIGN(16) {
|
.bss : ALIGN(16) {
|
||||||
__bss = .;
|
__bss = .;
|
||||||
*(.bss .bss.* .sbss .sbss.*);
|
*(.bss .bss.* .sbss .sbss.*);
|
||||||
__bss_end = .;
|
__bss_end = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
. += 128 * 1024; /* 128KB */
|
|
||||||
__stack_top = .;
|
|
||||||
|
|
||||||
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||||
__free_ram = .;
|
PROVIDE(end = .);
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,105 @@ bzero:
|
|||||||
.Lbzero_end:
|
.Lbzero_end:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
# Maps a page of physical memory to the identical virtual memory.
|
||||||
|
#
|
||||||
|
# Parameters:
|
||||||
|
# a0 - Physical page address.
|
||||||
|
# a1 - Free memory page that can be used to create a leaf page table.
|
||||||
|
# a2 - Page table level. If a2 is 0 a superpage is allocated, otherwise a normal page.
|
||||||
|
#
|
||||||
|
# Returns virtual page address in a0.
|
||||||
|
.type imem_map_at, @function
|
||||||
|
imem_map_at:
|
||||||
|
csrr t0, satp
|
||||||
|
slli t0, t0, 12 # Root table address.
|
||||||
|
|
||||||
|
li t1, 0xffc # 10 bit * PTESIZE mask.
|
||||||
|
srli t4, a0, 2 # Physical page number.
|
||||||
|
|
||||||
|
# Multiply VPN[1] by 4 and add to the start address of the page table.
|
||||||
|
# This gives the physical address of the page table entry.
|
||||||
|
srli t2, a0, 20
|
||||||
|
and t2, t2, t1 # VPN[1] * PTESIZE.
|
||||||
|
add t2, t0, t2 # a + VPN[1] * PTESIZE.
|
||||||
|
|
||||||
|
beqz a2, .Limem_map_at_super
|
||||||
|
|
||||||
|
srli t3, a1, 2
|
||||||
|
ori t3, t3, 0b1
|
||||||
|
sw t3, (t2)
|
||||||
|
|
||||||
|
srli t2, a0, 10
|
||||||
|
and t2, t2, t1 # VPN[0] * PTESIZE.
|
||||||
|
add t2, a1, t2 # a + VPN[0] * PTESIZE.
|
||||||
|
|
||||||
|
j .Limem_map_at_leaf
|
||||||
|
|
||||||
|
.Limem_map_at_super:
|
||||||
|
# Calculate PPN[1] (10 most significant bits of the physical address
|
||||||
|
# and map it to 12 bits of the table page entry.
|
||||||
|
li t1, 0xfff00000
|
||||||
|
and t4, t4, t1
|
||||||
|
|
||||||
|
.Limem_map_at_leaf:
|
||||||
|
ori t4, t4, 0b1111 # Execute, write, read and valid.
|
||||||
|
sw t4, (t2)
|
||||||
|
ret
|
||||||
|
|
||||||
|
# Activates paging and creates root page table.
|
||||||
|
# Allocates enough pages for the kernel and its stack.
|
||||||
|
#
|
||||||
|
# Parameters:
|
||||||
|
#
|
||||||
|
# a0 - Start (base) address of the kernel.
|
||||||
|
# a1 - Page aligned address following the kernel (kernel end).
|
||||||
|
.type imem_initialize, @function
|
||||||
|
imem_initialize:
|
||||||
|
# Prologue.
|
||||||
|
addi sp, sp, -32
|
||||||
|
sw ra, 28(sp)
|
||||||
|
sw s0, 24(sp)
|
||||||
|
addi s0, sp, 32
|
||||||
|
|
||||||
|
li t0, 64 * 1024
|
||||||
|
add t0, a1, t0
|
||||||
|
sw t0, 20(sp)
|
||||||
|
sw a1, 16(sp)
|
||||||
|
|
||||||
|
srli t0, a1, 12
|
||||||
|
csrw satp, t0
|
||||||
|
|
||||||
|
.Limem_initialize_loop:
|
||||||
|
lw t0, 20(sp)
|
||||||
|
lw a1, 16(sp)
|
||||||
|
|
||||||
|
bge a0, t0, .Limem_initialize_activate
|
||||||
|
|
||||||
|
li t0, 4096
|
||||||
|
add a1, a1, t0
|
||||||
|
li a2, 1
|
||||||
|
call imem_map_at
|
||||||
|
|
||||||
|
li t0, 4096
|
||||||
|
add a0, a0, t0
|
||||||
|
|
||||||
|
j .Limem_initialize_loop
|
||||||
|
|
||||||
|
.Limem_initialize_activate:
|
||||||
|
csrr t0, satp
|
||||||
|
li t1, 0x80000000
|
||||||
|
or t0, t0, t1
|
||||||
|
|
||||||
|
sfence.vma
|
||||||
|
csrw satp, t0
|
||||||
|
sfence.vma
|
||||||
|
|
||||||
|
# Epilogue.
|
||||||
|
lw ra, 28(sp)
|
||||||
|
lw s0, 24(sp)
|
||||||
|
addi sp, sp, 32
|
||||||
|
ret
|
||||||
|
|
||||||
.type kernel_main, @function
|
.type kernel_main, @function
|
||||||
kernel_main:
|
kernel_main:
|
||||||
# Prologue.
|
# Prologue.
|
||||||
@@ -27,42 +126,21 @@ kernel_main:
|
|||||||
sw s0, 24(sp)
|
sw s0, 24(sp)
|
||||||
addi s0, sp, 32
|
addi s0, sp, 32
|
||||||
|
|
||||||
|
sw a0, 20(sp)
|
||||||
|
sw a1, 16(sp)
|
||||||
|
|
||||||
la t0, kernel_entry
|
la t0, kernel_entry
|
||||||
csrw stvec, t0
|
csrw stvec, t0
|
||||||
|
|
||||||
mv a0, a1
|
# Map flat device tree to the virtual memory.
|
||||||
|
lw a0, 16(sp)
|
||||||
|
lw a1, 20(sp)
|
||||||
|
li a2, 0
|
||||||
|
call imem_map_at
|
||||||
|
|
||||||
|
lw a0, 16(sp)
|
||||||
call device_tree
|
call device_tree
|
||||||
|
|
||||||
# Prepare the kernel root memory table.
|
|
||||||
la a0, __kernel_base
|
|
||||||
srli a0, a0, 22
|
|
||||||
andi a0, a0, 0x3ff # VPN[1].
|
|
||||||
|
|
||||||
# Multiply VPN[1] by 4 and add to the start address of the page table.
|
|
||||||
# This gives the physical address of the page table entry.
|
|
||||||
la t0, __free_ram
|
|
||||||
slli a0, a0, 2
|
|
||||||
add a0, t0, a0
|
|
||||||
|
|
||||||
# Calculate PPN[1] (10 most significant bits of the physical address
|
|
||||||
# and map it to 12 bits of the table page entry.
|
|
||||||
la a1, __kernel_base
|
|
||||||
srli a1, a1, 2
|
|
||||||
li t0, 0xff300000
|
|
||||||
and a1, a1, t0
|
|
||||||
ori a1, a1, 0b1111
|
|
||||||
|
|
||||||
sw a1, (a0) # Save the page entry.
|
|
||||||
|
|
||||||
la a0, __free_ram
|
|
||||||
srli a0, a0, 12
|
|
||||||
li t0, 0x80000000
|
|
||||||
or a0, a0, t0
|
|
||||||
|
|
||||||
sfence.vma
|
|
||||||
csrw satp, a0
|
|
||||||
sfence.vma
|
|
||||||
|
|
||||||
# Do nothing in a loop.
|
# Do nothing in a loop.
|
||||||
.Lkernel_main:
|
.Lkernel_main:
|
||||||
j .Lkernel_main
|
j .Lkernel_main
|
||||||
@@ -216,12 +294,22 @@ panic:
|
|||||||
|
|
||||||
.section .text.boot
|
.section .text.boot
|
||||||
_entry:
|
_entry:
|
||||||
la t0, __stack_top
|
# Set the stack pointer.
|
||||||
mv sp, t0 # Set the stack pointer
|
la t0, end
|
||||||
|
li t1, 64 * 1024
|
||||||
|
add sp, t0, t1
|
||||||
|
|
||||||
lw t0, (__free_ram)
|
mv s1, a1
|
||||||
|
|
||||||
|
la a0, .text.boot
|
||||||
|
mv a1, sp
|
||||||
|
call imem_initialize
|
||||||
|
|
||||||
|
lw t0, (end)
|
||||||
la t1, next_paddr
|
la t1, next_paddr
|
||||||
sw t0, (t1)
|
sw t0, (t1)
|
||||||
|
|
||||||
call bzero
|
call bzero
|
||||||
|
mv a0, sp
|
||||||
|
mv a1, s1
|
||||||
j kernel_main
|
j kernel_main
|
||||||
|
Reference in New Issue
Block a user