11#![ deny( warnings) ]
2+ #![ allow( unknown_lints) ] // reason = "required for next line"
3+ #![ allow( clippy:: manual_is_multiple_of) ] // reason = "requires MSRV bump"
24
35use proc_macro:: TokenStream ;
46use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
@@ -518,8 +520,8 @@ pub fn default_start_trap(_input: TokenStream) -> TokenStream {
518520 format ! (
519521 r#"
520522core::arch::global_asm!(
521- ".section .trap, \"ax\"
522- .align 4 /* Alignment required for xtvec */
523+ ".section .trap.start , \"ax\"
524+ .balign 4 /* Alignment required for xtvec */
523525.global _default_start_trap
524526_default_start_trap:
525527 addi sp, sp, - {trap_size} * {width}
@@ -557,16 +559,15 @@ pub fn vectored_interrupt_trap(_input: TokenStream) -> TokenStream {
557559 let instructions = format ! (
558560 r#"
559561core::arch::global_asm!(
560- ".section .trap, \"ax\"
562+ ".section .trap.continue , \"ax\"
561563
562- .align 4
564+ .balign 4
563565.global _start_DefaultHandler_trap
564566_start_DefaultHandler_trap:
565567 addi sp, sp, -{trap_size} * {width} // allocate space for trap frame
566568 {store_start} // store trap partially (only register a0)
567569 la a0, DefaultHandler // load interrupt handler address into a0
568570
569- .align 4
570571.global _continue_interrupt_trap
571572_continue_interrupt_trap:
572573 {store_continue} // store trap partially (all registers except a0)
@@ -685,10 +686,11 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
685686/// }
686687/// ```
687688pub 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
689+ let arch = match ( ) {
690+ #[ cfg( feature = "v-trap" ) ]
691+ ( ) => RiscvArch :: try_from_env ( ) ,
692+ #[ cfg( not( feature = "v-trap" ) ) ]
693+ ( ) => None ,
692694 } ;
693695 trap ( args, input, RiscvPacItem :: CoreInterrupt , arch)
694696}
@@ -746,13 +748,14 @@ fn trap(
746748 let export_name = format ! ( "{int_ident:#}" ) ;
747749
748750 let start_trap = match arch {
751+ #[ cfg( feature = "v-trap" ) ]
749752 Some ( arch) => {
750753 let trap = start_interrupt_trap ( int_ident, arch) ;
751754 quote ! {
752755 #trap
753756 }
754757 }
755- None => proc_macro2:: TokenStream :: new ( ) ,
758+ _ => proc_macro2:: TokenStream :: new ( ) ,
756759 } ;
757760
758761 let pac_trait = pac_item. impl_trait ( ) ;
@@ -772,6 +775,7 @@ fn trap(
772775 . into ( )
773776}
774777
778+ #[ cfg( feature = "v-trap" ) ]
775779fn start_interrupt_trap ( ident : & syn:: Ident , arch : RiscvArch ) -> proc_macro2:: TokenStream {
776780 let interrupt = ident. to_string ( ) ;
777781 let width = arch. width ( ) ;
@@ -780,9 +784,10 @@ fn start_interrupt_trap(ident: &syn::Ident, arch: RiscvArch) -> proc_macro2::Tok
780784
781785 let instructions = format ! (
782786 r#"
787+ #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
783788core::arch::global_asm!(
784- ".section .trap, \"ax\"
785- .align 2
789+ ".section .trap.start.{interrupt} , \"ax\"
790+ .balign 4
786791 .global _start_{interrupt}_trap
787792 _start_{interrupt}_trap:
788793 addi sp, sp, -{trap_size} * {width} // allocate space for trap frame
0 commit comments