@@ -451,39 +451,24 @@ static u64 notrace dmpatch_ibt_save(void) { return 0; }
451
451
static void notrace dmpatch_ibt_restore (u64 save ) { (void )save ; }
452
452
#endif
453
453
454
- static int notrace dmpatch_init ( void )
454
+ static int notrace dmpatch_process ( unsigned long a , unsigned long b , unsigned long c )
455
455
{
456
456
int r = 0 ;
457
457
int rc = 0 ;
458
- u64 msr = 0 ;
459
-
460
- if (g_ko_param .ibt == 0x8888 )
461
- {
462
- msr = dmpatch_ibt_save ();
463
- }
464
-
465
- kprintf = (printk_pf )(g_ko_param .printk_addr );
458
+ unsigned long kv_major = 0 ;
459
+ unsigned long kv_minor = 0 ;
460
+ unsigned long kv_subminor = 0 ;
466
461
467
- vdebug ("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n" ,
468
- g_ko_param .pgsize , g_ko_param .kv_major , g_ko_param .kv_minor , g_ko_param .kv_subminor );
469
-
470
- if (g_ko_param .struct_size != sizeof (ko_param ))
471
- {
472
- vdebug ("Invalid struct size %d %d\n" , (int )g_ko_param .struct_size , (int )sizeof (ko_param ));
473
- return - EINVAL ;
474
- }
475
-
476
- if (g_ko_param .sym_get_addr == 0 || g_ko_param .sym_put_addr == 0 ||
477
- g_ko_param .ro_addr == 0 || g_ko_param .rw_addr == 0 )
478
- {
479
- return - EINVAL ;
480
- }
462
+ vdebug ("dmpatch_process as KV %d.%d.%d ...\n" , (int )a , (int )b , (int )c );
481
463
482
- set_mem_ro = (set_memory_attr_pf )(g_ko_param .ro_addr );
483
- set_mem_rw = (set_memory_attr_pf )(g_ko_param .rw_addr );
484
- reg_kprobe = (kprobe_reg_pf )g_ko_param .reg_kprobe_addr ;
485
- unreg_kprobe = (kprobe_unreg_pf )g_ko_param .unreg_kprobe_addr ;
464
+ kv_major = g_ko_param .kv_major ;
465
+ kv_minor = g_ko_param .kv_minor ;
466
+ kv_subminor = g_ko_param .kv_subminor ;
486
467
468
+ g_ko_param .kv_major = a ;
469
+ g_ko_param .kv_minor = b ;
470
+ g_ko_param .kv_subminor = c ;
471
+
487
472
if (dmpatch_kv_above (6 , 5 , 0 )) /* >= kernel 6.5 */
488
473
{
489
474
vdebug ("new interface patch dm_get_table_device...\n" );
@@ -531,14 +516,66 @@ static int notrace dmpatch_init(void)
531
516
vdebug ("######## dm patch success ###########\n" );
532
517
vdebug ("#####################################\n" );
533
518
519
+ out :
520
+
521
+ g_ko_param .kv_major = kv_major ;
522
+ g_ko_param .kv_minor = kv_minor ;
523
+ g_ko_param .kv_subminor = kv_subminor ;
524
+
525
+ return rc ;
526
+ }
527
+
528
+ static int notrace dmpatch_init (void )
529
+ {
530
+ int rc = 0 ;
531
+ u64 msr = 0 ;
532
+
533
+ if (g_ko_param .ibt == 0x8888 )
534
+ {
535
+ msr = dmpatch_ibt_save ();
536
+ }
537
+
538
+ kprintf = (printk_pf )(g_ko_param .printk_addr );
539
+
540
+ vdebug ("dmpatch_init start pagesize=%lu kernel=%lu.%lu.%lu ...\n" ,
541
+ g_ko_param .pgsize , g_ko_param .kv_major , g_ko_param .kv_minor , g_ko_param .kv_subminor );
542
+
543
+ if (g_ko_param .struct_size != sizeof (ko_param ))
544
+ {
545
+ vdebug ("Invalid struct size %d %d\n" , (int )g_ko_param .struct_size , (int )sizeof (ko_param ));
546
+ return - EINVAL ;
547
+ }
548
+
549
+ if (g_ko_param .sym_get_addr == 0 || g_ko_param .sym_put_addr == 0 ||
550
+ g_ko_param .ro_addr == 0 || g_ko_param .rw_addr == 0 )
551
+ {
552
+ return - EINVAL ;
553
+ }
554
+
555
+ set_mem_ro = (set_memory_attr_pf )(g_ko_param .ro_addr );
556
+ set_mem_rw = (set_memory_attr_pf )(g_ko_param .rw_addr );
557
+ reg_kprobe = (kprobe_reg_pf )g_ko_param .reg_kprobe_addr ;
558
+ unreg_kprobe = (kprobe_unreg_pf )g_ko_param .unreg_kprobe_addr ;
559
+
560
+ rc = dmpatch_process (g_ko_param .kv_major , g_ko_param .kv_minor , g_ko_param .kv_subminor );
561
+ if (rc )
562
+ {
563
+ if (g_ko_param .kv_major >= 5 )
564
+ {
565
+ rc = dmpatch_process (6 , 5 , 0 );
566
+ if (rc )
567
+ {
568
+ rc = dmpatch_process (6 , 7 , 0 );
569
+ }
570
+ }
571
+ }
572
+
534
573
if (g_ko_param .ibt == 0x8888 )
535
574
{
536
575
dmpatch_ibt_restore (msr );
537
576
}
538
577
539
- out :
540
-
541
- return rc ;
578
+ return rc ;
542
579
}
543
580
544
581
static void notrace dmpatch_exit (void )
0 commit comments