Pārlūkot izejas kodu

feat: add some riscv64 bootstrap code

Heinz 8 mēneši atpakaļ
vecāks
revīzija
5ef1cefcb7

+ 3 - 1
Makefile.src

@@ -5,6 +5,8 @@ QEMU_ACCELERATION_FLAG=##PLACEHOLDER_3##
 QEMU_DEBUG_FLAG=#-d cpu_reset,int -D build/qemu.log
 ARCH=##PLACEHOLDER_6##
 
+## TODO: 感觉有些地方写的不太对,等到别的地方都写完了再看看。。。
+
 ifeq ($(ARCH),x86_64)
 MACHINE_TYPE=q35
 QEMU_ARGS=-machine $(MACHINE_TYPE) -drive id=disk,file=build/boot.img,format=raw,if=none \
@@ -80,7 +82,7 @@ build/boot.img: build/fs.img build/mbr_hole.bin
 ifeq ($(ARCH),x86_64)
 	dd if=build/fs.img of=build/boot.img bs=$(shell expr 4 \* 1024 \* 1024) seek=1 conv=notrunc
 	sh -c 'echo n; echo; echo; echo 8192; echo; echo a; echo w' | $(FDISK_BIN) build/boot.img
-else
+else ifeq ($(ARCH),riscv64)
 	dd if=build/fs.img of=build/boot.img bs=$(shell expr 4 \* 1024 \* 1024) seek=1 conv=notrunc
 	@echo "Note: Using default partitioning for $(ARCH)"
 endif

+ 5 - 2
arch/src/lib.rs

@@ -1,13 +1,16 @@
 #![no_std]
 #![feature(naked_functions)]
 
+// for dev
+mod riscv64;
+
 cfg_if::cfg_if! {
     if #[cfg(target_arch = "x86_64")] {
         mod x86_64;
         pub use self::x86_64::*;
     } else if #[cfg(target_arch = "riscv64")] {
-        mod riscv;
-        pub use self::riscv::*;
+        mod riscv64;
+        pub use self::riscv64::*;
     } else if #[cfg(target_arch = "aarch64")]{
         // TODO!!!
     }

+ 0 - 0
arch/src/riscv64/boot.s


+ 26 - 0
arch/src/riscv64/entry.S

@@ -0,0 +1,26 @@
+    .section .text.entry
+    .global _start
+_start:
+    la sp, _stack_start
+
+    la a0, BSS_START
+    la a1, BSS_END
+// clear bss section
+.Lclear_bss_loop:
+    bge a0, a1, .Lclear_bss_done
+    sw x0, (a0)
+    addi a0, a0, 4
+    j .Lclear_bss_loop
+.Lclear_bss_done:
+    // jump to kernel entry point
+    call start
+.Lhang:
+    wfi
+    j .Lhang
+
+    .section .bss.stack
+    .globl stack_bottom
+stack_bottom:
+    .space 4096 * 16
+    .globl stack_top
+stack_top:

+ 169 - 0
arch/src/riscv64/kernel.ld

@@ -0,0 +1,169 @@
+OUTPUT_FORMAT(elf64-littleriscv)
+ENTRY(_start)
+
+MEMORY
+{
+    PHYMEM        (w)  : org = 0xffffff0000000000, len = 512 * 1024M
+    PARRAY        (w)  : org = 0xffffff8000000000, len = 128 * 1024M
+    KBSS          (w)  : org = 0xffffffffc0200000, len = 2M
+    KIMAGE        (wx) : org = 0xffffffffffc00000, len = 2M
+    KPERCPU       (w)  : org = 0x0000000000000000, len = 128K
+}
+
+SECTIONS
+{
+    .text : AT(0x80200000)
+    {
+        TEXT_START = .;
+        *(.text.entry)
+        *(.text)
+        *(.text*)
+
+        . = ALIGN(0x1000);
+        TEXT_END = .;
+    } > KIMAGE
+
+    TEXT_PAGES = (TEXT_END - TEXT_START) / 0x1000;
+
+    .rodata :
+        AT(LOADADDR(.text) + SIZEOF(.text))
+    {
+        RODATA_START = .;
+        *(.rodata)
+        *(.rodata*)
+
+        . = ALIGN(16);
+        start_ctors = .;
+        KEEP(*(.init_array));
+        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array*)));
+        KEEP(*(.ctors));
+        KEEP(*(SORT_BY_INIT_PRIORITY(.ctors*)));
+        end_ctors = .;
+
+        . = ALIGN(16);
+        _fix_start = .;
+        KEEP(*(.fix));
+        _fix_end = .;
+
+        . = ALIGN(16);
+        BSS_ADDR = .;
+        QUAD(ABSOLUTE(BSS_START));
+        BSS_LENGTH = .;
+        QUAD(BSS_END - BSS_START);
+        FIX_START = .;
+        QUAD(ABSOLUTE(_fix_start));
+        FIX_END = .;
+        QUAD(ABSOLUTE(_fix_end));
+        PERCPU_PAGES = .;
+        QUAD(_PERCPU_PAGES);
+
+        . = ALIGN(0x1000);
+        RODATA_END = .;
+    } > KIMAGE
+
+    RODATA_PAGES = (RODATA_END - RODATA_START) / 0x1000;
+
+    .data : AT(LOADADDR(.rodata) + SIZEOF(.rodata))
+    {
+        DATA_START = .;
+        *(.data)
+        *(.data*)
+
+        *(.got)
+        *(.got.plt)
+
+        . = . + 4;
+        . = ALIGN(0x1000) - 4;
+        LONG(KERNEL_MAGIC);
+        DATA_END = .;
+    } > KIMAGE
+
+    DATA_PAGES = (DATA_END - DATA_START) / 0x1000;
+
+    _PERCPU_DATA_START = .;
+    .percpu 0 : AT(LOADADDR(.data) + SIZEOF(.data))
+    {
+        PERCPU_START = .;
+        QUAD(0); /* Reserved for x86 percpu pointer */
+        QUAD(0);
+
+        *(.percpu .percpu*)
+
+        . = ALIGN(0x1000);
+        PERCPU_END = .;
+    } > KPERCPU
+    _PERCPU_LENGTH = PERCPU_END - PERCPU_START;
+
+    _PERCPU_PAGES = _PERCPU_LENGTH / 0x1000;
+
+    .bss :
+    {
+        *(.bss.stack)
+        BSS_START = .;
+        *(.bss)
+        *(.bss*)
+
+        . = ALIGN(0x1000);
+        BSS_END = .;
+    } > KBSS
+
+    KIMAGE_PAGES = TEXT_PAGES + RODATA_PAGES + _PERCPU_PAGES + DATA_PAGES;
+    BSS_PAGES = (BSS_END - BSS_START) / 0x1000;
+    KERNEL_MAGIC = 0x01145140;
+
+    KIMAGE_32K_COUNT = (KIMAGE_PAGES * 0x1000 + 32 * 1024 - 1) / (32 * 1024);
+
+    .eh_frame :
+        AT(LOADADDR(.percpu) + SIZEOF(.percpu))
+    {
+        KEEP(*(.eh_frame*))
+        . = ALIGN(0x1000);
+    } > KIMAGE
+
+    /* Stabs debugging sections.  */
+    .stab          0 : { KEEP(*(.stab)); }
+    .stabstr       0 : { KEEP(*(.stabstr)); }
+    .stab.excl     0 : { KEEP(*(.stab.excl)); }
+    .stab.exclstr  0 : { KEEP(*(.stab.exclstr)); }
+    .stab.index    0 : { KEEP(*(.stab.index)); }
+    .stab.indexstr 0 : { KEEP(*(.stab.indexstr)); }
+    .comment       0 : { KEEP(*(.comment)); }
+    /* DWARF debug sections.
+       Symbols in the DWARF debugging sections are relative to the beginning
+       of the section so we begin them at 0.  */
+    /* DWARF 1 */
+    .debug          0 : { KEEP(*(.debug)); }
+    .line           0 : { KEEP(*(.line)); }
+    /* GNU DWARF 1 extensions */
+    .debug_srcinfo  0 : { KEEP(*(.debug_srcinfo)); }
+    .debug_sfnames  0 : { KEEP(*(.debug_sfnames)); }
+    /* DWARF 1.1 and DWARF 2 */
+    .debug_aranges  0 : { KEEP(*(.debug_aranges)); }
+    .debug_pubnames 0 : { KEEP(*(.debug_pubnames)); }
+    /* DWARF 2 */
+    .debug_info     0 : { KEEP(*(.debug_info)); }
+    .debug_abbrev   0 : { KEEP(*(.debug_abbrev)); }
+    .debug_line     0 : { KEEP(*(.debug_line)); }
+    .debug_frame    0 : { KEEP(*(.debug_frame)); }
+    .debug_str      0 : { KEEP(*(.debug_str)); }
+    .debug_loc      0 : { KEEP(*(.debug_loc)); }
+    .debug_macinfo  0 : { KEEP(*(.debug_macinfo)); }
+    /* SGI/MIPS DWARF 2 extensions */
+    .debug_weaknames 0 : { KEEP(*(.debug_weaknames)); }
+    .debug_funcnames 0 : { KEEP(*(.debug_funcnames)); }
+    .debug_typenames 0 : { KEEP(*(.debug_typenames)); }
+    .debug_varnames  0 : { KEEP(*(.debug_varnames)); }
+
+    /* DWARF Other */
+    .debug_ranges  0 : { KEEP(*(.debug_ranges)); }
+    .debug_line_str 0 : { KEEP(*(.debug_line_str)); }
+    /* Rust stuff */
+
+    /DISCARD/ :
+    {
+        *(.fini_array*)
+        *(.note*)
+        *(.dtors*)
+        *(.debug_gdb_scripts*)
+    }
+}

+ 3 - 0
arch/src/riscv64/mod.rs

@@ -0,0 +1,3 @@
+mod start;
+
+pub use self::start::*;

+ 10 - 0
arch/src/riscv64/start.rs

@@ -0,0 +1,10 @@
+extern "C" {
+    fn kernel_init();
+}
+
+/// bootstrap in rust
+#[no_mangle]
+pub fn start() {
+    // TODO: some init
+    unsafe { kernel_init() };
+}