@@ -81,8 +81,12 @@ impl CoreMachine for Box<AsmCoreMachine> {
81
81
#[ no_mangle]
82
82
pub extern "C" fn inited_memory ( frame_index : u64 , machine : & mut AsmCoreMachine ) {
83
83
let addr_from = ( frame_index << MEMORY_FRAME_SHIFTS ) as usize ;
84
- let slice =
85
- machine. cast_ptr_to_slice_mut ( machine. memory_ptr , addr_from, 1 << MEMORY_FRAME_SHIFTS ) ;
84
+ let slice = cast_ptr_to_slice_mut (
85
+ machine,
86
+ machine. memory_ptr ,
87
+ addr_from,
88
+ 1 << MEMORY_FRAME_SHIFTS ,
89
+ ) ;
86
90
if machine. chaos_mode != 0 {
87
91
let mut gen = rand:: rngs:: StdRng :: seed_from_u64 ( machine. chaos_seed . into ( ) ) ;
88
92
gen. fill_bytes ( slice) ;
@@ -236,9 +240,7 @@ impl<'a> FastMemory<'a> {
236
240
let page_indices = get_page_indices ( addr, size) ;
237
241
for page in page_indices. 0 ..=page_indices. 1 {
238
242
let frame_index = page >> MEMORY_FRAME_PAGE_SHIFTS ;
239
- let slice = self
240
- . 0
241
- . cast_ptr_to_slice_mut ( self . 0 . frames_ptr , frame_index as usize , 1 ) ;
243
+ let slice = cast_ptr_to_slice_mut ( self . 0 , self . 0 . frames_ptr , frame_index as usize , 1 ) ;
242
244
slice[ 0 ] = 1 ;
243
245
self . 0 . set_flag ( page, FLAG_DIRTY ) ?;
244
246
}
@@ -254,9 +256,7 @@ impl<'a> Memory for FastMemory<'a> {
254
256
return Ok ( ( ) ) ;
255
257
}
256
258
self . prepare_memory ( addr, value. len ( ) as u64 ) ?;
257
- let slice = self
258
- . 0
259
- . cast_ptr_to_slice_mut ( self . 0 . memory_ptr , addr as usize , value. len ( ) ) ;
259
+ let slice = cast_ptr_to_slice_mut ( self . 0 , self . 0 . memory_ptr , addr as usize , value. len ( ) ) ;
260
260
slice. copy_from_slice ( value) ;
261
261
Ok ( ( ) )
262
262
}
@@ -266,9 +266,7 @@ impl<'a> Memory for FastMemory<'a> {
266
266
return Ok ( ( ) ) ;
267
267
}
268
268
self . prepare_memory ( addr, size) ?;
269
- let slice = self
270
- . 0
271
- . cast_ptr_to_slice_mut ( self . 0 . memory_ptr , addr as usize , size as usize ) ;
269
+ let slice = cast_ptr_to_slice_mut ( self . 0 , self . 0 . memory_ptr , addr as usize , size as usize ) ;
272
270
memset ( slice, value) ;
273
271
Ok ( ( ) )
274
272
}
@@ -361,9 +359,9 @@ impl Memory for Box<AsmCoreMachine> {
361
359
type REG = u64 ;
362
360
363
361
fn reset_memory ( & mut self ) -> Result < ( ) , Error > {
364
- let slice = self . cast_ptr_to_slice_mut ( self . flags_ptr , 0 , self . flags_size as usize ) ;
362
+ let slice = cast_ptr_to_slice_mut ( self , self . flags_ptr , 0 , self . flags_size as usize ) ;
365
363
memset ( slice, 0 ) ;
366
- let slice = self . cast_ptr_to_slice_mut ( self . frames_ptr , 0 , self . frames_size as usize ) ;
364
+ let slice = cast_ptr_to_slice_mut ( self , self . frames_ptr , 0 , self . frames_size as usize ) ;
367
365
memset ( slice, 0 ) ;
368
366
self . load_reservation_address = u64:: MAX ;
369
367
self . last_read_frame = u64:: MAX ;
@@ -428,7 +426,7 @@ impl Memory for Box<AsmCoreMachine> {
428
426
429
427
fn fetch_flag ( & mut self , page : u64 ) -> Result < u8 , Error > {
430
428
if page < self . memory_pages ( ) as u64 {
431
- let slice = self . cast_ptr_to_slice ( self . flags_ptr , page as usize , 1 ) ;
429
+ let slice = cast_ptr_to_slice ( self , self . flags_ptr , page as usize , 1 ) ;
432
430
Ok ( slice[ 0 ] )
433
431
} else {
434
432
Err ( Error :: MemOutOfBound (
@@ -440,7 +438,7 @@ impl Memory for Box<AsmCoreMachine> {
440
438
441
439
fn set_flag ( & mut self , page : u64 , flag : u8 ) -> Result < ( ) , Error > {
442
440
if page < self . memory_pages ( ) as u64 {
443
- let slice = self . cast_ptr_to_slice_mut ( self . flags_ptr , page as usize , 1 ) ;
441
+ let slice = cast_ptr_to_slice_mut ( self , self . flags_ptr , page as usize , 1 ) ;
444
442
slice[ 0 ] |= flag;
445
443
// Clear last write page cache
446
444
self . last_write_page = u64:: MAX ;
@@ -455,7 +453,7 @@ impl Memory for Box<AsmCoreMachine> {
455
453
456
454
fn clear_flag ( & mut self , page : u64 , flag : u8 ) -> Result < ( ) , Error > {
457
455
if page < self . memory_pages ( ) as u64 {
458
- let slice = self . cast_ptr_to_slice_mut ( self . flags_ptr , page as usize , 1 ) ;
456
+ let slice = cast_ptr_to_slice_mut ( self , self . flags_ptr , page as usize , 1 ) ;
459
457
slice[ 0 ] &= !flag;
460
458
// Clear last write page cache
461
459
self . last_write_page = u64:: MAX ;
@@ -483,7 +481,7 @@ impl Memory for Box<AsmCoreMachine> {
483
481
check_memory ( self , page) ;
484
482
self . set_flag ( page, FLAG_DIRTY ) ?;
485
483
}
486
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , value. len ( ) ) ;
484
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , value. len ( ) ) ;
487
485
slice. copy_from_slice ( value) ;
488
486
Ok ( ( ) )
489
487
}
@@ -499,7 +497,7 @@ impl Memory for Box<AsmCoreMachine> {
499
497
check_memory ( self , page) ;
500
498
self . set_flag ( page, FLAG_DIRTY ) ?;
501
499
}
502
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , size as usize ) ;
500
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , size as usize ) ;
503
501
memset ( slice, value) ;
504
502
Ok ( ( ) )
505
503
}
@@ -523,72 +521,72 @@ impl Memory for Box<AsmCoreMachine> {
523
521
524
522
fn execute_load16 ( & mut self , addr : u64 ) -> Result < u16 , Error > {
525
523
check_memory_executable ( self , addr, 2 ) ?;
526
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 2 ) ;
524
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 2 ) ;
527
525
Ok ( LittleEndian :: read_u16 ( slice) )
528
526
}
529
527
530
528
fn execute_load32 ( & mut self , addr : u64 ) -> Result < u32 , Error > {
531
529
check_memory_executable ( self , addr, 4 ) ?;
532
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 4 ) ;
530
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 4 ) ;
533
531
Ok ( LittleEndian :: read_u32 ( slice) )
534
532
}
535
533
536
534
fn load8 ( & mut self , addr : & u64 ) -> Result < u64 , Error > {
537
535
let addr = * addr;
538
536
check_memory_inited ( self , addr, 1 ) ?;
539
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 1 ) ;
537
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 1 ) ;
540
538
Ok ( u64:: from ( slice[ 0 ] ) )
541
539
}
542
540
543
541
fn load16 ( & mut self , addr : & u64 ) -> Result < u64 , Error > {
544
542
let addr = * addr;
545
543
check_memory_inited ( self , addr, 2 ) ?;
546
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 2 ) ;
544
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 2 ) ;
547
545
Ok ( u64:: from ( LittleEndian :: read_u16 ( slice) ) )
548
546
}
549
547
550
548
fn load32 ( & mut self , addr : & u64 ) -> Result < u64 , Error > {
551
549
let addr = * addr;
552
550
check_memory_inited ( self , addr, 4 ) ?;
553
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 4 ) ;
551
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 4 ) ;
554
552
Ok ( u64:: from ( LittleEndian :: read_u32 ( slice) ) )
555
553
}
556
554
557
555
fn load64 ( & mut self , addr : & u64 ) -> Result < u64 , Error > {
558
556
let addr = * addr;
559
557
check_memory_inited ( self , addr, 8 ) ?;
560
- let slice = self . cast_ptr_to_slice ( self . memory_ptr , addr as usize , 8 ) ;
558
+ let slice = cast_ptr_to_slice ( self , self . memory_ptr , addr as usize , 8 ) ;
561
559
Ok ( LittleEndian :: read_u64 ( slice) )
562
560
}
563
561
564
562
fn store8 ( & mut self , addr : & u64 , value : & u64 ) -> Result < ( ) , Error > {
565
563
let addr = * addr;
566
564
check_memory_writable ( self , addr, 1 ) ?;
567
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , 1 ) ;
565
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , 1 ) ;
568
566
slice[ 0 ] = * value as u8 ;
569
567
Ok ( ( ) )
570
568
}
571
569
572
570
fn store16 ( & mut self , addr : & u64 , value : & u64 ) -> Result < ( ) , Error > {
573
571
let addr = * addr;
574
572
check_memory_writable ( self , addr, 2 ) ?;
575
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , 2 ) ;
573
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , 2 ) ;
576
574
LittleEndian :: write_u16 ( slice, * value as u16 ) ;
577
575
Ok ( ( ) )
578
576
}
579
577
580
578
fn store32 ( & mut self , addr : & u64 , value : & u64 ) -> Result < ( ) , Error > {
581
579
let addr = * addr;
582
580
check_memory_writable ( self , addr, 4 ) ?;
583
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , 4 ) ;
581
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , 4 ) ;
584
582
LittleEndian :: write_u32 ( slice, * value as u32 ) ;
585
583
Ok ( ( ) )
586
584
}
587
585
588
586
fn store64 ( & mut self , addr : & u64 , value : & u64 ) -> Result < ( ) , Error > {
589
587
let addr = * addr;
590
588
check_memory_writable ( self , addr, 8 ) ?;
591
- let slice = self . cast_ptr_to_slice_mut ( self . memory_ptr , addr as usize , 8 ) ;
589
+ let slice = cast_ptr_to_slice_mut ( self , self . memory_ptr , addr as usize , 8 ) ;
592
590
LittleEndian :: write_u64 ( slice, * value as u64 ) ;
593
591
Ok ( ( ) )
594
592
}
@@ -778,6 +776,30 @@ impl AsmMachine {
778
776
}
779
777
}
780
778
779
+ // Casts a raw pointer with an offset and size to a byte slice.
780
+ // We need machine here for the lifetime.
781
+ fn cast_ptr_to_slice ( _machine : & AsmCoreMachine , ptr : u64 , offset : usize , size : usize ) -> & [ u8 ] {
782
+ unsafe {
783
+ let ptr = ptr as * const u8 ;
784
+ let ptr = ptr. add ( offset) ;
785
+ std:: slice:: from_raw_parts ( ptr, size)
786
+ }
787
+ }
788
+
789
+ // Provides similar functionality to `cast_ptr_to_slice` but returns mut slice.
790
+ fn cast_ptr_to_slice_mut (
791
+ _machine : & AsmCoreMachine ,
792
+ ptr : u64 ,
793
+ offset : usize ,
794
+ size : usize ,
795
+ ) -> & mut [ u8 ] {
796
+ unsafe {
797
+ let ptr = ptr as * mut u8 ;
798
+ let ptr = ptr. add ( offset) ;
799
+ std:: slice:: from_raw_parts_mut ( ptr, size)
800
+ }
801
+ }
802
+
781
803
#[ cfg( test) ]
782
804
mod tests {
783
805
use ckb_vm_definitions:: asm:: TRACE_ITEM_LENGTH ;
0 commit comments