@@ -518,7 +518,7 @@ pub fn default_start_trap(_input: TokenStream) -> TokenStream {
518518 format ! (
519519 r#"
520520core::arch::global_asm!(
521- ".section .trap, \"ax\"
521+ ".section .trap.start , \"ax\"
522522.align 4 /* Alignment required for xtvec */
523523.global _default_start_trap
524524_default_start_trap:
@@ -557,7 +557,7 @@ pub fn vectored_interrupt_trap(_input: TokenStream) -> TokenStream {
557557 let instructions = format ! (
558558 r#"
559559core::arch::global_asm!(
560- ".section .trap, \"ax\"
560+ ".section .trap.continue , \"ax\"
561561
562562.align 4
563563.global _start_DefaultHandler_trap
@@ -566,7 +566,6 @@ _start_DefaultHandler_trap:
566566 {store_start} // store trap partially (only register a0)
567567 la a0, DefaultHandler // load interrupt handler address into a0
568568
569- .align 4
570569.global _continue_interrupt_trap
571570_continue_interrupt_trap:
572571 {store_continue} // store trap partially (all registers except a0)
@@ -685,10 +684,11 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
685684/// }
686685/// ```
687686pub fn core_interrupt ( args : TokenStream , input : TokenStream ) -> TokenStream {
688- let arch = if cfg ! ( feature = "v-trap" ) {
689- RiscvArch :: try_from_env ( )
690- } else {
691- None
687+ let arch = match ( ) {
688+ #[ cfg( feature = "v-trap" ) ]
689+ ( ) => RiscvArch :: try_from_env ( ) ,
690+ #[ cfg( not( feature = "v-trap" ) ) ]
691+ ( ) => None ,
692692 } ;
693693 trap ( args, input, RiscvPacItem :: CoreInterrupt , arch)
694694}
@@ -746,13 +746,14 @@ fn trap(
746746 let export_name = format ! ( "{int_ident:#}" ) ;
747747
748748 let start_trap = match arch {
749+ #[ cfg( feature = "v-trap" ) ]
749750 Some ( arch) => {
750751 let trap = start_interrupt_trap ( int_ident, arch) ;
751752 quote ! {
752753 #trap
753754 }
754755 }
755- None => proc_macro2:: TokenStream :: new ( ) ,
756+ _ => proc_macro2:: TokenStream :: new ( ) ,
756757 } ;
757758
758759 let pac_trait = pac_item. impl_trait ( ) ;
@@ -772,6 +773,7 @@ fn trap(
772773 . into ( )
773774}
774775
776+ #[ cfg( feature = "v-trap" ) ]
775777fn start_interrupt_trap ( ident : & syn:: Ident , arch : RiscvArch ) -> proc_macro2:: TokenStream {
776778 let interrupt = ident. to_string ( ) ;
777779 let width = arch. width ( ) ;
@@ -780,9 +782,10 @@ fn start_interrupt_trap(ident: &syn::Ident, arch: RiscvArch) -> proc_macro2::Tok
780782
781783 let instructions = format ! (
782784 r#"
785+ #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
783786core::arch::global_asm!(
784- ".section .trap, \"ax\"
785- .align 2
787+ ".section .trap.start.{interrupt} , \"ax\"
788+ .align 4
786789 .global _start_{interrupt}_trap
787790 _start_{interrupt}_trap:
788791 addi sp, sp, -{trap_size} * {width} // allocate space for trap frame
0 commit comments