@@ -289,7 +289,7 @@ pub fn sv_loop(
289289 // end_ffi was called by the child
290290 ExecEvent :: End => {
291291 // 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 ( ) ;
293293 // And reset our values
294294 acc_events = Vec :: new ( ) ;
295295 ch_stack = None ;
@@ -354,9 +354,9 @@ fn get_disasm() -> capstone::Capstone {
354354 #[ cfg( target_arch = "x86" ) ]
355355 { cs_pre. x86 ( ) . mode ( arch:: x86:: ArchMode :: Mode32 ) }
356356 #[ cfg( target_arch = "aarch64" ) ]
357- { cs_pre. arm64 ( ) }
357+ { cs_pre. arm64 ( ) . mode ( arch :: arm64 :: ArchMode :: Arm ) }
358358 #[ cfg( target_arch = "arm" ) ]
359- { cs_pre. arm ( ) }
359+ { cs_pre. arm ( ) . mode ( arch :: arm :: ArchMode :: Arm ) }
360360 #[ cfg( target_arch = "riscv64" ) ]
361361 { cs_pre. riscv ( ) . mode ( arch:: riscv:: ArchMode :: RiscV64 ) }
362362 #[ cfg( target_arch = "riscv32" ) ]
@@ -421,7 +421,6 @@ fn handle_segfault(
421421 fn capstone_disassemble (
422422 instr : & [ u8 ] ,
423423 addr : usize ,
424- page_size : usize ,
425424 cs : & capstone:: Capstone ,
426425 acc_events : & mut Vec < AccessEvent > ,
427426 ) -> capstone:: CsResult < ( ) > {
@@ -434,53 +433,21 @@ fn handle_segfault(
434433 let ins_detail = cs. insn_detail ( & insns[ 0 ] ) ?;
435434 let arch_detail = ins_detail. arch_detail ( ) ;
436435
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-
457436 for op in arch_detail. operands ( ) {
458437 match op {
459438 #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
460439 arch:: ArchOperand :: X86Operand ( x86_operand) => {
461440 match x86_operand. op_type {
462441 // We only care about memory accesses
463442 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 ) ) ;
465444 // It's called a "RegAccessType" but it also applies to memory
466445 let acc_ty = x86_operand. access . unwrap ( ) ;
467446 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 ( ) ) ) ;
475448 }
476449 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) ) ;
484451 }
485452 }
486453 _ => ( ) ,
@@ -515,16 +482,12 @@ fn handle_segfault(
515482 | arch:: arm64:: Arm64Vas :: ARM64_VAS_2D
516483 | arch:: arm64:: Arm64Vas :: ARM64_VAS_1Q => 16 ,
517484 } ;
518- let append = get_ranges ( addr, size, page_size ) ;
485+ let push = addr..addr . strict_add ( size) ;
519486 // FIXME: This now has access type info in the latest
520487 // git version of capstone because this pissed me off
521488 // 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) ) ;
528491 }
529492 _ => ( ) ,
530493 }
@@ -540,25 +503,13 @@ fn handle_segfault(
540503 } else {
541504 ARCH_WORD_SIZE
542505 } ;
543- let append = get_ranges ( addr, size, page_size ) ;
506+ let push = addr..addr . strict_add ( size) ;
544507 let acc_ty = arm_operand. access . unwrap ( ) ;
545508 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 ( ) ) ) ;
553510 }
554511 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) ) ;
562513 }
563514 }
564515 _ => ( ) ,
@@ -568,13 +519,9 @@ fn handle_segfault(
568519 match risc_voperand {
569520 arch:: riscv:: RiscVOperand :: Mem ( _) => {
570521 // 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) ) ;
578525 }
579526 _ => ( ) ,
580527 }
@@ -666,7 +613,7 @@ fn handle_segfault(
666613 // Now figure out the size + type of access and log it down
667614 // This will mark down e.g. the same area being read multiple times,
668615 // 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 ( ) {
670617 // Read goes first because we need to be pessimistic
671618 acc_events. push ( AccessEvent :: Read ( addr..addr. strict_add ( ARCH_MAX_ACCESS_SIZE ) ) ) ;
672619 acc_events. push ( AccessEvent :: Write ( addr..addr. strict_add ( ARCH_MAX_ACCESS_SIZE ) ) ) ;
0 commit comments