diff --git a/kernel/src/arch/riscv/entry.rs b/kernel/src/arch/riscv/entry.rs index 04087b3..3605f8e 100644 --- a/kernel/src/arch/riscv/entry.rs +++ b/kernel/src/arch/riscv/entry.rs @@ -34,7 +34,7 @@ unsafe extern "C" fn _start(hart_id: usize, fdt_addr: usize) -> ! { ld t0, 0(t0) # load and relocate registers - lla tp, TSS_START + lla tp, TLS_START lla sp, {stack} + {stack_size} add gp, gp, t0 add tp, tp, t0 @@ -72,7 +72,7 @@ unsafe fn pre_main(hart_id: usize, fdt_addr: usize) { setup_memory(fdt_addr); setup_kernel_paging(); - // TODO: on secondary cpu, we should copy existing kernel page table and TSS, then remap TSS + // TODO: on secondary cpu, we should copy existing kernel page table and TLS, then remap TLS install_kernel_pagetable(); // after kernel paging, board level early console is broken (no address mapping) diff --git a/kernel/src/arch/riscv/layout.rs b/kernel/src/arch/riscv/layout.rs index f8b09f0..a13656b 100644 --- a/kernel/src/arch/riscv/layout.rs +++ b/kernel/src/arch/riscv/layout.rs @@ -22,8 +22,8 @@ extern "C" { pub static BOOT_STACK_END: ExternSymbol; pub static BSS_END: ExternSymbol; - pub static TSS_START: ExternSymbol; - pub static TSS_END: ExternSymbol; + pub static TLS_START: ExternSymbol; + pub static TLS_END: ExternSymbol; pub static TDATA_START: ExternSymbol; pub static TDATA_END: ExternSymbol; @@ -53,6 +53,11 @@ pub fn zero_bss() { } } +/* NOTE: + * `kernel_phys_to_virt` and `kernel_virt_to_phys` should only be used when interacting with `ExternSymbol`, + * for other cases, use `mmap_phys_to_virt` and `mmap_virt_to_phys` instead. + */ + pub unsafe fn kernel_phys_to_virt(phys: PhysAddr) -> VirtAddr { VirtAddr(phys.as_usize() + KERNEL_OFFSET) } diff --git a/kernel/src/arch/riscv/linker32.ld b/kernel/src/arch/riscv/linker32.ld index fdfe792..347e79b 100644 --- a/kernel/src/arch/riscv/linker32.ld +++ b/kernel/src/arch/riscv/linker32.ld @@ -50,8 +50,8 @@ SECTIONS { } . = ALIGN(PAGE_SIZE); - .tss : AT(ADDR(.tss) - __kernel_offset) { - TSS_START = .; + .tls : AT(ADDR(.tls) - __kernel_offset) { + TLS_START = .; . = ALIGN(8); TDATA_START = .; @@ -63,9 +63,10 @@ SECTIONS { *(.tbss .tbss.*) TBSS_END = .; - TSS_END = .; + TLS_END = .; } + . = TLS_END; . = ALIGN(PAGE_SIZE); KERNEL_END = .; diff --git a/kernel/src/arch/riscv/linker64.ld b/kernel/src/arch/riscv/linker64.ld index 1758743..153e08b 100644 --- a/kernel/src/arch/riscv/linker64.ld +++ b/kernel/src/arch/riscv/linker64.ld @@ -55,8 +55,8 @@ SECTIONS { } . = ALIGN(PAGE_SIZE); - .tss : AT(ADDR(.tss) - __kernel_offset) { - TSS_START = .; + .tls : AT(ADDR(.tls) - __kernel_offset) { + TLS_START = .; . = ALIGN(8); TDATA_START = .; @@ -68,9 +68,10 @@ SECTIONS { *(.tbss .tbss.*) TBSS_END = .; - TSS_END = .; + TLS_END = .; } + . = TLS_END; . = ALIGN(PAGE_SIZE); KERNEL_END = .; diff --git a/kernel/src/arch/riscv/vspace/kmem.rs b/kernel/src/arch/riscv/vspace/kmem.rs index c41c73a..e93de31 100644 --- a/kernel/src/arch/riscv/vspace/kmem.rs +++ b/kernel/src/arch/riscv/vspace/kmem.rs @@ -126,8 +126,8 @@ pub unsafe fn setup_kernel_paging() { map_section!((RODATA), MapAttr::READABLE); map_section!((DATA, BSS), MapAttr::READABLE | MapAttr::WRITABLE); - // TODO: every core must have a separate TSS section - map_section!((TSS), MapAttr::READABLE | MapAttr::WRITABLE); + // TODO: every core must have a separate TLS section + map_section!((TLS), MapAttr::READABLE | MapAttr::WRITABLE); // map 4 GiB physical memory // TODO: walk fdt to get all memory region? put it in driver init