diff --git a/src/libos/src/vm/process_vm.rs b/src/libos/src/vm/process_vm.rs index 0be3b85d..3887ef78 100644 --- a/src/libos/src/vm/process_vm.rs +++ b/src/libos/src/vm/process_vm.rs @@ -101,7 +101,7 @@ impl<'a, 'b> ProcessVMBuilder<'a, 'b> { let process_layout = elf_layouts.iter().chain(other_layouts.iter()).fold( VMLayout::new_empty(), |mut process_layout, sub_layout| { - process_layout.extend(&sub_layout); + process_layout.add(&sub_layout); process_layout }, ); diff --git a/src/libos/src/vm/vm_layout.rs b/src/libos/src/vm/vm_layout.rs index d025f038..578fa5c1 100644 --- a/src/libos/src/vm/vm_layout.rs +++ b/src/libos/src/vm/vm_layout.rs @@ -21,7 +21,8 @@ impl VMLayout { } } - pub fn extend(&mut self, more_space: &VMLayout) -> &mut Self { + // This is used to add "more_space" to VM layout + pub fn add(&mut self, more_space: &VMLayout) -> &mut Self { if more_space.size == 0 { return self; } @@ -31,6 +32,20 @@ impl VMLayout { self } + // This is used to get the bigger and aligned VM layout + pub fn extend(&mut self, new_space: &VMLayout) -> &mut Self { + if new_space.size == 0 { + return self; + } + + self.align = max(self.align, new_space.align); + self.size = { + let size = max(self.size, new_space.size); + align_up(size, self.align) + }; + self + } + pub fn size(&self) -> usize { self.size }