1
1
#![ deny( warnings) ]
2
+ #![ allow( unknown_lints) ] // reason = "required for next line"
3
+ #![ allow( clippy:: manual_is_multiple_of) ] // reason = "requires MSRV bump"
2
4
3
5
use proc_macro:: TokenStream ;
4
6
use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
@@ -518,8 +520,8 @@ pub fn default_start_trap(_input: TokenStream) -> TokenStream {
518
520
format ! (
519
521
r#"
520
522
core::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 */
523
525
.global _default_start_trap
524
526
_default_start_trap:
525
527
addi sp, sp, - {trap_size} * {width}
@@ -557,16 +559,15 @@ pub fn vectored_interrupt_trap(_input: TokenStream) -> TokenStream {
557
559
let instructions = format ! (
558
560
r#"
559
561
core::arch::global_asm!(
560
- ".section .trap, \"ax\"
562
+ ".section .trap.continue , \"ax\"
561
563
562
- .align 4
564
+ .balign 4
563
565
.global _start_DefaultHandler_trap
564
566
_start_DefaultHandler_trap:
565
567
addi sp, sp, -{trap_size} * {width} // allocate space for trap frame
566
568
{store_start} // store trap partially (only register a0)
567
569
la a0, DefaultHandler // load interrupt handler address into a0
568
570
569
- .align 4
570
571
.global _continue_interrupt_trap
571
572
_continue_interrupt_trap:
572
573
{store_continue} // store trap partially (all registers except a0)
@@ -685,10 +686,11 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
685
686
/// }
686
687
/// ```
687
688
pub 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 ,
692
694
} ;
693
695
trap ( args, input, RiscvPacItem :: CoreInterrupt , arch)
694
696
}
@@ -746,13 +748,14 @@ fn trap(
746
748
let export_name = format ! ( "{int_ident:#}" ) ;
747
749
748
750
let start_trap = match arch {
751
+ #[ cfg( feature = "v-trap" ) ]
749
752
Some ( arch) => {
750
753
let trap = start_interrupt_trap ( int_ident, arch) ;
751
754
quote ! {
752
755
#trap
753
756
}
754
757
}
755
- None => proc_macro2:: TokenStream :: new ( ) ,
758
+ _ => proc_macro2:: TokenStream :: new ( ) ,
756
759
} ;
757
760
758
761
let pac_trait = pac_item. impl_trait ( ) ;
@@ -772,6 +775,7 @@ fn trap(
772
775
. into ( )
773
776
}
774
777
778
+ #[ cfg( feature = "v-trap" ) ]
775
779
fn start_interrupt_trap ( ident : & syn:: Ident , arch : RiscvArch ) -> proc_macro2:: TokenStream {
776
780
let interrupt = ident. to_string ( ) ;
777
781
let width = arch. width ( ) ;
@@ -780,9 +784,10 @@ fn start_interrupt_trap(ident: &syn::Ident, arch: RiscvArch) -> proc_macro2::Tok
780
784
781
785
let instructions = format ! (
782
786
r#"
787
+ #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
783
788
core::arch::global_asm!(
784
- ".section .trap, \"ax\"
785
- .align 2
789
+ ".section .trap.start.{interrupt} , \"ax\"
790
+ .balign 4
786
791
.global _start_{interrupt}_trap
787
792
_start_{interrupt}_trap:
788
793
addi sp, sp, -{trap_size} * {width} // allocate space for trap frame
0 commit comments