Skip to content

Commit eed5eb1

Browse files
committed
Optimize shadow stack storage
1 parent c36e96b commit eed5eb1

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/snapshot.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use crate::instructions::Register;
22
use crate::memory::FLAG_DIRTY;
33
use crate::memory::Memory;
4-
use crate::{CoreMachine, Error, RISCV_GENERAL_REGISTER_NUMBER, RISCV_PAGE_SHIFTS, RISCV_PAGESIZE};
4+
use crate::{
5+
CoreMachine, DEFAULT_SHADOW_STACK_SIZE, Error, RISCV_GENERAL_REGISTER_NUMBER,
6+
RISCV_PAGE_SHIFTS, RISCV_PAGESIZE,
7+
};
58
use serde::{Deserialize, Serialize};
69

710
// Snapshot provides a mechanism for suspending and resuming a virtual machine.
@@ -40,14 +43,20 @@ pub struct Snapshot {
4043
}
4144

4245
pub fn make_snapshot<T: CoreMachine>(machine: &mut T) -> Result<Snapshot, Error> {
46+
let mut snap_ss = machine.ss().to_vec();
47+
if let Some(pos) = snap_ss.iter().position(|&x| x != 0) {
48+
snap_ss.drain(..pos);
49+
} else {
50+
snap_ss.clear();
51+
}
4352
let mut snap = Snapshot {
4453
version: machine.version(),
4554
pc: machine.pc().to_u64(),
4655
load_reservation_address: machine.memory().lr().to_u64(),
4756
cfi: machine.cfi().into(),
4857
elp: machine.elp(),
4958
ssp: machine.ssp().to_u64(),
50-
ss: machine.ss().to_vec(),
59+
ss: snap_ss,
5160
..Default::default()
5261
};
5362
for (i, v) in machine.registers().iter().enumerate() {
@@ -108,6 +117,6 @@ pub fn resume<T: CoreMachine>(machine: &mut T, snapshot: &Snapshot) -> Result<()
108117
machine.set_cfi(snapshot.cfi.into());
109118
machine.set_elp(snapshot.elp);
110119
machine.set_ssp(&T::REG::from_u64(snapshot.ssp));
111-
machine.ss_mut().copy_from_slice(&snapshot.ss);
120+
machine.ss_mut()[DEFAULT_SHADOW_STACK_SIZE - snapshot.ss.len()..].copy_from_slice(&snapshot.ss);
112121
Ok(())
113122
}

src/snapshot2.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
Error, RISCV_GENERAL_REGISTER_NUMBER, RISCV_PAGESIZE, Register,
2+
DEFAULT_SHADOW_STACK_SIZE, Error, RISCV_GENERAL_REGISTER_NUMBER, RISCV_PAGESIZE, Register,
33
bits::roundup,
44
elf::{LoadingAction, ProgramMetadata},
55
machine::SupportMachine,
@@ -104,7 +104,8 @@ impl<I: Clone + PartialEq, D: DataSource<I>> Snapshot2Context<I, D> {
104104
machine.set_cfi(snapshot.cfi.into());
105105
machine.set_elp(snapshot.elp);
106106
machine.set_ssp(&M::REG::from_u64(snapshot.ssp));
107-
machine.ss_mut().copy_from_slice(&snapshot.ss);
107+
machine.ss_mut()[DEFAULT_SHADOW_STACK_SIZE - snapshot.ss.len()..]
108+
.copy_from_slice(&snapshot.ss);
108109
Ok(())
109110
}
110111

@@ -214,6 +215,12 @@ impl<I: Clone + PartialEq, D: DataSource<I>> Snapshot2Context<I, D> {
214215
for (i, v) in machine.registers().iter().enumerate() {
215216
registers[i] = v.to_u64();
216217
}
218+
let mut snap_ss = machine.ss().to_vec();
219+
if let Some(pos) = snap_ss.iter().position(|&x| x != 0) {
220+
snap_ss.drain(..pos);
221+
} else {
222+
snap_ss.clear();
223+
}
217224
Ok(Snapshot2 {
218225
pages_from_source,
219226
dirty_pages,
@@ -226,7 +233,7 @@ impl<I: Clone + PartialEq, D: DataSource<I>> Snapshot2Context<I, D> {
226233
cfi: machine.cfi().into(),
227234
elp: machine.elp(),
228235
ssp: machine.ssp().to_u64(),
229-
ss: machine.ss().to_vec(),
236+
ss: snap_ss,
230237
})
231238
}
232239

0 commit comments

Comments
 (0)