@@ -148,7 +148,7 @@ impl Default for Mem64 {
148148 mem_name : "" . to_string ( ) ,
149149 base_addr : 0 ,
150150 bottom_addr : 0 ,
151- permission : Permission :: from_flags ( false , false , false ) ,
151+ permission : Permission :: from_flags ( true , true , false ) ,
152152 mem : Vec :: new ( ) ,
153153 }
154154 }
@@ -343,15 +343,6 @@ impl Mem64 {
343343 #[ inline( always) ]
344344 pub fn read_bytes ( & self , addr : u64 , sz : usize ) -> & [ u8 ] {
345345 if !self . can_read ( ) {
346- emu_context:: with_current_emu ( |emu| {
347- if emu. cfg . trace_mem {
348- log_red ! (
349- emu,
350- "FAILED doesn't have permission: read_from: 0x{:x?}" ,
351- addr
352- ) ;
353- }
354- } ) . unwrap ( ) ;
355346 panic ! ( "FAILED to read without permission: addr: 0x{:x?}" , addr) ;
356347 }
357348
@@ -575,6 +566,138 @@ impl Mem64 {
575566 r
576567 }
577568
569+ #[ inline( always) ]
570+ pub fn force_write_byte ( & mut self , addr : u64 , value : u8 ) {
571+ let idx = ( addr - self . base_addr ) as usize ;
572+ self . mem [ idx] = value;
573+ if cfg ! ( feature = "log_mem_write" ) {
574+ emu_context:: with_current_emu ( |emu| {
575+ if emu. cfg . trace_mem {
576+ log_red ! (
577+ emu,
578+ "mem: force_write_byte: 0x{:x?} = 0x{:x}" ,
579+ self . build_addresses( addr, 1 ) ,
580+ value
581+ ) ;
582+ }
583+ } ) . unwrap ( ) ;
584+ }
585+ }
586+
587+ #[ inline( always) ]
588+ pub fn force_write_bytes ( & mut self , addr : u64 , bs : & [ u8 ] ) {
589+ let idx = ( addr - self . base_addr ) as usize ;
590+ self . mem [ idx..( bs. len ( ) + idx) ] . copy_from_slice ( bs. as_ref ( ) ) ;
591+ if cfg ! ( feature = "log_mem_write" ) {
592+ emu_context:: with_current_emu ( |emu| {
593+ if emu. cfg . trace_mem {
594+ log_red ! (
595+ emu,
596+ "mem: force_write_bytes: 0x{:x?} = {:?}" ,
597+ self . build_addresses( addr, bs. len( ) ) ,
598+ bs
599+ ) ;
600+ }
601+ } ) . unwrap ( ) ;
602+ }
603+ }
604+
605+ #[ inline( always) ]
606+ pub fn force_write_word ( & mut self , addr : u64 , value : u16 ) {
607+ let idx = ( addr - self . base_addr ) as usize ;
608+ self . mem [ idx..idx + 2 ] . copy_from_slice ( value. to_le_bytes ( ) . to_vec ( ) . as_ref ( ) ) ;
609+
610+ if cfg ! ( feature = "log_mem_write" ) {
611+ emu_context:: with_current_emu ( |emu| {
612+ if emu. cfg . trace_mem {
613+ log_red ! (
614+ emu,
615+ "mem: force_write_word: 0x{:x?} = 0x{:x}" ,
616+ self . build_addresses( addr, 2 ) ,
617+ value
618+ ) ;
619+ }
620+ } ) . unwrap ( ) ;
621+ }
622+ }
623+
624+ #[ inline( always) ]
625+ pub fn force_write_dword ( & mut self , addr : u64 , value : u32 ) {
626+ let idx = ( addr - self . base_addr ) as usize ;
627+ self . mem [ idx..idx + 4 ] . copy_from_slice ( value. to_le_bytes ( ) . to_vec ( ) . as_ref ( ) ) ;
628+
629+ if cfg ! ( feature = "log_mem_write" ) {
630+ emu_context:: with_current_emu ( |emu| {
631+ if emu. cfg . trace_mem {
632+ log_red ! (
633+ emu,
634+ "mem: force_write_dword: 0x{:x?} = 0x{:x}" ,
635+ self . build_addresses( addr, 4 ) ,
636+ value
637+ ) ;
638+ }
639+ } ) . unwrap ( ) ;
640+ }
641+ }
642+
643+ #[ inline( always) ]
644+ pub fn force_write_qword ( & mut self , addr : u64 , value : u64 ) {
645+ let idx = ( addr - self . base_addr ) as usize ;
646+ self . mem [ idx..idx + 8 ] . copy_from_slice ( value. to_le_bytes ( ) . to_vec ( ) . as_ref ( ) ) ;
647+
648+ if cfg ! ( feature = "log_mem_write" ) {
649+ emu_context:: with_current_emu ( |emu| {
650+ if emu. cfg . trace_mem {
651+ log_red ! (
652+ emu,
653+ "mem: force_write_qword: 0x{:x?} = 0x{:x}" ,
654+ self . build_addresses( addr, 8 ) ,
655+ value
656+ ) ;
657+ }
658+ } ) . unwrap ( ) ;
659+ }
660+ }
661+
662+ #[ inline( always) ]
663+ pub fn force_write_oword ( & mut self , addr : u64 , value : u128 ) {
664+ let idx = ( addr - self . base_addr ) as usize ;
665+ self . mem [ idx..idx + 16 ] . copy_from_slice ( value. to_le_bytes ( ) . to_vec ( ) . as_ref ( ) ) ;
666+
667+ if cfg ! ( feature = "log_mem_write" ) {
668+ emu_context:: with_current_emu ( |emu| {
669+ if emu. cfg . trace_mem {
670+ log_red ! (
671+ emu,
672+ "mem: force_write_oword: 0x{:x?} = 0x{:x}" ,
673+ self . build_addresses( addr, 16 ) ,
674+ value
675+ ) ;
676+ }
677+ } ) . unwrap ( ) ;
678+ }
679+ }
680+
681+ #[ inline( always) ]
682+ pub fn force_write_string ( & mut self , addr : u64 , s : & str ) {
683+ let mut v = s. as_bytes ( ) . to_vec ( ) ;
684+ v. push ( 0 ) ;
685+ self . force_write_bytes ( addr, & v) ;
686+
687+ if cfg ! ( feature = "log_mem_write" ) {
688+ emu_context:: with_current_emu ( |emu| {
689+ if emu. cfg . trace_mem {
690+ log_red ! (
691+ emu,
692+ "mem: force_write_string: 0x{:x?} = {:?}" ,
693+ self . build_addresses( addr, s. len( ) + 1 ) ,
694+ s
695+ ) ;
696+ }
697+ } ) . unwrap ( ) ;
698+ }
699+ }
700+
578701 #[ inline( always) ]
579702 pub fn write_byte ( & mut self , addr : u64 , value : u8 ) {
580703 if !self . can_write ( ) {
0 commit comments