Skip to content

Commit 12de573

Browse files
committedOct 20, 2024·
fix: avoid using naked_asm!
1 parent 4d4608a commit 12de573

File tree

4 files changed

+34
-24
lines changed

4 files changed

+34
-24
lines changed
 

‎Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ documentation = "https://docs.rs/qingke"
88
homepage = "https://github.com/ch32-rs/qingke"
99
categories = ["embedded", "no-std", "hardware-support"]
1010
license = "MIT/Apache-2.0"
11-
version = "0.3.0" # for rt and macros
11+
version = "0.4.0" # for rt and macros
1212
edition = "2021"
1313

1414
[package]
@@ -27,8 +27,8 @@ readme = "README.md"
2727

2828
[dependencies]
2929
bit_field = "0.10.2"
30-
riscv = "0.11.1"
31-
critical-section = { version = "1.1.3", features = [
30+
riscv = "0.12.0"
31+
critical-section = { version = "1.2.0", features = [
3232
"restore-state-bool",
3333
], optional = true }
3434
defmt = { version = "0.3.8", optional = true }

‎publish.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
set -ex
44

5-
cargo publish --target riscv32imac-unknown-none-elf
5+
cargo publish --target riscv32imac-unknown-none-elf --allow-dirty
66

7-
(cd qingke-rt/macros && cargo publish --target riscv32imac-unknown-none-elf)
7+
(cd qingke-rt/macros && cargo publish --target riscv32imac-unknown-none-elf --allow-dirty)
88

9-
(cd qingke-rt && cargo publish --target riscv32imac-unknown-none-elf)
9+
(cd qingke-rt && cargo publish --target riscv32imac-unknown-none-elf --allow-dirty)

‎qingke-rt/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ v4 = []
2323
highcode = []
2424

2525
[dependencies]
26-
qingke-rt-macros = { path = "./macros", version = "0.3" }
27-
qingke = { path = "../", version = "0.3", features = ["critical-section-impl"] }
26+
qingke-rt-macros = { path = "./macros", version = "0.4" }
27+
qingke = { path = "../", version = "0.4", features = ["critical-section-impl"] }
2828

2929
[package.metadata.docs.rs]
3030
targets = ["riscv32imac-unknown-none-elf"]

‎qingke-rt/macros/src/lib.rs

+26-16
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
159159
}
160160

161161
let ident = f.sig.ident.clone();
162-
let ident_s = ident.to_string();
162+
let interrupt = ident.to_string();
163163

164164
let valid_signature = f.sig.constness.is_none()
165165
&& f.vis == Visibility::Inherited
@@ -189,7 +189,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
189189
let ident = f.sig.ident.clone();
190190

191191
// This will be overwritten by `export_name` in linking process, i.e. name of the interrupt
192-
let wrapper_ident = Ident::new(&format!("{}_naked_wrapper", f.sig.ident), Span::call_site());
192+
// let wrapper_ident = Ident::new(&format!("{}_naked_wrapper", f.sig.ident), Span::call_site());
193193

194194
f.sig.ident = Ident::new(&format!("__qingke_rt_{}", f.sig.ident), Span::call_site());
195195

@@ -221,22 +221,32 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
221221
*/
222222
}
223223

224+
let wrapped_name = wrapped_ident.to_string();
225+
226+
let start_interrupt = format!(
227+
r#"
228+
core::arch::global_asm!(
229+
".section .trap, \"ax\"
230+
.align 2
231+
.global {interrupt}
232+
{interrupt}:
233+
addi sp, sp, -4
234+
sw ra, 0(sp)
235+
jal {wrapped_name}
236+
lw ra, 0(sp)
237+
addi sp, sp, 4
238+
mret
239+
");"#
240+
);
241+
242+
let start_interrupt_asm: proc_macro2::TokenStream = start_interrupt.parse().unwrap();
243+
224244
quote!(
225-
#[doc(hidden)]
226-
#[export_name = #ident_s]
227-
#[naked]
228-
unsafe extern "C" fn #wrapper_ident() {
229-
core::arch::naked_asm!("
230-
addi sp, sp, -4
231-
sw ra, 0(sp)
232-
jal {irq_impl}
233-
lw ra, 0(sp)
234-
addi sp, sp, 4
235-
mret",
236-
irq_impl = sym #wrapped_ident
237-
);
238-
}
245+
#start_interrupt_asm
239246

247+
#[allow(non_snake_case)]
248+
#[no_mangle]
249+
#[link_section = ".trap.rust"]
240250
#f
241251
)
242252
.into()

0 commit comments

Comments
 (0)
Please sign in to comment.