Skip to content

Commit 9724397

Browse files
authored
✨ feat: 添加 RISC-V64 架构支持 (#65)
* ✨ feat: 添加 RISC-V64 架构支持 * ✨ feat(riscv64): 调整陷阱帧对齐并移除平台差异化代码 * ✨ feat(riscv64): 更新内核虚拟地址并增强内存映射功能 * ✨ feat(riscv64): 增强 RISC-V64 启动流程,添加多核支持和内存管理功能 * ✨ feat(riscv64): 添加 RISC-V64 架构支持到 CI 流程,并增强测试脚本的错误处理 * ✨ feat(riscv64): 优化代码格式,简化错误处理逻辑 * ✨ refactor(riscv64): 修正配置文件路径,简化启动流程中的错误处理 * ✨ fix(riscv64): 修正 RISC-V Linux 镜像魔术值的常量定义 * ✨ refactor(ci): 更新 CI 配置,简化系统依赖安装步骤并移除不必要的 QEMU 设置 * ✨ feat(container): 添加容器镜像发布工作流和 Dockerfile
1 parent 237b1db commit 9724397

38 files changed

Lines changed: 1385 additions & 65 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Publish Container Image
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- container/**
9+
- rust-toolchain.toml
10+
- .github/workflows/container-publish.yml
11+
workflow_dispatch:
12+
13+
permissions: {}
14+
15+
jobs:
16+
publish:
17+
runs-on: ubuntu-latest
18+
permissions:
19+
contents: read
20+
packages: write
21+
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v6
25+
26+
- name: Prepare image metadata
27+
id: prep
28+
run: |
29+
echo "image=ghcr.io/${GITHUB_REPOSITORY,,}-container" >> "$GITHUB_OUTPUT"
30+
echo "sha_tag=sha-${GITHUB_SHA}" >> "$GITHUB_OUTPUT"
31+
echo "rust_toolchain=$(sed -n 's/^channel = \"\\(.*\\)\"$/\\1/p' rust-toolchain.toml)" >> "$GITHUB_OUTPUT"
32+
33+
- name: Log in to GitHub Container Registry
34+
env:
35+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36+
run: |
37+
echo "${GITHUB_TOKEN}" | docker login ghcr.io -u "${GITHUB_ACTOR}" --password-stdin
38+
39+
- name: Build container image
40+
run: |
41+
docker build \
42+
--build-arg RUST_TOOLCHAIN="${{ steps.prep.outputs.rust_toolchain }}" \
43+
-t "${{ steps.prep.outputs.image }}:latest" \
44+
-t "${{ steps.prep.outputs.image }}:${{ steps.prep.outputs.sha_tag }}" \
45+
-f container/Dockerfile \
46+
container
47+
48+
- name: Push container image
49+
run: |
50+
docker push "${{ steps.prep.outputs.image }}:latest"
51+
docker push "${{ steps.prep.outputs.image }}:${{ steps.prep.outputs.sha_tag }}"

.github/workflows/test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ jobs:
2121
target: loongarch64-unknown-none-softfloat
2222
- arch: aarch64
2323
target: aarch64-unknown-none-softfloat
24+
- arch: riscv64
25+
target: riscv64gc-unknown-none-elf
2426
- arch: x86_64
2527
target: x86_64-unknown-none
2628
runs-on: ubuntu-latest
@@ -32,6 +34,7 @@ jobs:
3234
with:
3335
packages: libudev-dev
3436
version: 1.0
37+
3538
- name: Install toolchain
3639
run: rustup show
3740
- name: Check rust version

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build-config/riscv64.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[system.Cargo]
2+
args = [
3+
"-Z",
4+
"build-std=core,alloc",
5+
"--config",
6+
".cargo/config-app.toml",
7+
]
8+
features = [
9+
"sparreal-rt/uspace",
10+
]
11+
package = "helloworld"
12+
post_build_cmds = []
13+
pre_build_cmds = []
14+
target = "riscv64gc-unknown-none-elf"
15+
to_bin = true
16+
17+
[system.Cargo.env]

container/Dockerfile

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
FROM ubuntu:24.04
2+
3+
ARG DEBIAN_FRONTEND=noninteractive
4+
ARG QEMU_VERSION=10.2.1
5+
ARG RUST_TOOLCHAIN=nightly
6+
7+
ENV TZ=Etc/UTC \
8+
RUSTUP_HOME=/opt/rustup \
9+
CARGO_HOME=/opt/cargo \
10+
PATH=/opt/cargo/bin:/opt/qemu-${QEMU_VERSION}/bin:${PATH}
11+
12+
RUN apt-get update \
13+
&& apt-get install -y --no-install-recommends \
14+
ca-certificates \
15+
build-essential \
16+
clang \
17+
curl \
18+
git \
19+
libglib2.0-dev \
20+
libpixman-1-dev \
21+
libslirp-dev \
22+
libudev-dev \
23+
make \
24+
ninja-build \
25+
pkg-config \
26+
python3 \
27+
wget \
28+
xz-utils \
29+
zlib1g-dev \
30+
&& rm -rf /var/lib/apt/lists/*
31+
32+
RUN set -eux; \
33+
wget -O /tmp/qemu.tar.xz "https://download.qemu.org/qemu-${QEMU_VERSION}.tar.xz"; \
34+
tar -xf /tmp/qemu.tar.xz -C /tmp; \
35+
cd "/tmp/qemu-${QEMU_VERSION}"; \
36+
./configure \
37+
--prefix="/opt/qemu-${QEMU_VERSION}" \
38+
--target-list=loongarch64-softmmu,riscv64-softmmu,aarch64-softmmu,x86_64-softmmu \
39+
--enable-slirp \
40+
--disable-docs \
41+
--disable-gtk \
42+
--disable-sdl \
43+
--disable-vte \
44+
--disable-werror; \
45+
make -j"$(nproc)"; \
46+
make install; \
47+
rm -rf "/tmp/qemu-${QEMU_VERSION}" /tmp/qemu.tar.xz
48+
49+
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
50+
| sh -s -- -y --profile minimal --default-toolchain "${RUST_TOOLCHAIN}"
51+
52+
RUN rustup component add rust-src llvm-tools rustfmt clippy cargo \
53+
&& rustup target add \
54+
x86_64-unknown-none \
55+
riscv64gc-unknown-none-elf \
56+
aarch64-unknown-none-softfloat \
57+
loongarch64-unknown-none-softfloat \
58+
&& cargo install --locked \
59+
cargo-binutils \
60+
cargo-hack \
61+
ostool
62+
63+
WORKDIR /workspace
64+
65+
CMD ["/bin/bash"]

crates/someboot/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ some-serial = "0.3"
6060
uefi.workspace = true
6161
x86 = "0.52"
6262

63+
[target.'cfg(target_arch = "riscv64")'.dependencies]
64+
sbi-rt = { version = "0.0.3", features = ["legacy"] }
65+
6366
[build-dependencies]
6467
prettyplease = "0.2"
6568
quote = "1.0"

crates/someboot/build-info.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ rustflags = [
3232
"-Clink-args=-pie",
3333
"-Clink-args=-znostart-stop-gc",
3434
]
35-
cargoargs = ["-Z", "build-std=core,alloc"]
35+
cargoargs = ["-Z", "build-std=core,alloc"]

crates/someboot/build.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,22 @@ impl Build {
156156
}
157157

158158
fn prepare_riscv64(&mut self) {
159-
self.kernel_vaddr = 0;
159+
let ld_src = "src/arch/riscv64/link.ld";
160+
161+
if self.uspace {
162+
self.kernel_vaddr = 0xffff_ffff_8000_0000;
163+
} else {
164+
self.kernel_vaddr = 0x8020_0000;
165+
}
166+
167+
let kernel_load_vaddr = self.kernel_vaddr as usize;
168+
let ld = include_str!("src/arch/riscv64/link.ld")
169+
.replace("${kernel_load_vaddr}", &format!("{kernel_load_vaddr:#x}"));
170+
171+
println!("cargo:rerun-if-changed={ld_src}");
172+
160173
let ld_dst = self.out_dir.join(Self::LD_NAME);
161-
fs::write(ld_dst, "SECTIONS {}\n").unwrap();
174+
fs::write(ld_dst, ld).unwrap();
162175
}
163176

164177
fn gen_defines(&self) {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub struct Console;
2+
3+
impl crate::console::ArchConsoleOps for Console {}

crates/someboot/src/arch/aarch64/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#[macro_use]
22
mod _macros;
3+
mod console;
34

45
#[cfg(feature = "hv")]
56
#[path = "el2/mod.rs"]
@@ -36,6 +37,7 @@ pub struct Arch;
3637

3738
impl ArchTrait for Arch {
3839
type P = paging::Generic;
40+
type Console = console::Console;
3941

4042
fn _va(paddr: usize) -> *mut u8 {
4143
(paddr + PAGE_OFFSET) as *mut u8

0 commit comments

Comments
 (0)