riscv: 映射内核到指定的虚拟地址,使得kinfo能正常工作 (#468)

* riscv: 映射内核到指定的虚拟地址,使得kinfo能正常工作
This commit is contained in:
LoGin 2023-12-16 22:26:26 +08:00 committed by GitHub
parent cf44232423
commit 666cffedab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 348 additions and 21 deletions

2
env.mk
View File

@ -1,6 +1,6 @@
ifeq ($(ARCH), )
# 在这里设置ARCH可选x86_64和riscv64
# 在这里设置ARCH可选 x86_64 riscv64
# !!!!!!!如果不同时调整这里以及vscode的settings.json那么自动补全和检查将会失效
export ARCH?=x86_64
endif

View File

@ -2,12 +2,30 @@
.section .bootstrap
#define CSR_SSTATUS 0x100
#define CSR_SIE 0x104
#define CSR_STVEC 0x105
#define CSR_SIP 0x144
# define CSR_TVEC CSR_STVEC
# define CSR_STATUS CSR_SSTATUS
#define CSR_IE CSR_SIE
#define CSR_IP CSR_SIP
#define SR_FS 0x00006000
#define SR_VS 0x00000600
#define SR_FS_VS (SR_FS | SR_VS) /* Vector and Floating-Point Unit */
#define SATP_MODE_39 0x8000000000000000UL
#define SATP_MODE_48 0x9000000000000000UL
#define SATP_MODE_57 0xa000000000000000UL
#define PAGE_OFFSET 0xffffffc000000000
#define KERNEL_LINK_OFFSET 0x1000000
#define KERNEL_VIRT_START (PAGE_OFFSET + KERNEL_LINK_OFFSET)
// DragonStub
//
// a0: hartid ID
@ -18,17 +36,317 @@ ENTRY(_start)
/* Mask all interrupts */
csrw CSR_IE, zero
csrw CSR_IP, zero
/* Load the global pointer */
// hartid
la t0, __initial_hartid_ptr
sd a0, 0(t0)
//
la t0, __initial_fdt_ptr
sd a1, 0(t0)
// _startDragonStub
auipc t0, 0
li t1, -4095
and t0, t0, t1
la t1, __initial_start_load_paddr
sd t0, 0(t1)
//
la a0, __initial_pgtable
call __initial_clear_pgtable
la a0, __initial_l1_pgtable
call __initial_clear_pgtable
la a0, __initial_l1_pgtable
li a1, 4096
add a0, a0, a1
call __initial_clear_pgtable
//
la a0, __initial_start_load_paddr
ld a0, 0(a0)
// 0xffffffc000000000L0
// 16M0x1000000
li a1, KERNEL_VIRT_START
//
call initial_map_256M_phys_addr
//
la a0, __initial_start_load_paddr
ld a0, 0(a0)
mv a1, a0
call initial_map_1g_identical
__init_set_pgtable_loop_end:
call __initial_reloacate_enable_mmu
.option push
.option norelax
la sp, BSP_IDLE_STACK_SPACE
la a0, BSP_IDLE_STACK_SPACE
mv sp, a0
li t0, 32768
add sp, sp, t0
.option pop
/*
* Disable FPU & VECTOR to detect illegal usage of
* floating point or vector in kernel space
*/
li t0, SR_FS_VS
csrc CSR_STATUS, t0
/* Call the kernel */
la a0, __initial_hartid_ptr
ld a0, 0(a0)
la a1, __initial_fdt_ptr
ld a1, 0(a1)
// kernel_main
call kernel_main
nop
_loop:
j _loop
wfi
__initial_reloacate_enable_mmu:
//
la t0, __initial_start_load_paddr
ld t0, 0(t0)
li t1, KERNEL_VIRT_START
sub t1, t1, t0
//
add ra, ra, t1
/* Point stvec to virtual address of intruction after satp write */
/* Set trap vector to spin forever to help debug */
la a2, __initial_Lsecondary_park
add a2, a2, t1
csrw CSR_TVEC, a2
// enable MMU
la a2, __initial_pgtable
srli a2, a2, 12
la a0, __initial_satp_mode
ld a0, 0(a0)
or a2, a2, a0
sfence.vma
csrw satp, a2
ret
// (2M1G)
//
// a0:
// a1:
initial_map_256M_phys_addr:
// 2M
li t0, 0x1fffff
and t0, t0, a0
bnez t0, __initial_map_1g_phys_failed
// 2M
li t0, 0x1fffff
and t0, t0, a1
bnez t0, __initial_map_1g_phys_failed
// t2
mv t2, a1
// 2M
li t1, -0x200000
and t2, t2, t1
// L0
srl t2, t2, 30
andi t2, t2, 511
// L0
la t4, __initial_pgtable
slli t5, t2, 3 // t5 = t2 * 8
add t4, t4, t5 // t4 = t4 + t5 t4L0
// L1
la t5, __initial_l1_pgtable
srli t5, t5, 12
slli t5, t5, 10
ori t5, t5, 0x1 // L1V = 1
// L0
sd t5, 0(t4)
// L1L1
addi t3, t2, 128
li t5, 512
blt t3, t5, __initial_set_l1_pgtable
// L1
la t3, __initial_l1_pgtable
li t5, 4096
add t3, t3, t5
srli t3, t3, 12
slli t3, t3, 10
ori t3, t3, 0x1 // L1V = 1
// L0
sd t3, 8(t4)
__initial_set_l1_pgtable: // L1
//
mv t6, a0
// L1
la t0, __initial_l1_pgtable
// L1
mv t3, a1
srli t3, t3, 21
andi t3, t3, 511
slli t3, t3, 3 // t3 = t3 * 8
add t0, t0, t3 // t0 = t0 + t3
//
li t5, 0
__initial_set_l1_pgtable_loop:
mv t3, t6
srli t3, t3, 12 // t3 = t6 >> 12 (page frame number)
li t1, 0x3FFFFFFFFFFFFF
and t3, t3, t1 // t3 = t3 & 0x3FFFFFFFFFFFFF
slli t3, t3, 10 // t3 = t3 << 10
ori t3, t3, 0xf // L1R/W/X/V = 1
// L1
sd t3, 0(t0)
//
addi t0, t0, 8
// t6 (2M)
li t2, 0x200000
add t6, t6, t2
//
addi t5, t5, 1
// 128
li t2, 128
blt t5, t2, __initial_set_l1_pgtable_loop
//
ret
__initial_map_1g_phys_failed:
// 2M
wfi
la a0, __initial_map_1g_phys_failed
//
jr a0
//
//
// a0:
initial_map_1g_identical:
mv a1, a0
// _start1GB
li t0, -0x40000000
// ,t0
and t0, t0, a0
// t2
mv t2, a1
// 1g
li t1, -0x40000000
and t2, t2, t1
// 30L0
srl t2, t2, 30
// 511L0
andi t2, t2, 511
//
// li t2, 0xf // , R/W/X/V = 1
la t4, __initial_pgtable
slli t3, t2, 3 // t3 = t2 * 8
add t4, t4, t3 // t4 = t4 + t3
mv t3, t0
srli t3, t3, 12 // t3 = t0 >> 12 (page frame number)
slli t3, t3, 10 // t3 = t3 << 10
ori t3, t3, 0xf // set R/W/X/V = 1
// t0L0
sd t3, 0(t4)
// t4
addi t4, t4, 8
// t3 (1G)
li t2, 0x40000000
add t3, t3, t2
sd t3, 0(t4)
ret
//
//
// a0: page table address
__initial_clear_pgtable:
mv t0, a0
li t1, 512
li t2, 0 // 0
__initial_clear_pgtable_loop:
sd t2, 0(t0) // 0 word
addi t0, t0, 8 // t0
addi t1, t1, -1 // word
bnez t1, __initial_clear_pgtable_loop
ret
.align 2
__initial_Lsecondary_park:
/* We lack SMP support or have too many harts, so park this hart */
wfi
j __initial_Lsecondary_park
// hartid
.global __initial_fdt_ptr
__initial_fdt_ptr:
.quad 0
.global __initial_hartid_ptr
__initial_hartid_ptr:
.quad 0
// _start
__initial_start_load_paddr:
.quad 0
__initial_kernel_main_vaddr:
.quad 0
.global __initial_satp_mode
__initial_satp_mode:
.quad SATP_MODE_39
// sv39L0
.section .initial_pgtable_section
__initial_pgtable:
.skip 4096
__initial_l1_pgtable:
.skip 8192

View File

@ -1,14 +1,16 @@
use core::intrinsics::unreachable;
use crate::{
driver::tty::serial::serial8250::send_to_default_serial8250_port, init::init_before_mem_init,
kdebug,
};
use crate::{init::init_before_mem_init, kinfo, mm::PhysAddr};
#[no_mangle]
unsafe extern "C" fn kernel_main(hartid: usize, fdt_addr: usize) -> ! {
unsafe extern "C" fn kernel_main(hartid: usize, fdt_paddr: usize) -> ! {
let fdt_paddr = PhysAddr::new(fdt_paddr);
init_before_mem_init();
send_to_default_serial8250_port(&b"Hello, world! RISC-V!\n"[..]);
kinfo!(
"DragonOS kernel is running on hart {}, fdt address:{:?}",
hartid,
fdt_paddr
);
loop {}
unreachable()
}

View File

@ -10,20 +10,23 @@ ENTRY(_start)
SECTIONS
{
//KERNEL_VMA = 0xffffffc000000000;
KERNEL_VMA = 0;
KERNEL_VMA = 0xffffffc000000000;
. = 0x1000000;
.boot.text :
. += KERNEL_VMA;
. = ALIGN(4096);
boot_text_start_pa = .;
.boot.text : AT(boot_text_start_pa - KERNEL_VMA)
{
KEEP(*(.bootstrap))
*(.bootstrap.code64)
*(.bootstrap.data)
*(.bootstrap)
*(.bootstrap.*)
. = ALIGN(4096);
*(.initial_pgtable_section)
. = ALIGN(4096);
}
. += KERNEL_VMA;
. = ALIGN(32768);
. = ALIGN(4096);
text_start_pa = .;
.text (text_start_pa): AT(text_start_pa - KERNEL_VMA)
{

View File

@ -0,0 +1,3 @@
use virtio_drivers::PhysAddr;
pub fn setup_vm(dtb_paddr: PhysAddr) {}

View File

@ -5,6 +5,7 @@ use crate::mm::{
};
pub mod bump;
pub(super) mod init;
pub type PageMapper = crate::mm::page::PageMapper<RiscV64MMArch, LockedFrameAllocator>;

@ -1 +1 @@
Subproject commit bf26173f2b67d188d3c531d8b36e982748b062fc
Subproject commit 5d9a3c158772e628967d96e442c7398fa9da576a

View File

@ -35,4 +35,4 @@ clean:
libc: $(libc_objs) $(libc_sub_dirs) libc_rust
libc_rust:
cargo +nightly-2023-01-21 build --release --target ./arch/x86_64/x86_64-unknown-none.json
cargo +nightly-2023-08-15 build --release --target ./arch/x86_64/x86_64-unknown-none.json