@@ -10,7 +10,7 @@ pub fn is_riscv_peripheral(p: &Peripheral, c: &Config) -> bool {
1010 match & c. riscv_config {
1111 Some ( c) => {
1212 c. clint . as_ref ( ) . is_some_and ( |clint| clint. name == p. name )
13- || c. plic . as_ref ( ) . is_some_and ( |plic| plic == & p. name )
13+ || c. plic . as_ref ( ) . is_some_and ( |plic| plic. name == p. name )
1414 }
1515 _ => false ,
1616 }
@@ -253,7 +253,7 @@ pub fn render(
253253 } ) ;
254254 }
255255 if let Some ( plic) = & c. plic {
256- let p = peripherals. iter ( ) . find ( |& p| & p. name == plic) . unwrap ( ) ;
256+ let p = peripherals. iter ( ) . find ( |& p| p. name == plic. name ) . unwrap ( ) ;
257257 let base = TokenStream :: from_str ( & format ! ( "base 0x{:X}," , p. base_address) ) . unwrap ( ) ;
258258 let ctxs = harts
259259 . iter ( )
@@ -271,6 +271,27 @@ pub fn render(
271271 riscv_peripherals. extend ( quote ! {
272272 riscv_peripheral:: plic_codegen!( #base #ctxs) ;
273273 } ) ;
274+
275+ if let Some ( core_interrupt) = & plic. core_interrupt {
276+ let core_interrupt = TokenStream :: from_str ( core_interrupt) . unwrap ( ) ;
277+ let ctx = match & plic. hart_id {
278+ Some ( hart_id) => {
279+ TokenStream :: from_str ( & format ! ( "ctx(Hart::{hart_id})" ) ) . unwrap ( )
280+ }
281+ None => quote ! { ctx_mhartid( ) } ,
282+ } ;
283+ mod_items. extend ( quote ! {
284+ #[ cfg( feature = "rt" ) ]
285+ #[ riscv_rt:: core_interrupt( CoreInterrupt :: #core_interrupt) ]
286+ fn plic_handler( ) {
287+ let claim = crate :: PLIC :: #ctx. claim( ) ;
288+ if let Some ( s) = claim. claim:: <CoreInterrupt >( ) {
289+ unsafe { _dispatch_core_interrupt( s. number( ) ) }
290+ claim. complete( s) ;
291+ }
292+ }
293+ } ) ;
294+ }
274295 }
275296 }
276297
0 commit comments