@@ -289,7 +289,7 @@ pub fn sv_loop(
289
289
// end_ffi was called by the child
290
290
ExecEvent :: End => {
291
291
// Hand over the access info we traced
292
- event_tx. send ( MemEvents { acc_events, alloc_cutoff : page_size } ) . unwrap ( ) ;
292
+ event_tx. send ( MemEvents { acc_events } ) . unwrap ( ) ;
293
293
// And reset our values
294
294
acc_events = Vec :: new ( ) ;
295
295
ch_stack = None ;
@@ -354,9 +354,9 @@ fn get_disasm() -> capstone::Capstone {
354
354
#[ cfg( target_arch = "x86" ) ]
355
355
{ cs_pre. x86 ( ) . mode ( arch:: x86:: ArchMode :: Mode32 ) }
356
356
#[ cfg( target_arch = "aarch64" ) ]
357
- { cs_pre. arm64 ( ) }
357
+ { cs_pre. arm64 ( ) . mode ( arch :: arm64 :: ArchMode :: Arm ) }
358
358
#[ cfg( target_arch = "arm" ) ]
359
- { cs_pre. arm ( ) }
359
+ { cs_pre. arm ( ) . mode ( arch :: arm :: ArchMode :: Arm ) }
360
360
#[ cfg( target_arch = "riscv64" ) ]
361
361
{ cs_pre. riscv ( ) . mode ( arch:: riscv:: ArchMode :: RiscV64 ) }
362
362
#[ cfg( target_arch = "riscv32" ) ]
@@ -421,7 +421,6 @@ fn handle_segfault(
421
421
fn capstone_disassemble (
422
422
instr : & [ u8 ] ,
423
423
addr : usize ,
424
- page_size : usize ,
425
424
cs : & capstone:: Capstone ,
426
425
acc_events : & mut Vec < AccessEvent > ,
427
426
) -> capstone:: CsResult < ( ) > {
@@ -434,53 +433,21 @@ fn handle_segfault(
434
433
let ins_detail = cs. insn_detail ( & insns[ 0 ] ) ?;
435
434
let arch_detail = ins_detail. arch_detail ( ) ;
436
435
437
- // Take an (addr, size, cutoff_size) and split an access into multiple if needed
438
- let get_ranges: fn ( usize , usize , usize ) -> Vec < std:: ops:: Range < usize > > =
439
- |addr, size, cutoff_size : usize | {
440
- let addr_added = addr. strict_add ( size) ;
441
- let mut counter = 0usize ;
442
- let mut ret = vec ! [ ] ;
443
- loop {
444
- let curr = addr. strict_add ( counter. strict_mul ( cutoff_size) ) ;
445
- let next = curr. strict_add ( cutoff_size) ;
446
- if next >= addr_added {
447
- ret. push ( curr..addr_added) ;
448
- break ;
449
- } else {
450
- ret. push ( curr..curr. strict_add ( cutoff_size) ) ;
451
- counter = counter. strict_add ( 1 ) ;
452
- }
453
- }
454
- ret
455
- } ;
456
-
457
436
for op in arch_detail. operands ( ) {
458
437
match op {
459
438
#[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
460
439
arch:: ArchOperand :: X86Operand ( x86_operand) => {
461
440
match x86_operand. op_type {
462
441
// We only care about memory accesses
463
442
arch:: x86:: X86OperandType :: Mem ( _) => {
464
- let append = get_ranges ( addr, x86_operand . size . into ( ) , page_size ) ;
443
+ let push = addr..addr . strict_add ( usize :: from ( x86_operand . size ) ) ;
465
444
// It's called a "RegAccessType" but it also applies to memory
466
445
let acc_ty = x86_operand. access . unwrap ( ) ;
467
446
if acc_ty. is_readable ( ) {
468
- acc_events. append (
469
- & mut append
470
- . clone ( )
471
- . into_iter ( )
472
- . map ( AccessEvent :: Read )
473
- . collect ( ) ,
474
- ) ;
447
+ acc_events. push ( AccessEvent :: Read ( push. clone ( ) ) ) ;
475
448
}
476
449
if acc_ty. is_writable ( ) {
477
- acc_events. append (
478
- & mut append
479
- . clone ( )
480
- . into_iter ( )
481
- . map ( AccessEvent :: Write )
482
- . collect ( ) ,
483
- ) ;
450
+ acc_events. push ( AccessEvent :: Write ( push) ) ;
484
451
}
485
452
}
486
453
_ => ( ) ,
@@ -515,16 +482,12 @@ fn handle_segfault(
515
482
| arch:: arm64:: Arm64Vas :: ARM64_VAS_2D
516
483
| arch:: arm64:: Arm64Vas :: ARM64_VAS_1Q => 16 ,
517
484
} ;
518
- let append = get_ranges ( addr, size, page_size ) ;
485
+ let push = addr..addr . strict_add ( size) ;
519
486
// FIXME: This now has access type info in the latest
520
487
// git version of capstone because this pissed me off
521
488
// and I added it. Change this when it updates
522
- acc_events. append (
523
- & mut append. clone ( ) . into_iter ( ) . map ( AccessEvent :: Read ) . collect ( ) ,
524
- ) ;
525
- acc_events. append (
526
- & mut append. clone ( ) . into_iter ( ) . map ( AccessEvent :: Write ) . collect ( ) ,
527
- ) ;
489
+ acc_events. push ( AccessEvent :: Read ( push. clone ( ) ) ) ;
490
+ acc_events. push ( AccessEvent :: Write ( push) ) ;
528
491
}
529
492
_ => ( ) ,
530
493
}
@@ -540,25 +503,13 @@ fn handle_segfault(
540
503
} else {
541
504
ARCH_WORD_SIZE
542
505
} ;
543
- let append = get_ranges ( addr, size, page_size ) ;
506
+ let push = addr..addr . strict_add ( size) ;
544
507
let acc_ty = arm_operand. access . unwrap ( ) ;
545
508
if acc_ty. is_readable ( ) {
546
- acc_events. append (
547
- & mut append
548
- . clone ( )
549
- . into_iter ( )
550
- . map ( AccessEvent :: Read )
551
- . collect ( ) ,
552
- ) ;
509
+ acc_events. push ( AccessEvent :: Read ( push. clone ( ) ) ) ;
553
510
}
554
511
if acc_ty. is_writable ( ) {
555
- acc_events. append (
556
- & mut append
557
- . clone ( )
558
- . into_iter ( )
559
- . map ( AccessEvent :: Write )
560
- . collect ( ) ,
561
- ) ;
512
+ acc_events. push ( AccessEvent :: Write ( push) ) ;
562
513
}
563
514
}
564
515
_ => ( ) ,
@@ -568,13 +519,9 @@ fn handle_segfault(
568
519
match risc_voperand {
569
520
arch:: riscv:: RiscVOperand :: Mem ( _) => {
570
521
// We get basically no info here
571
- let append = get_ranges ( addr, ARCH_MAX_ACCESS_SIZE , page_size) ;
572
- acc_events. append (
573
- & mut append. clone ( ) . into_iter ( ) . map ( AccessEvent :: Read ) . collect ( ) ,
574
- ) ;
575
- acc_events. append (
576
- & mut append. clone ( ) . into_iter ( ) . map ( AccessEvent :: Write ) . collect ( ) ,
577
- ) ;
522
+ let push = addr..addr. strict_add ( size) ;
523
+ acc_events. push ( AccessEvent :: Read ( push. clone ( ) ) ) ;
524
+ acc_events. push ( AccessEvent :: Write ( push) ) ;
578
525
}
579
526
_ => ( ) ,
580
527
}
@@ -666,7 +613,7 @@ fn handle_segfault(
666
613
// Now figure out the size + type of access and log it down
667
614
// This will mark down e.g. the same area being read multiple times,
668
615
// since it's more efficient to compress the accesses at the end
669
- if capstone_disassemble ( & instr, addr, page_size , cs, acc_events) . is_err ( ) {
616
+ if capstone_disassemble ( & instr, addr, cs, acc_events) . is_err ( ) {
670
617
// Read goes first because we need to be pessimistic
671
618
acc_events. push ( AccessEvent :: Read ( addr..addr. strict_add ( ARCH_MAX_ACCESS_SIZE ) ) ) ;
672
619
acc_events. push ( AccessEvent :: Write ( addr..addr. strict_add ( ARCH_MAX_ACCESS_SIZE ) ) ) ;
0 commit comments