1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-21 23:56:18 +04:00

add aarch64 bootloader framework

This commit is contained in:
equation314 2019-03-04 15:22:19 +08:00
parent 738554386b
commit b94ba7759e
15 changed files with 188 additions and 32 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ target
Cargo.lock Cargo.lock
!kernel/Cargo.lock !kernel/Cargo.lock
!bootloader/Cargo.lock
!user/Cargo.lock !user/Cargo.lock
.DS_Store .DS_Store

6
bootloader/Cargo.lock generated Normal file
View File

@ -0,0 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "rcore-bootloader"
version = "0.1.0"

7
bootloader/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "rcore-bootloader"
version = "0.1.0"
authors = ["equation314 <equation618@gmail.com>"]
edition = "2018"
[dependencies]

20
bootloader/Makefile Normal file
View File

@ -0,0 +1,20 @@
arch ?= aarch64
mode ?= debug
target := $(arch)
bootloader := target/$(target)/$(mode)/rcore-bootloader
build_args := --target=targets/$(arch).json
ifeq ($(mode), release)
build_args += --release
endif
.PHONY: all clean
all: $(bootloader)
$(bootloader):
@cargo xbuild $(build_args)
clean:
@cargo clean

View File

@ -1,8 +1,9 @@
# TODO rewrite in Rust, use crate cortex-a # TODO rewrite in Rust, use crate cortex-a
.section .text.boot .section .text.boot
.globl _start
boot: _start:
# read cpu affinity, start core 0, halt rest # read cpu affinity, start core 0, halt rest
mrs x1, mpidr_el1 mrs x1, mpidr_el1
and x1, x1, #3 and x1, x1, #3
@ -104,11 +105,7 @@ zero_bss_loop:
cbnz x2, zero_bss_loop cbnz x2, zero_bss_loop
zero_bss_loop_end: zero_bss_loop_end:
b _start
.section .text.entry
.globl _start
_start:
# jump to rust_main, which shouldn't return. halt if it does # jump to rust_main, which shouldn't return. halt if it does
bl rust_main mov x9, #0x100000
blr x9
b halt b halt

View File

@ -0,0 +1,45 @@
ENTRY(_start)
SECTIONS {
. = 0x80000; /* Raspbery Pi 3 AArch64 (kernel8.img) load address */
.text : {
stext = .;
KEEP(*(.text.boot)) /* from boot.S */
*(.text .text.* .gnu.linkonce.t*)
. = ALIGN(4K);
etext = .;
}
.rodata : {
srodata = .;
*(.rodata .rodata.* .gnu.linkonce.r*)
. = ALIGN(4K);
erodata = .;
}
.data : {
sdata = .;
*(.data .data.* .gnu.linkonce.d*)
. = ALIGN(4K);
edata = .;
}
.bss (NOLOAD) : {
. = ALIGN(32);
sbss = .;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(4K);
ebss = .;
}
/* end of the binary */
_end = ALIGN(8);
/* number of bytes in BSS section and complete binary */
__bss_length = (ebss - sbss);
__binary_length = (_end - _start);
/DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
}

View File

@ -0,0 +1 @@
global_asm!(include_str!("boot.S"));

15
bootloader/src/main.rs Normal file
View File

@ -0,0 +1,15 @@
#![no_std]
#![no_main]
#![feature(global_asm)]
use core::panic::PanicInfo;
#[panic_handler]
#[no_mangle]
pub extern "C" fn panic(_info: &PanicInfo) -> ! {
loop {}
}
#[cfg(target_arch = "aarch64")]
#[path = "arch/aarch64/mod.rs"]
pub mod arch;

View File

@ -0,0 +1,36 @@
{
"abi-blacklist": [
"stdcall",
"fastcall",
"vectorcall",
"thiscall",
"win64",
"sysv64"
],
"arch": "aarch64",
"data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128",
"executables": true,
"linker": "rust-lld",
"linker-flavor": "ld.lld",
"linker-is-gnu": true,
"pre-link-args": {
"ld.lld": [
"-Tsrc/arch/aarch64/boot.ld"
]
},
"llvm-target": "aarch64-unknown-none",
"no-compiler-rt": true,
"features": "+a53,+strict-align,-neon",
"max-atomic-width": 128,
"os": "none",
"panic": "abort",
"panic-strategy": "abort",
"relocation-model": "static",
"position-independent-executables": true,
"target-c-int-width": "32",
"target-endian": "little",
"target-pointer-width": "64",
"target-family": "unix",
"disable-redzone": true,
"eliminate-frame-pointer": false
}

View File

@ -27,9 +27,9 @@ board_u540 = ["sv39"]
# (for aarch64 RaspberryPi3) # (for aarch64 RaspberryPi3)
nographic = [] nographic = []
board_raspi3 = ["bcm2837", "link_user"] board_raspi3 = ["bcm2837", "link_user"]
raspi3_use_generic_timer = ["bcm2837/use_generic_timer"]
# (for riscv64) # (for riscv64)
board_k210 = ["m_mode"] board_k210 = ["m_mode"]
raspi3_use_generic_timer = ["bcm2837/use_generic_timer"]
# Hard link user program # Hard link user program
link_user = [] link_user = []

View File

@ -32,8 +32,12 @@ m_mode ?=
target := $(arch) target := $(arch)
kernel := target/$(target)/$(mode)/rcore kernel := target/$(target)/$(mode)/rcore
bin := target/$(target)/$(mode)/kernel.bin boot_bin := target/$(target)/$(mode)/boot.bin
kernel_bin := target/$(target)/$(mode)/kernel.bin
kernel_img := target/$(target)/$(mode)/kernel.img
bootimage := target/$(target)/bootimage.bin bootimage := target/$(target)/bootimage.bin
bootloader_dir = ../bootloader
bootloader := $(bootloader_dir)/target/$(target)/$(mode)/rcore-bootloader
bbl_path := $(PWD)/../riscv-pk bbl_path := $(PWD)/../riscv-pk
user_dir := ../user user_dir := ../user
k210_lib := ../tools/k210/libkendryte.a k210_lib := ../tools/k210/libkendryte.a
@ -53,9 +57,7 @@ endif
export M_MODE = $(m_mode) export M_MODE = $(m_mode)
ifeq ($(arch), aarch64) ifeq ($(arch), aarch64)
graphic ?= on graphic := on
else
graphic ?= off
endif endif
### qemu options ### ### qemu options ###
@ -76,7 +78,7 @@ qemu_net_opts += \
else ifeq ($(arch), riscv32) else ifeq ($(arch), riscv32)
qemu_opts += \ qemu_opts += \
-machine virt \ -machine virt \
-kernel $(bin) \ -kernel $(kernel_img) \
-drive file=$(SFSIMG),format=raw,id=sfs \ -drive file=$(SFSIMG),format=raw,id=sfs \
-device virtio-blk-device,drive=sfs -device virtio-blk-device,drive=sfs
qemu_net_opts += \ qemu_net_opts += \
@ -89,7 +91,7 @@ endif
else ifeq ($(arch), riscv64) else ifeq ($(arch), riscv64)
qemu_opts += \ qemu_opts += \
-machine virt \ -machine virt \
-kernel $(bin) \ -kernel $(kernel_img) \
-drive file=$(SFSIMG),format=raw,id=sfs \ -drive file=$(SFSIMG),format=raw,id=sfs \
-device virtio-blk-device,drive=sfs -device virtio-blk-device,drive=sfs
qemu_net_opts += \ qemu_net_opts += \
@ -103,7 +105,7 @@ else ifeq ($(arch), aarch64)
qemu_opts += \ qemu_opts += \
-machine $(board) \ -machine $(board) \
-serial null -serial mon:stdio \ -serial null -serial mon:stdio \
-kernel $(bin) -kernel $(kernel_img)
endif endif
ifdef d ifdef d
@ -170,7 +172,7 @@ objdump := $(prefix)objdump
objcopy := $(prefix)objcopy objcopy := $(prefix)objcopy
cc := $(prefix)gcc cc := $(prefix)gcc
as := $(prefix)as as := $(prefix)as
gdb := gdb gdb := $(prefix)gdb
export CC=$(cc) export CC=$(cc)
.PHONY: all clean run build asm doc justrun debug kernel sfsimg install runnet .PHONY: all clean run build asm doc justrun debug kernel sfsimg install runnet
@ -179,6 +181,7 @@ all: kernel
clean: clean:
@cargo clean @cargo clean
@cd $(bootloader_dir) && make clean
@cd $(user_dir) && make clean @cd $(user_dir) && make clean
doc: doc:
@ -199,12 +202,12 @@ justrunui: build
-device virtio-gpu-device \ -device virtio-gpu-device \
-device virtio-mouse-device -device virtio-mouse-device
debug: $(kernel) $(bin) debug: $(kernel) $(kernel_img)
@qemu-system-$(arch) $(qemu_opts) -s -S & @qemu-system-$(arch) $(qemu_opts) -s -S &
@sleep 1 @sleep 1
@$(gdb) $(kernel) -x ../tools/gdbinit @$(gdb) $(kernel) -x ../tools/gdbinit
build: $(bin) build: $(kernel_img)
asm: asm:
@$(objdump) -dS $(kernel) | less @$(objdump) -dS $(kernel) | less
@ -215,7 +218,13 @@ header:
sym: sym:
@$(objdump) -t $(kernel) | less @$(objdump) -t $(kernel) | less
$(bin): kernel $(bootloader):
ifeq ($(arch), aarch64)
@echo Building $(arch) bootloader
cd $(bootloader_dir) && make arch=$(arch) mode=$(mode)
endif
$(kernel_img): $(bootloader) kernel
ifeq ($(arch), riscv32) ifeq ($(arch), riscv32)
@mkdir -p target/$(target)/bbl && \ @mkdir -p target/$(target)/bbl && \
cd target/$(target)/bbl && \ cd target/$(target)/bbl && \
@ -243,10 +252,14 @@ else
cp bbl $(abspath $@) cp bbl $(abspath $@)
endif endif
else ifeq ($(arch), aarch64) else ifeq ($(arch), aarch64)
@$(objcopy) $(kernel) --strip-all -O binary $@ @$(objcopy) $(bootloader) --strip-all -O binary $(boot_bin)
@$(objcopy) $(kernel) --strip-all -O binary $(kernel_bin)
dd if=$(boot_bin) of=$@ conv=notrunc
dd if=$(kernel_bin) of=$@ seek=1024 conv=notrunc
endif endif
kernel: kernel:
@echo Building $(arch) kernel
ifeq ($(arch), x86_64) ifeq ($(arch), x86_64)
@bootimage build $(build_args) @bootimage build $(build_args)
else ifeq ($(arch), riscv32) else ifeq ($(arch), riscv32)
@ -287,8 +300,8 @@ endif
ifdef sd_card ifdef sd_card
.PHONY: .PHONY:
install: $(bin) install: $(kernel_img)
cp $(bin) $(sd_card)/kernel8.img cp $(kernel_img) $(sd_card)/kernel8.img
sudo umount $(sd_card) sudo umount $(sd_card)
endif endif
@ -296,9 +309,9 @@ endif
ifeq ($(board), k210) ifeq ($(board), k210)
.PHONY: .PHONY:
install: $(bin) install: $(kernel_img)
## baudrate no more than 600000 ## baudrate no more than 600000
@python3 ../tools/k210/kflash.py $(bin) -b 600000 @python3 ../tools/k210/kflash.py $(kernel_img) -b 600000
endif endif
.PHONY: .PHONY:

View File

@ -0,0 +1,21 @@
.section .text.entry
.globl _start
_start:
ldr x0, =bootstacktop
mov sp, x0
zero_bss:
# load the start address and number of bytes in BSS section
ldr x1, =sbss
ldr x2, =__bss_length
zero_bss_loop:
# zero out the BSS section, 64-bits at a time
cbz x2, zero_bss_loop_end
str xzr, [x1], #8
sub x2, x2, #8
cbnz x2, zero_bss_loop
zero_bss_loop_end:
bl rust_main

View File

@ -1,12 +1,6 @@
ENTRY(_start) ENTRY(_start)
SECTIONS { SECTIONS {
. = 0x80000; /* Raspbery Pi 3 AArch64 (kernel8.img) load address */
.boot : {
KEEP(*(.text.boot)) /* from boot.S */
}
. = 0x100000; /* Load the kernel at this address. It's also kernel stack top address */ . = 0x100000; /* Load the kernel at this address. It's also kernel stack top address */
bootstacktop = .; bootstacktop = .;

View File

@ -12,7 +12,7 @@ pub mod driver;
#[path = "board/raspi3/mod.rs"] #[path = "board/raspi3/mod.rs"]
pub mod board; pub mod board;
global_asm!(include_str!("boot/boot.S")); global_asm!(include_str!("entry.S"));
/// The entry point of kernel /// The entry point of kernel
#[no_mangle] // don't mangle the name of this function #[no_mangle] // don't mangle the name of this function

View File

@ -15,7 +15,7 @@
"linker-is-gnu": true, "linker-is-gnu": true,
"pre-link-args": { "pre-link-args": {
"ld.lld": [ "ld.lld": [
"-Tsrc/arch/aarch64/boot/linker.ld" "-Tsrc/arch/aarch64/linker.ld"
] ]
}, },
"llvm-target": "aarch64-unknown-none", "llvm-target": "aarch64-unknown-none",