@@ -365,11 +365,17 @@ impl rtkit::Operations for GpuManager::ver {
365365 ch. event . poll ( ) ;
366366 }
367367
368- fn crashed ( data : <Self :: Data as ForeignOwnable >:: Borrowed < ' _ > , _crashlog : Option < & [ u8 ] > ) {
368+ fn crashed ( data : <Self :: Data as ForeignOwnable >:: Borrowed < ' _ > , crashlog : Option < & [ u8 ] > ) {
369369 let dev = & data. dev ;
370370
371371 data. crashed . store ( true , Ordering :: Relaxed ) ;
372372
373+ if let Err ( e) = data. generate_crashdump ( crashlog) {
374+ dev_err ! ( dev. as_ref( ) , "Could not dump kernel VM pages: {:?}\n " , e) ;
375+ }
376+ #[ cfg( not( CONFIG_DEV_COREDUMP ) ) ]
377+ let _ = crashlog;
378+
373379 if debug_enabled ( DebugFlags :: OopsOnGpuCrash ) {
374380 panic ! ( "GPU firmware crashed" ) ;
375381 } else {
@@ -1149,6 +1155,23 @@ impl GpuManager::ver {
11491155
11501156 Ok ( ( ) )
11511157 }
1158+
1159+ fn generate_crashdump ( & self , crashlog : Option < & [ u8 ] > ) -> Result {
1160+ // Lock the allocators, to block kernel/FW memory mutations (mostly)
1161+ let kalloc = self . alloc ( ) ;
1162+ let pages = self . uat . dump_kernel_pages ( ) ?;
1163+ core:: mem:: drop ( kalloc) ;
1164+
1165+ let mut crashdump = crashdump:: CrashDumpBuilder :: new ( pages) ?;
1166+ let initdata_addr = self . initdata . gpu_va ( ) . get ( ) ;
1167+ crashdump. add_agx_info ( self . cfg , & self . dyncfg , initdata_addr) ?;
1168+ if let Some ( crashlog) = crashlog {
1169+ crashdump. add_crashlog ( crashlog) ?;
1170+ }
1171+ let crashdump = crashdump. finalize ( ) ;
1172+
1173+ Ok ( ( ) )
1174+ }
11521175}
11531176
11541177#[ versions( AGX ) ]
0 commit comments