Skip to content

Commit c1aad5f

Browse files
aljimenezbalxiord
authored andcommitted
Rename kernel_start to kernel_offset
The load() method in the KernelLoader trait takes a kernel_start argument that has different behavior in the Elf, BzImage, and PE implementations. Elf: kernel_start provides an offset to be added to the default kernel load address encoded in the phdr.p_paddr field of the Elf header. A VMM using kernel_start requests that the kernel is loaded in guest memory at phdr.p_paddr + kernel_start. BzImage: kernel_start allows to specify an absolute address at which to load the kernel in guest memory, replacing the default address taken from the code32_start field of the bzImage header. PE: kernel_start specifies a 2MB-aligned base address in guest memory. The kernel must be loaded at kernel_start + text_offset, where text_offset value is read from the Image header. Change the name from kernel_start to kernel_offset, and change the argument description on each implementation to clarify its use. Related to #12 Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
1 parent 2a62f21 commit c1aad5f

File tree

4 files changed

+20
-20
lines changed

4 files changed

+20
-20
lines changed

src/loader/aarch64/pe/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ impl KernelLoader for PE {
9696
/// # Arguments
9797
///
9898
/// * `guest_mem` - The guest memory where the kernel image is loaded.
99-
/// * `kernel_start` - The offset into 'guest_mem' at which to load the kernel.
99+
/// * `kernel_offset` - 2MB-aligned base addres in guest memory at at which to load the kernel.
100100
/// * `kernel_image` - Input Image format kernel image.
101101
/// * `highmem_start_address` - ignored on ARM64.
102102
///
103103
/// # Returns
104104
/// * KernelLoaderResult
105105
fn load<F, M: GuestMemory>(
106106
guest_mem: &M,
107-
kernel_start: Option<GuestAddress>,
107+
kernel_offset: Option<GuestAddress>,
108108
kernel_image: &mut F,
109109
_highmem_start_address: Option<GuestAddress>,
110110
) -> Result<KernelLoaderResult>
@@ -135,7 +135,7 @@ impl KernelLoader for PE {
135135
text_offset = 0x80000;
136136
}
137137

138-
let mem_offset = kernel_start
138+
let mem_offset = kernel_offset
139139
.unwrap_or(GuestAddress(0))
140140
.checked_add(text_offset)
141141
.ok_or(Error::InvalidImage)?;

src/loader/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,14 @@ pub trait KernelLoader {
145145
/// # Arguments
146146
///
147147
/// * `guest_mem`: [`GuestMemory`] to load the kernel in.
148-
/// * `kernel_start`: Address in guest memory where the kernel is loaded.
148+
/// * `kernel_offset`: Usage varies between implementations.
149149
/// * `kernel_image`: Kernel image to be loaded.
150150
/// * `highmem_start_address`: Address where high memory starts.
151151
///
152152
/// [`GuestMemory`]: https://docs.rs/vm-memory/latest/vm_memory/guest_memory/trait.GuestMemory.html
153153
fn load<F, M: GuestMemory>(
154154
guest_mem: &M,
155-
kernel_start: Option<GuestAddress>,
155+
kernel_offset: Option<GuestAddress>,
156156
kernel_image: &mut F,
157157
highmem_start_address: Option<GuestAddress>,
158158
) -> Result<KernelLoaderResult>

src/loader/x86_64/bzimage/mod.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl KernelLoader for BzImage {
7070
/// # Arguments
7171
///
7272
/// * `guest_mem`: [`GuestMemory`] to load the kernel in.
73-
/// * `kernel_start`: Address in guest memory where the kernel is loaded.
73+
/// * `kernel_offset`: Address in guest memory where the kernel is loaded.
7474
/// * `kernel_image` - Input bzImage image.
7575
/// * `highmem_start_address`: Address where high memory starts.
7676
///
@@ -98,7 +98,7 @@ impl KernelLoader for BzImage {
9898
/// [`GuestMemory`]: https://docs.rs/vm-memory/latest/vm_memory/guest_memory/trait.GuestMemory.html
9999
fn load<F, M: GuestMemory>(
100100
guest_mem: &M,
101-
kernel_start: Option<GuestAddress>,
101+
kernel_offset: Option<GuestAddress>,
102102
kernel_image: &mut F,
103103
highmem_start_address: Option<GuestAddress>,
104104
) -> Result<KernelLoaderResult>
@@ -144,7 +144,7 @@ impl KernelLoader for BzImage {
144144
return Err(KernelLoaderError::InvalidKernelStartAddress);
145145
}
146146

147-
let mem_offset = match kernel_start {
147+
let mem_offset = match kernel_offset {
148148
Some(start) => start,
149149
None => GuestAddress(u64::from(boot_header.code32_start)),
150150
};
@@ -197,13 +197,13 @@ mod tests {
197197
fn test_load_bzImage() {
198198
let gm = create_guest_mem();
199199
let image = make_bzimage();
200-
let mut kernel_start = GuestAddress(0x200000);
200+
let mut kernel_offset = GuestAddress(0x200000);
201201
let mut highmem_start_address = GuestAddress(0x0);
202202

203-
// load bzImage with good kernel_start and himem_start setting
203+
// load bzImage with good kernel_offset and himem_start setting
204204
let mut loader_result = BzImage::load(
205205
&gm,
206-
Some(kernel_start),
206+
Some(kernel_offset),
207207
&mut Cursor::new(&image),
208208
Some(highmem_start_address),
209209
)
@@ -215,7 +215,7 @@ mod tests {
215215
assert_eq!(loader_result.setup_header.unwrap().loadflags, 1);
216216
assert_eq!(loader_result.kernel_end, 0x60c320);
217217

218-
// load bzImage without kernel_start
218+
// load bzImage without kernel_offset
219219
loader_result = BzImage::load(
220220
&gm,
221221
None,
@@ -231,14 +231,14 @@ mod tests {
231231
assert_eq!(loader_result.kernel_load.raw_value(), 0x100000);
232232

233233
// load bzImage with a bad himem setting
234-
kernel_start = GuestAddress(0x1000);
234+
kernel_offset = GuestAddress(0x1000);
235235
highmem_start_address = GuestAddress(0x200000);
236236

237237
assert_eq!(
238238
Some(KernelLoaderError::InvalidKernelStartAddress),
239239
BzImage::load(
240240
&gm,
241-
Some(kernel_start),
241+
Some(kernel_offset),
242242
&mut Cursor::new(&image),
243243
Some(highmem_start_address),
244244
)

src/loader/x86_64/elf/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl KernelLoader for Elf {
126126
/// # Arguments
127127
///
128128
/// * `guest_mem`: [`GuestMemory`] to load the kernel in.
129-
/// * `kernel_start`: Address in guest memory where the kernel is loaded.
129+
/// * `kernel_offset`: Offset to be added to default kernel load address in guest memory.
130130
/// * `kernel_image` - Input vmlinux image.
131131
/// * `highmem_start_address`: Address where high memory starts.
132132
///
@@ -154,7 +154,7 @@ impl KernelLoader for Elf {
154154
/// [`GuestMemory`]: https://docs.rs/vm-memory/latest/vm_memory/guest_memory/trait.GuestMemory.html
155155
fn load<F, M: GuestMemory>(
156156
guest_mem: &M,
157-
kernel_start: Option<GuestAddress>,
157+
kernel_offset: Option<GuestAddress>,
158158
kernel_image: &mut F,
159159
highmem_start_address: Option<GuestAddress>,
160160
) -> Result<KernelLoaderResult>
@@ -181,8 +181,8 @@ impl KernelLoader for Elf {
181181
let mut loader_result: KernelLoaderResult = Default::default();
182182

183183
// Address where the kernel will be loaded.
184-
loader_result.kernel_load = match kernel_start {
185-
Some(start) => GuestAddress(start.raw_value() + (ehdr.e_entry as u64)),
184+
loader_result.kernel_load = match kernel_offset {
185+
Some(k_offset) => GuestAddress(k_offset.raw_value() + (ehdr.e_entry as u64)),
186186
None => GuestAddress(ehdr.e_entry as u64),
187187
};
188188

@@ -216,8 +216,8 @@ impl KernelLoader for Elf {
216216

217217
// if the vmm does not specify where the kernel should be loaded, just
218218
// load it to the physical address p_paddr for each segment.
219-
let mem_offset = match kernel_start {
220-
Some(start) => start
219+
let mem_offset = match kernel_offset {
220+
Some(k_offset) => k_offset
221221
.checked_add(phdr.p_paddr as u64)
222222
.ok_or(Error::InvalidProgramHeaderAddress)?,
223223
None => GuestAddress(phdr.p_paddr as u64),

0 commit comments

Comments
 (0)