@@ -159,7 +159,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
159
159
}
160
160
161
161
let ident = f. sig . ident . clone ( ) ;
162
- let ident_s = ident. to_string ( ) ;
162
+ let interrupt = ident. to_string ( ) ;
163
163
164
164
let valid_signature = f. sig . constness . is_none ( )
165
165
&& f. vis == Visibility :: Inherited
@@ -189,7 +189,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
189
189
let ident = f. sig . ident . clone ( ) ;
190
190
191
191
// 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());
193
193
194
194
f. sig . ident = Ident :: new ( & format ! ( "__qingke_rt_{}" , f. sig. ident) , Span :: call_site ( ) ) ;
195
195
@@ -221,22 +221,32 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
221
221
*/
222
222
}
223
223
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
+
224
244
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
239
246
247
+ #[ allow( non_snake_case) ]
248
+ #[ no_mangle]
249
+ #[ link_section = ".trap.rust" ]
240
250
#f
241
251
)
242
252
. into ( )
0 commit comments