luojia65 4 سال پیش
والد
کامیت
c62c38b4f5

+ 7 - 0
platform/k210/.cargo/config.toml

@@ -0,0 +1,7 @@
+[build]
+target = "riscv64gc-unknown-none-elf"
+
+[target.riscv64gc-unknown-none-elf]
+rustflags = [
+    "-C", "link-arg=-Tlink-k210.ld",
+]

+ 18 - 0
platform/k210/build.rs

@@ -0,0 +1,18 @@
+use std::env;
+use std::fs;
+use std::io::Write;
+use std::path::PathBuf;
+
+fn main() {
+    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
+
+    // Put the linker script somewhere the linker can find it
+    fs::File::create(out_dir.join("link-k210.ld"))
+        .unwrap()
+        .write_all(include_bytes!("link-k210.ld"))
+        .unwrap();
+    println!("cargo:rustc-link-search={}", out_dir.display());
+
+    println!("cargo:rerun-if-changed=build.rs");
+    println!("cargo:rerun-if-changed=link-k210.ld");
+}

+ 13 - 0
platform/k210/justfile

@@ -0,0 +1,13 @@
+target := "riscv64gc-unknown-none-elf"
+mode := "debug"
+build-path := "../../target/" + target + "/" + mode + "/"
+m-firmware-file := build-path + "rustsbi-k210"
+m-bin-file := build-path + "rustsbi-k210.bin"
+
+objcopy := "rust-objcopy --binary-architecture=riscv64"
+
+build: firmware
+    @{{objcopy}} {{m-firmware-file}} --strip-all -O binary {{m-bin-file}}
+
+firmware:
+    @cargo build --target={{target}}

+ 87 - 0
platform/k210/link-k210.ld

@@ -0,0 +1,87 @@
+MEMORY {
+    /* 存储单元的物理地址 */
+    SRAM : ORIGIN = 0x80000000, LENGTH = 2M
+}
+
+_max_hart_id = 2; 
+
+PROVIDE(_stext = 0x80000000);
+PROVIDE(_heap_size = 128K);
+PROVIDE(_hart_stack_size = 64K);
+
+REGION_ALIAS("REGION_TEXT", SRAM);
+REGION_ALIAS("REGION_RODATA", SRAM);
+REGION_ALIAS("REGION_DATA", SRAM);
+REGION_ALIAS("REGION_BSS", SRAM);
+REGION_ALIAS("REGION_HEAP", SRAM);
+REGION_ALIAS("REGION_STACK", SRAM);
+
+OUTPUT_ARCH(riscv)
+
+ENTRY(_start)
+
+PROVIDE(_stack_start = ORIGIN(REGION_STACK) + LENGTH(REGION_STACK));
+
+SECTIONS
+{
+    /* .text 字段 */
+    .text _stext : {
+        /* 把 entry 函数放在最前面 */
+        *(.text.entry)
+        /* 要链接的文件的 .text 字段集中放在这里 */
+        *(.text .text.*)
+        _etext = .;
+    } > REGION_TEXT
+
+    /* .rodata 字段 */
+    .rodata : ALIGN(4) {
+        _srodata = .;
+        /* 要链接的文件的 .rodata 字段集中放在这里 */
+        *(.rodata .rodata.*)
+        . = ALIGN(4);
+        _erodata = .;
+    } > REGION_RODATA
+
+    /* .data 字段 */
+    .data : ALIGN(4) { 
+        _sidata = LOADADDR(.data);
+        _sdata = .;
+        /* Must be called __global_pointer$ for linker relaxations to work. */
+        PROVIDE(__global_pointer$ = . + 0x800);
+        /* 要链接的文件的 .data 字段集中放在这里 */
+        *(.sdata .sdata.* .sdata2 .sdata2.*);
+        *(.data .data.*)
+        . = ALIGN(4);
+        _edata = .;
+    } > REGION_DATA
+
+    /* .bss 字段 */
+    .bss (NOLOAD) : {
+        _sbss = .;
+        /* 要链接的文件的 .bss 字段集中放在这里 */
+        *(.sbss .bss .bss.*)
+        . = ALIGN(4);
+        _ebss = .;
+    } > REGION_BSS
+
+    .heap (NOLOAD) : {
+        _sheap = .;
+        . += _heap_size;
+        . = ALIGN(4);
+        _eheap = .;
+    } > REGION_HEAP
+
+    /* fictitious region that represents the memory available for the stack */
+    .stack (NOLOAD) : {
+        _estack = .;
+        . = _stack_start;
+        . = ALIGN(4);
+        _sstack = .;
+    } > REGION_STACK
+
+    /* Discard .eh_frame, we are not doing unwind on panic so it is not needed */
+    /DISCARD/ :
+    {
+        *(.eh_frame .eh_frame_hdr);
+    }
+}

+ 1 - 1
platform/k210/src/main.rs

@@ -78,7 +78,7 @@ _s_mode_start:
     ld ra, %pcrel_lo(1b)(ra)
     jr ra
 .align  3
-1:  .dword _start_payload /* defined by firmware-k210 */
+1:  .dword 0x80200000
 "
 );
 

+ 3 - 3
platform/qemu/.cargo/config.toml

@@ -1,7 +1,7 @@
 [build]
-target = "riscv64imac-unknown-none-elf"
+target = "riscv64gc-unknown-none-elf"
 
-[target.riscv64imac-unknown-none-elf]
+[target.riscv64gc-unknown-none-elf]
 rustflags = [
-    "-C", "link-arg=-Tlink.ld",
+    "-C", "link-arg=-Tlink-qemu.ld",
 ]

+ 3 - 3
platform/qemu/build.rs

@@ -7,12 +7,12 @@ fn main() {
     let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
 
     // Put the linker script somewhere the linker can find it
-    fs::File::create(out_dir.join("link.ld"))
+    fs::File::create(out_dir.join("link-qemu.ld"))
         .unwrap()
-        .write_all(include_bytes!("link.ld"))
+        .write_all(include_bytes!("link-qemu.ld"))
         .unwrap();
     println!("cargo:rustc-link-search={}", out_dir.display());
 
     println!("cargo:rerun-if-changed=build.rs");
-    println!("cargo:rerun-if-changed=link.ld");
+    println!("cargo:rerun-if-changed=link-qemu.ld");
 }

+ 0 - 0
platform/qemu/link.ld → platform/qemu/link-qemu.ld