@@ -10,7 +10,7 @@ pub trait MemoryHandler: Debug + 'static {
10
10
fn box_clone ( & self ) -> Box < dyn MemoryHandler > ;
11
11
fn map ( & self , pt : & mut PageTableImpl , va : usize , attr : & MemoryAttr ) ;
12
12
fn unmap ( & self , pt : & mut PageTableImpl , va : usize ) ;
13
- fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , src : usize , length : usize ) ;
13
+ fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , va_offset : usize , src : usize , length : usize ) ;
14
14
}
15
15
16
16
impl Clone for Box < dyn MemoryHandler > {
@@ -39,12 +39,12 @@ impl MemoryHandler for Linear {
39
39
fn unmap ( & self , pt : & mut PageTableImpl , va : usize ) {
40
40
pt. unmap ( va) ;
41
41
}
42
- fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , src : usize , length : usize ) {
42
+ fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , va_offset : usize , src : usize , length : usize ) {
43
43
let pa = pt. get_entry ( va) . expect ( "get pa error!" ) . 0 . addr ( ) . as_usize ( ) ;
44
44
assert ! ( va == access_pa_via_va( pa) ) ;
45
45
assert ! ( va == pa + self . offset) ;
46
46
unsafe {
47
- let dst = core:: slice:: from_raw_parts_mut ( va as * mut u8 , PAGE_SIZE ) ;
47
+ let dst = core:: slice:: from_raw_parts_mut ( ( va+va_offset ) as * mut u8 , PAGE_SIZE ) ;
48
48
if length > 0 {
49
49
let src = core:: slice:: from_raw_parts ( src as * const u8 , PAGE_SIZE ) ;
50
50
dst[ ..length] . clone_from_slice ( & src[ ..length] ) ;
@@ -78,10 +78,10 @@ impl MemoryHandler for ByFrame {
78
78
fn unmap ( & self , pt : & mut PageTableImpl , va : usize ) {
79
79
pt. unmap ( va) ;
80
80
}
81
- fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , src : usize , length : usize ) {
81
+ fn page_copy ( & self , pt : & mut PageTableImpl , va : usize , va_offset : usize , src : usize , length : usize ) {
82
82
let pa = pt. get_entry ( va) . expect ( "get pa error!" ) . 0 . addr ( ) . as_usize ( ) ;
83
83
unsafe {
84
- let dst = core:: slice:: from_raw_parts_mut ( access_pa_via_va ( pa) as * mut u8 , PAGE_SIZE ) ;
84
+ let dst = core:: slice:: from_raw_parts_mut ( ( access_pa_via_va ( pa) +va_offset ) as * mut u8 , PAGE_SIZE ) ;
85
85
if length > 0 {
86
86
let src = core:: slice:: from_raw_parts ( src as * const u8 , PAGE_SIZE ) ;
87
87
dst[ ..length] . clone_from_slice ( & src[ ..length] ) ;
0 commit comments