@@ -24,6 +24,7 @@ use goblin::elf32::program_header::PT_LOAD;
24
24
#[ cfg( feature = "init-paging" ) ]
25
25
use goblin:: elf64:: program_header:: PT_LOAD ;
26
26
27
+ use super :: shared_mem:: ExclusiveSharedMemory ;
27
28
use crate :: { Result , log_then_return, new_error} ;
28
29
29
30
pub ( crate ) struct ElfInfo {
@@ -73,15 +74,26 @@ impl ElfInfo {
73
74
. unwrap ( ) ;
74
75
( max_phdr. p_vaddr + max_phdr. p_memsz - self . get_base_va ( ) ) as usize
75
76
}
76
- pub ( crate ) fn load_at ( & self , load_addr : usize , target : & mut [ u8 ] ) -> Result < ( ) > {
77
+ pub ( crate ) fn load_at (
78
+ & self ,
79
+ load_addr : usize ,
80
+ guest_code_offset : usize ,
81
+ excl : & mut ExclusiveSharedMemory ,
82
+ ) -> Result < ( ) > {
77
83
let base_va = self . get_base_va ( ) ;
78
84
for phdr in self . phdrs . iter ( ) . filter ( |phdr| phdr. p_type == PT_LOAD ) {
79
85
let start_va = ( phdr. p_vaddr - base_va) as usize ;
80
86
let payload_offset = phdr. p_offset as usize ;
81
87
let payload_len = phdr. p_filesz as usize ;
82
- target[ start_va..start_va + payload_len]
83
- . copy_from_slice ( & self . payload [ payload_offset..payload_offset + payload_len] ) ;
84
- target[ start_va + payload_len..start_va + phdr. p_memsz as usize ] . fill ( 0 ) ;
88
+ excl. copy_from_slice (
89
+ & self . payload [ payload_offset..payload_offset + payload_len] ,
90
+ guest_code_offset + start_va,
91
+ ) ?;
92
+
93
+ excl. zero_fill (
94
+ guest_code_offset + start_va + payload_len,
95
+ phdr. p_memsz as usize - payload_len,
96
+ ) ?;
85
97
}
86
98
let get_addend = |name, r : & Reloc | {
87
99
r. r_addend
@@ -104,8 +116,10 @@ impl ElfInfo {
104
116
match r. r_type {
105
117
R_X86_64_RELATIVE => {
106
118
let addend = get_addend ( "R_X86_64_RELATIVE" , r) ?;
107
- target[ r. r_offset as usize ..r. r_offset as usize + 8 ]
108
- . copy_from_slice ( & ( load_addr as i64 + addend) . to_le_bytes ( ) ) ;
119
+ excl. copy_from_slice (
120
+ & ( load_addr as i64 + addend) . to_le_bytes ( ) ,
121
+ guest_code_offset + r. r_offset as usize ,
122
+ ) ?;
109
123
}
110
124
R_X86_64_NONE => { }
111
125
_ => {
0 commit comments