소스 검색

fix: migrate to Rust 2024 edition and refactor code (#88)

* fix(lib): migrate RustSBI project to Rust 2024 edition

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>

* fix(rt): use 2024-edition expr in internal macros

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>

* fix(macros): use variable name `generated` to avoid `r#` prefixed name in 2024 edition

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>

* fix(workflow): upgrade rustfmt toolchain to support 2024 edition code format checks

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>

* fix(workflow): use nightly Rustc toolchain to support 2024 edition

Add TODOs on MSRV checks

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>

---------

Signed-off-by: Zhouqi Jiang <luojia@hust.edu.cn>
Luo Jia / Zhouqi Jiang 1 개월 전
부모
커밋
1103763803

+ 5 - 4
.github/workflows/Rust.yml

@@ -20,6 +20,7 @@ jobs:
       - uses: actions-rust-lang/setup-rust-toolchain@v1
         with:
           components: rustfmt
+          toolchain: nightly # support 2024 edition rustfmt checks
       - name: Cache Dependencies
         uses: Swatinem/rust-cache@v2
       - name: Rustfmt Check
@@ -31,8 +32,8 @@ jobs:
     needs: fmt
     strategy:
       matrix:
+        TOOLCHAIN: [nightly] # todo: MSRV checks
         TARGET: [riscv64imac-unknown-none-elf, riscv32imac-unknown-none-elf]
-        TOOLCHAIN: [stable, nightly]
     steps:
       - uses: actions/checkout@v4
       - uses: actions-rust-lang/setup-rust-toolchain@v1
@@ -63,7 +64,7 @@ jobs:
       - uses: actions/checkout@v4
       - uses: actions-rust-lang/setup-rust-toolchain@v1
         with:
-          toolchain: stable
+          toolchain: nightly # TODO MSRV checks
       - uses: Swatinem/rust-cache@v2
       - name: Run tests (no default features)
         run: |
@@ -81,7 +82,7 @@ jobs:
       - uses: actions/checkout@v4
       - uses: actions-rust-lang/setup-rust-toolchain@v1
         with:
-          toolchain: stable
+          toolchain: nightly # TODO MSRV checks
       - uses: Swatinem/rust-cache@v2
       # - name: Check clippy
       #   run: cargo clippy -- -D warnings
@@ -100,7 +101,7 @@ jobs:
       - uses: actions-rust-lang/setup-rust-toolchain@v1
         with:
           target: ${{ matrix.TARGET }}
-          toolchain: stable
+          toolchain: nightly # TODO MSRV checks
       - uses: Swatinem/rust-cache@v2
       - name: Build
         run: |

+ 1 - 0
CHANGELOG.md

@@ -18,6 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ### Modified
 
+- Migrate sbi-rt crate to Rust 2024 edition.
 - susp: amend documentation on `system_suspend` function.
 - lib: replace map+unwrap_or with Option::map_or in impls
 

+ 1 - 1
Cargo.toml

@@ -51,7 +51,7 @@ members = [
 ]
 
 [workspace.package]
-edition = "2021"
+edition = "2024"
 license = "MulanPSL-2.0 OR MIT"
 repository = "https://github.com/rustsbi/rustsbi"
 

+ 16 - 0
macros/CHANGELOG.md

@@ -0,0 +1,16 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres
+to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+### Added
+
+### Modified
+
+- Migrate rustsbi-macros crate to Rust 2024 edition.
+
+### Fixed

+ 7 - 7
macros/src/lib.rs

@@ -4,10 +4,10 @@
 
 use proc_macro::TokenStream;
 use proc_macro2::Span;
-use quote::{quote, ToTokens};
+use quote::{ToTokens, quote};
 use syn::{
-    parse_macro_input, Data, DeriveInput, GenericParam, Generics, Ident, Lifetime, LifetimeParam,
-    Member,
+    Data, DeriveInput, GenericParam, Generics, Ident, Lifetime, LifetimeParam, Member,
+    parse_macro_input,
 };
 
 #[derive(Clone)]
@@ -338,7 +338,7 @@ fn impl_derive_rustsbi_static(name: &Ident, imp: StaticImpl, generics: &Generics
         })
     }
     let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-    let gen = quote! {
+    let generated = quote! {
     impl #impl_generics ::rustsbi::RustSBI for #name #ty_generics #where_clause {
         #[inline]
         fn handle_ecall(&self, extension: usize, function: usize, param: [usize; 6]) -> ::rustsbi::SbiRet {
@@ -349,7 +349,7 @@ fn impl_derive_rustsbi_static(name: &Ident, imp: StaticImpl, generics: &Generics
         }
     }
         };
-    gen.into()
+    generated.into()
 }
 
 fn impl_derive_rustsbi_dynamic(name: &Ident, imp: DynamicImpl, generics: &Generics) -> TokenStream {
@@ -573,7 +573,7 @@ fn impl_derive_rustsbi_dynamic(name: &Ident, imp: DynamicImpl, generics: &Generi
         }
     };
     let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-    let gen = quote! {
+    let generated = quote! {
         impl #impl_generics ::rustsbi::RustSBI for #name #ty_generics #where_clause {
             #[inline]
             fn handle_ecall(&self, extension: usize, function: usize, param: [usize; 6]) -> ::rustsbi::SbiRet {
@@ -599,5 +599,5 @@ fn impl_derive_rustsbi_dynamic(name: &Ident, imp: DynamicImpl, generics: &Generi
             }
         }
     };
-    gen.into()
+    generated.into()
 }

+ 1 - 0
sbi-rt/CHANGELOG.md

@@ -16,6 +16,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 ### Modified
 
 - pmu: change `counter_idx_mask` and `counter_idx_base` parameters into `counter_idx` with type `CounterMask`.
+- Migrate sbi-rt crate to Rust 2024 edition.
 
 ### Fixed
 

+ 2 - 2
sbi-rt/src/base.rs

@@ -3,8 +3,8 @@
 use crate::binary::{sbi_call_0, sbi_call_1};
 
 use sbi_spec::base::{
-    Version, EID_BASE, GET_MARCHID, GET_MIMPID, GET_MVENDORID, GET_SBI_IMPL_ID,
-    GET_SBI_IMPL_VERSION, GET_SBI_SPEC_VERSION, PROBE_EXTENSION,
+    EID_BASE, GET_MARCHID, GET_MIMPID, GET_MVENDORID, GET_SBI_IMPL_ID, GET_SBI_IMPL_VERSION,
+    GET_SBI_SPEC_VERSION, PROBE_EXTENSION, Version,
 };
 
 /// Return the current SBI specification version.

+ 1 - 1
sbi-rt/src/nacl.rs

@@ -4,7 +4,7 @@ use crate::binary::{sbi_call_0, sbi_call_1, sbi_call_3};
 
 use sbi_spec::{
     binary::{SbiRet, SharedPtr},
-    nacl::{shmem_size, EID_NACL, PROBE_FEATURE, SET_SHMEM, SYNC_CSR, SYNC_HFENCE, SYNC_SRET},
+    nacl::{EID_NACL, PROBE_FEATURE, SET_SHMEM, SYNC_CSR, SYNC_HFENCE, SYNC_SRET, shmem_size},
 };
 
 /// Probe a nested acceleration feature.

+ 2 - 2
sbi-rt/src/pmu.rs

@@ -5,8 +5,8 @@ use crate::binary::{sbi_call_0, sbi_call_1, sbi_call_3};
 use sbi_spec::{
     binary::{CounterMask, SbiRet, SharedPtr},
     pmu::{
-        shmem_size::SIZE, COUNTER_CONFIG_MATCHING, COUNTER_FW_READ, COUNTER_FW_READ_HI,
-        COUNTER_GET_INFO, COUNTER_START, COUNTER_STOP, EID_PMU, NUM_COUNTERS, SNAPSHOT_SET_SHMEM,
+        COUNTER_CONFIG_MATCHING, COUNTER_FW_READ, COUNTER_FW_READ_HI, COUNTER_GET_INFO,
+        COUNTER_START, COUNTER_STOP, EID_PMU, NUM_COUNTERS, SNAPSHOT_SET_SHMEM, shmem_size::SIZE,
     },
 };
 

+ 2 - 0
sbi-spec/CHANGELOG.md

@@ -19,6 +19,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 
 ### Modified
 
+- Migrate sbi-rt crate to Rust 2024 edition.
+
 ### Fixed
 
 ## [0.0.8] - 2024-10-25

+ 2 - 2
sbi-spec/src/binary.rs

@@ -879,7 +879,7 @@ impl SbiRet {
     /// ```
     #[inline]
     pub unsafe fn unwrap_unchecked(self) -> usize {
-        self.into_result().unwrap_unchecked()
+        unsafe { self.into_result().unwrap_unchecked() }
     }
 
     /// Returns the contained `Error` value, consuming the `self` value,
@@ -905,7 +905,7 @@ impl SbiRet {
     /// ```
     #[inline]
     pub unsafe fn unwrap_err_unchecked(self) -> Error {
-        self.into_result().unwrap_err_unchecked()
+        unsafe { self.into_result().unwrap_err_unchecked() }
     }
 }
 

+ 1 - 0
sbi-testing/CHANGELOG.md

@@ -13,6 +13,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ### Modified
 
+- Migrate sbi-rt crate to Rust 2024 edition.
 - Update sbi-spec to version 0.0.7
 - Update sbi-rt to version 0.0.3
 - Rename `MArchId` and `MVendorId` into `MarchId` and `MvendorId` in `BaseCase`

+ 12 - 8
sbi-testing/src/hsm.rs

@@ -235,18 +235,22 @@ fn test_batch(batch: &[usize], mut f: impl FnMut(Case)) -> bool {
 /// 测试用启动入口
 #[naked]
 unsafe extern "C" fn test_entry(hartid: usize, opaque: *mut ItemPerHart) -> ! {
-    core::arch::naked_asm!(
-        "csrw sie, zero",   // 关中断
-        "call {set_stack}", // 设置栈
-        "j    {rust_main}", // 进入 rust
-        set_stack = sym set_stack,
-        rust_main = sym rust_main,
-    )
+    unsafe {
+        core::arch::naked_asm!(
+            "csrw sie, zero",   // 关中断
+            "call {set_stack}", // 设置栈
+            "j    {rust_main}", // 进入 rust
+            set_stack = sym set_stack,
+            rust_main = sym rust_main,
+        )
+    }
 }
 
 #[naked]
 unsafe extern "C" fn set_stack(hart_id: usize, ptr: *const ItemPerHart) {
-    core::arch::naked_asm!("addi sp, a1, 512", "ret");
+    unsafe {
+        core::arch::naked_asm!("addi sp, a1, 512", "ret");
+    }
 }
 
 #[inline(never)]

+ 5 - 5
sbi-testing/src/lib.rs

@@ -16,22 +16,22 @@ pub use log_test::Testing;
 
 // §4
 mod base;
-pub use base::{test as test_base, Case as BaseCase, Extensions};
+pub use base::{Case as BaseCase, Extensions, test as test_base};
 // §6
 mod time;
-pub use time::{test as test_timer, Case as TimerCase};
+pub use time::{Case as TimerCase, test as test_timer};
 // §7
 mod spi;
-pub use spi::{test as test_ipi, Case as IpiCase};
+pub use spi::{Case as IpiCase, test as test_ipi};
 // §8
 // pub mod rfnc;
 // §9
 mod hsm;
-pub use hsm::{test as test_hsm, Case as HsmCase};
+pub use hsm::{Case as HsmCase, test as test_hsm};
 // §10
 // pub mod srst;
 // §11
 // pub mod pmu;
 // §12
 mod dbcn;
-pub use dbcn::{test as test_dbcn, Case as DbcnCase};
+pub use dbcn::{Case as DbcnCase, test as test_dbcn};

+ 49 - 45
sbi-testing/src/thread.rs

@@ -1,4 +1,4 @@
-/// 线程上下文。
+/// 线程上下文。
 #[repr(C)]
 pub struct Thread {
     sctx: usize,
@@ -71,16 +71,17 @@ impl Thread {
     /// 将修改 `sscratch`、`sepc`、`sstatus` 和 `stvec`。
     #[inline]
     pub unsafe fn execute(&mut self) -> usize {
-        // 设置线程仍在 S 态并打开中断
-        let mut sstatus: usize;
-        core::arch::asm!("csrr {}, sstatus", out(reg) sstatus);
-        const PREVILEGE_BIT: usize = 1 << 8;
-        const INTERRUPT_BIT: usize = 1 << 5;
-        sstatus |= PREVILEGE_BIT | INTERRUPT_BIT;
-        // 执行线程
-        // TODO support RV32 instruction set
-        core::arch::asm!(
-            "   csrw sscratch, {sscratch}
+        unsafe {
+            // 设置线程仍在 S 态并打开中断
+            let mut sstatus: usize;
+            core::arch::asm!("csrr {}, sstatus", out(reg) sstatus);
+            const PREVILEGE_BIT: usize = 1 << 8;
+            const INTERRUPT_BIT: usize = 1 << 5;
+            sstatus |= PREVILEGE_BIT | INTERRUPT_BIT;
+            // 执行线程
+            // TODO support RV32 instruction set
+            core::arch::asm!(
+                "   csrw sscratch, {sscratch}
                 csrw sepc    , {sepc}
                 csrw sstatus , {sstatus}
                 addi sp, sp, -8
@@ -91,12 +92,13 @@ impl Thread {
                 csrr {sepc}   , sepc
                 csrr {sstatus}, sstatus
             ",
-            sscratch      = in(reg) self,
-            sepc          = inlateout(reg) self.sepc,
-            sstatus       = inlateout(reg) sstatus,
-            execute_naked = sym execute_naked,
-        );
-        sstatus
+                sscratch      = in(reg) self,
+                sepc          = inlateout(reg) self.sepc,
+                sstatus       = inlateout(reg) sstatus,
+                execute_naked = sym execute_naked,
+            );
+            sstatus
+        }
     }
 }
 
@@ -109,8 +111,9 @@ impl Thread {
 /// 裸函数。
 #[naked]
 unsafe extern "C" fn execute_naked() {
-    core::arch::naked_asm!(
-        r"  .altmacro
+    unsafe {
+        core::arch::naked_asm!(
+            r"  .altmacro
             .macro SAVE n
                 sd x\n, \n*8(sp)
             .endm
@@ -135,46 +138,47 @@ unsafe extern "C" fn execute_naked() {
                 .endr
             .endm
         ",
-        // 位置无关加载
-        "   .option push
+            // 位置无关加载
+            "   .option push
             .option nopic
         ",
-        // 保存调度上下文
-        "   addi sp, sp, -32*8
+            // 保存调度上下文
+            "   addi sp, sp, -32*8
             SAVE_ALL
         ",
-        // 设置陷入入口
-        "   la   t0, 1f
+            // 设置陷入入口
+            "   la   t0, 1f
             csrw stvec, t0
         ",
-        // 保存调度上下文地址并切换上下文
-        "   csrr t0, sscratch
+            // 保存调度上下文地址并切换上下文
+            "   csrr t0, sscratch
             sd   sp, (t0)
             mv   sp, t0
         ",
-        // 恢复线程上下文
-        "   LOAD_ALL
+            // 恢复线程上下文
+            "   LOAD_ALL
             ld   sp, 2*8(sp)
         ",
-        // 执行线程
-        "   sret",
-        // 陷入
-        "   .align 2",
-        // 切换上下文
-        "1: csrrw sp, sscratch, sp",
-        // 保存线程上下文
-        "   SAVE_ALL
+            // 执行线程
+            "   sret",
+            // 陷入
+            "   .align 2",
+            // 切换上下文
+            "1: csrrw sp, sscratch, sp",
+            // 保存线程上下文
+            "   SAVE_ALL
             csrrw t0, sscratch, sp
             sd    t0, 2*8(sp)
         ",
-        // 切换上下文
-        "   ld sp, (sp)",
-        // 恢复调度上下文
-        "   LOAD_ALL
+            // 切换上下文
+            "   ld sp, (sp)",
+            // 恢复调度上下文
+            "   LOAD_ALL
             addi sp, sp, 32*8
         ",
-        // 返回调度
-        "   ret",
-        "   .option pop",
-    )
+            // 返回调度
+            "   ret",
+            "   .option pop",
+        )
+    }
 }