@@ -10,7 +10,7 @@ pub trait MemoryHandler: Debug + 'static {
1010 fn box_clone ( & self ) -> Box < dyn MemoryHandler > ;
1111 fn map ( & self , pt : & mut PageTableImpl , va : usize , attr : & MemoryAttr ) ;
1212 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 ) ;
1414}
1515
1616impl Clone for Box < dyn MemoryHandler > {
@@ -39,12 +39,12 @@ impl MemoryHandler for Linear {
3939 fn unmap ( & self , pt : & mut PageTableImpl , va : usize ) {
4040 pt. unmap ( va) ;
4141 }
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 ) {
4343 let pa = pt. get_entry ( va) . expect ( "get pa error!" ) . 0 . addr ( ) . as_usize ( ) ;
4444 assert ! ( va == access_pa_via_va( pa) ) ;
4545 assert ! ( va == pa + self . offset) ;
4646 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 ) ;
4848 if length > 0 {
4949 let src = core:: slice:: from_raw_parts ( src as * const u8 , PAGE_SIZE ) ;
5050 dst[ ..length] . clone_from_slice ( & src[ ..length] ) ;
@@ -78,10 +78,10 @@ impl MemoryHandler for ByFrame {
7878 fn unmap ( & self , pt : & mut PageTableImpl , va : usize ) {
7979 pt. unmap ( va) ;
8080 }
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 ) {
8282 let pa = pt. get_entry ( va) . expect ( "get pa error!" ) . 0 . addr ( ) . as_usize ( ) ;
8383 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 ) ;
8585 if length > 0 {
8686 let src = core:: slice:: from_raw_parts ( src as * const u8 , PAGE_SIZE ) ;
8787 dst[ ..length] . clone_from_slice ( & src[ ..length] ) ;
0 commit comments