@@ -10,7 +10,7 @@ pub fn is_riscv_peripheral(p: &Peripheral, c: &Config) -> bool {
10
10
match & c. riscv_config {
11
11
Some ( c) => {
12
12
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 )
14
14
}
15
15
_ => false ,
16
16
}
@@ -253,7 +253,7 @@ pub fn render(
253
253
} ) ;
254
254
}
255
255
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 ( ) ;
257
257
let base = TokenStream :: from_str ( & format ! ( "base 0x{:X}," , p. base_address) ) . unwrap ( ) ;
258
258
let ctxs = harts
259
259
. iter ( )
@@ -271,6 +271,27 @@ pub fn render(
271
271
riscv_peripherals. extend ( quote ! {
272
272
riscv_peripheral:: plic_codegen!( #base #ctxs) ;
273
273
} ) ;
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
+ }
274
295
}
275
296
}
276
297
0 commit comments