Skip to content

Commit be8ca56

Browse files
author
Ole Krüger
committed
feat(memory): use Vector in PageProtections component
1 parent 4c07fba commit be8ca56

File tree

32 files changed

+210
-183
lines changed

32 files changed

+210
-183
lines changed

data/src/components/vector.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ impl<T> Vector<T, Normal> {
127127
impl<T, M: VectorMode> Index<usize> for Vector<T, M> {
128128
type Output = T;
129129

130+
#[inline(always)]
130131
fn index(&self, idx: usize) -> &T {
131132
M::index(self, idx)
132133
}
133134
}
134135

135136
impl<T, M: VectorMode> IndexMut<usize> for Vector<T, M> {
137+
#[inline(always)]
136138
fn index_mut(&mut self, idx: usize) -> &mut T {
137139
M::index_mut(self, idx)
138140
}
@@ -434,6 +436,7 @@ impl VectorMode for Normal {
434436
Vector { vector }
435437
}
436438

439+
#[inline(always)]
437440
fn index<T>(this: &Vector<T, Self>, idx: usize) -> &T {
438441
&this.vector[idx]
439442
}
@@ -448,6 +451,7 @@ impl VectorMode for Normal {
448451
unsafe { this.vector.get_unchecked_mut(idx) }
449452
}
450453

454+
#[inline(always)]
451455
fn index_mut<T>(this: &mut Vector<T, Self>, idx: usize) -> &mut T {
452456
&mut this.vector[idx]
453457
}

pvm/src/instruction_context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use arithmetic::Arithmetic;
1515
use comparable::Comparable;
1616
use octez_riscv_data::components::atom::AtomMode;
1717
use octez_riscv_data::components::data_space::DataSpaceMode;
18+
use octez_riscv_data::components::vector::VectorMode;
1819
use rustc_apfloat::Float;
1920
use rustc_apfloat::Status;
2021
use rustc_apfloat::StatusAnd;
@@ -248,7 +249,7 @@ where
248249
fn csr_write(&mut self, reg: CSRegister, value: Self::XValue);
249250
}
250251

251-
impl<MC: MemoryConfig, M: AtomMode + DataSpaceMode> ICB for MachineCoreState<MC, M> {
252+
impl<MC: MemoryConfig, M: AtomMode + DataSpaceMode + VectorMode> ICB for MachineCoreState<MC, M> {
252253
type XValue = XValue;
253254

254255
type FValue = FValue;

pvm/src/interpreter/common_memory.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
use octez_riscv_data::components::atom::AtomMode;
77
use octez_riscv_data::components::data_space::DataSpaceMode;
8+
use octez_riscv_data::components::vector::VectorMode;
89
use octez_riscv_data::serialisation::elem::Elem;
910

1011
use crate::exceptions::Exception;
@@ -17,7 +18,7 @@ use crate::machine_state::registers::XRegister;
1718
impl<MC, M> MachineCoreState<MC, M>
1819
where
1920
MC: memory::MemoryConfig,
20-
M: AtomMode + DataSpaceMode,
21+
M: AtomMode + DataSpaceMode + VectorMode,
2122
{
2223
/// Generic read function for loading `T::STORED_SIZE` bytes from `address`
2324
pub(super) fn read_from_address<T: Elem>(&mut self, address: u64) -> Result<T, Exception> {

pvm/src/interpreter/rv64d.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
99
use octez_riscv_data::components::atom::AtomMode;
1010
use octez_riscv_data::components::data_space::DataSpaceMode;
11+
use octez_riscv_data::components::vector::VectorMode;
1112
use rustc_apfloat::Float;
1213
use rustc_apfloat::Status;
1314
use rustc_apfloat::StatusAnd;
@@ -343,7 +344,7 @@ where
343344
impl<MC, M> MachineCoreState<MC, M>
344345
where
345346
MC: memory::MemoryConfig,
346-
M: AtomMode + DataSpaceMode,
347+
M: AtomMode + DataSpaceMode + VectorMode,
347348
{
348349
/// `FLD` I-type instruction.
349350
///

pvm/src/interpreter/rv64f.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
99
use octez_riscv_data::components::atom::AtomMode;
1010
use octez_riscv_data::components::data_space::DataSpaceMode;
11+
use octez_riscv_data::components::vector::VectorMode;
1112
use rustc_apfloat::Float;
1213
use rustc_apfloat::Status;
1314
use rustc_apfloat::StatusAnd;
@@ -352,7 +353,7 @@ where
352353
impl<MC, M> MachineCoreState<MC, M>
353354
where
354355
MC: memory::MemoryConfig,
355-
M: AtomMode + DataSpaceMode,
356+
M: AtomMode + DataSpaceMode + VectorMode,
356357
{
357358
/// `FLW` I-type instruction.
358359
///

pvm/src/machine_state.rs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ use octez_riscv_data::components::atom::EncodeAtomMode;
3838
use octez_riscv_data::components::data_space::CloneDataSpaceMode;
3939
use octez_riscv_data::components::data_space::DataSpaceMode;
4040
use octez_riscv_data::components::data_space::EncodeDataSpaceMode;
41+
use octez_riscv_data::components::vector::CloneVectorMode;
42+
use octez_riscv_data::components::vector::EncodeVectorMode;
43+
use octez_riscv_data::components::vector::VectorMode;
4144
use octez_riscv_data::foldable::Fold;
4245
use octez_riscv_data::foldable::Foldable;
4346
use octez_riscv_data::foldable::NodeFold;
@@ -105,7 +108,7 @@ impl<MC: memory::MemoryConfig, M: Mode> MachineCoreState<MC, M> {
105108
/// Reset the machine state.
106109
pub fn reset(&mut self, listener: impl MemoryGovernanceListener)
107110
where
108-
M: AtomMode + DataSpaceMode,
111+
M: AtomMode + DataSpaceMode + VectorMode,
109112
{
110113
self.hart.reset(memory::FIRST_ADDRESS);
111114
self.main_memory.reset(listener);
@@ -119,7 +122,7 @@ impl<MC: memory::MemoryConfig, M: Mode> MachineCoreState<MC, M> {
119122
phys_addr: Address,
120123
) -> Result<memory::InstructionData<u16>, Exception>
121124
where
122-
M: AtomMode + DataSpaceMode,
125+
M: AtomMode + DataSpaceMode + VectorMode,
123126
{
124127
self.main_memory
125128
.read_exec(phys_addr)
@@ -132,7 +135,7 @@ impl<MC: memory::MemoryConfig, M: Mode> MachineCoreState<MC, M> {
132135
#[inline]
133136
fn fetch_instr(&self, addr: Address) -> Result<memory::InstructionData<Instruction>, Exception>
134137
where
135-
M: AtomMode + DataSpaceMode,
138+
M: AtomMode + DataSpaceMode + VectorMode,
136139
{
137140
let lower = self.fetch_instr_halfword(addr)?;
138141

@@ -229,7 +232,9 @@ where
229232
pub const RISCV_ABI_SP_ALIGNMENT: NonZeroU64 =
230233
NonZeroU64::new(16).expect("Alignment must be non-zero");
231234

232-
impl<MC: memory::MemoryConfig, M: AtomMode + DataSpaceMode> Default for MachineCoreState<MC, M> {
235+
impl<MC: memory::MemoryConfig, M: AtomMode + DataSpaceMode + VectorMode> Default
236+
for MachineCoreState<MC, M>
237+
{
233238
fn default() -> Self {
234239
Self {
235240
hart: HartState::default(),
@@ -251,7 +256,7 @@ impl<'normal, MC: memory::MemoryConfig> Provable<'normal> for MachineCoreState<M
251256
}
252257
}
253258

254-
impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneDataSpaceMode> Clone
259+
impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneVectorMode + CloneDataSpaceMode> Clone
255260
for MachineCoreState<MC, M>
256261
{
257262
fn clone(&self) -> Self {
@@ -263,7 +268,7 @@ impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneDataSpaceMode> Clone
263268
}
264269
}
265270

266-
impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneDataSpaceMode> CloneState
271+
impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneVectorMode + CloneDataSpaceMode> CloneState
267272
for MachineCoreState<MC, M>
268273
{
269274
fn clone_state(&self) -> Self {
@@ -275,7 +280,7 @@ impl<MC: memory::MemoryConfig, M: CloneAtomMode + CloneDataSpaceMode> CloneState
275280
}
276281
}
277282

278-
impl<MC: memory::MemoryConfig, M: EncodeAtomMode + EncodeDataSpaceMode> Encode
283+
impl<MC: memory::MemoryConfig, M: EncodeAtomMode + EncodeDataSpaceMode + EncodeVectorMode> Encode
279284
for MachineCoreState<MC, M>
280285
{
281286
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
@@ -307,8 +312,11 @@ pub struct MachineState<MC: memory::MemoryConfig, PC, M: Mode> {
307312
pub page_cache: PC,
308313
}
309314

310-
impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: CloneAtomMode + CloneDataSpaceMode> Clone
311-
for MachineState<MC, PC, M>
315+
impl<
316+
MC: memory::MemoryConfig,
317+
PC: PageCache<MC, M>,
318+
M: CloneAtomMode + CloneVectorMode + CloneDataSpaceMode,
319+
> Clone for MachineState<MC, PC, M>
312320
{
313321
// TODO: RV-806: implement Clone on PageCache
314322
fn clone(&self) -> Self {
@@ -332,8 +340,11 @@ impl<'normal, MC: memory::MemoryConfig, PC: PageCache<MC, Normal>> Provable<'nor
332340
}
333341
}
334342

335-
impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: CloneAtomMode + CloneDataSpaceMode>
336-
CloneState for MachineState<MC, PC, M>
343+
impl<
344+
MC: memory::MemoryConfig,
345+
PC: PageCache<MC, M>,
346+
M: CloneAtomMode + CloneVectorMode + CloneDataSpaceMode,
347+
> CloneState for MachineState<MC, PC, M>
337348
{
338349
fn clone_state(&self) -> Self {
339350
Self {
@@ -378,7 +389,7 @@ impl<MC, PC, M> Encode for MachineState<MC, PC, M>
378389
where
379390
MC: MemoryConfig,
380391
PC: PageCache<MC, M>,
381-
M: EncodeAtomMode + EncodeDataSpaceMode,
392+
M: EncodeAtomMode + EncodeDataSpaceMode + EncodeVectorMode,
382393
{
383394
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
384395
self.core.encode(encoder)
@@ -468,8 +479,8 @@ impl<E> Default for StepManyResult<E> {
468479
}
469480
}
470481

471-
impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: AtomMode + DataSpaceMode> Default
472-
for MachineState<MC, PC, M>
482+
impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: AtomMode + DataSpaceMode + VectorMode>
483+
Default for MachineState<MC, PC, M>
473484
{
474485
fn default() -> Self {
475486
Self {
@@ -483,7 +494,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
483494
/// Reset the machine state.
484495
pub fn reset(&mut self)
485496
where
486-
M: AtomMode + DataSpaceMode,
497+
M: AtomMode + DataSpaceMode + VectorMode,
487498
{
488499
let listener = &mut self.page_cache;
489500
self.core.reset(listener);
@@ -506,7 +517,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
506517
/// *not* writable.
507518
fn run_instr_at(&mut self, addr: Address) -> Result<ProgramCounterUpdate<Address>, Exception>
508519
where
509-
M: AtomMode + DataSpaceMode,
520+
M: AtomMode + DataSpaceMode + VectorMode,
510521
{
511522
let memory::InstructionData {
512523
data: instr,
@@ -531,7 +542,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
531542
#[inline]
532543
pub fn step(&mut self) -> Result<(), Exception>
533544
where
534-
M: AtomMode + DataSpaceMode,
545+
M: AtomMode + DataSpaceMode + VectorMode,
535546
{
536547
match self.step_max_inner(1).error {
537548
Some(error) => Err(error),
@@ -541,7 +552,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
541552

542553
pub(super) fn step_max_inner(&mut self, max_steps: usize) -> StepManyResult<Exception>
543554
where
544-
M: AtomMode + DataSpaceMode,
555+
M: AtomMode + DataSpaceMode + VectorMode,
545556
{
546557
let mut result = StepManyResult::ZERO;
547558

@@ -583,7 +594,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
583594
#[inline]
584595
pub fn step_max(&mut self, max_steps: Bound<usize>) -> StepManyResult<Exception>
585596
where
586-
M: AtomMode + DataSpaceMode,
597+
M: AtomMode + DataSpaceMode + VectorMode,
587598
{
588599
let mut result = StepManyResult::ZERO;
589600

@@ -614,7 +625,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
614625
mut handle: impl FnMut(&mut Self) -> ControlFlow<E>,
615626
) -> StepManyResult<E>
616627
where
617-
M: AtomMode + DataSpaceMode,
628+
M: AtomMode + DataSpaceMode + VectorMode,
618629
{
619630
let mut steps = 0usize;
620631

@@ -652,7 +663,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
652663
mut handle: impl FnMut(&mut Self) -> ControlFlow<E>,
653664
) -> ControlFlow<E>
654665
where
655-
M: AtomMode + DataSpaceMode,
666+
M: AtomMode + DataSpaceMode + VectorMode,
656667
{
657668
match cause {
658669
Exception::EnvCall => return handle(self),
@@ -701,7 +712,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
701712
handle: impl FnMut(&mut Self) -> ControlFlow<E>,
702713
) -> ControlFlow<E>
703714
where
704-
M: AtomMode + DataSpaceMode,
715+
M: AtomMode + DataSpaceMode + VectorMode,
705716
{
706717
let instr_pc = self.core.hart.pc.read();
707718
let result = self
@@ -740,7 +751,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
740751
program: &Program<MC>,
741752
) -> Result<(Address, Address), MachineError>
742753
where
743-
M: AtomMode + DataSpaceMode,
754+
M: AtomMode + DataSpaceMode + VectorMode,
744755
{
745756
let program_start = program.segments.keys().min().copied().unwrap_or(0);
746757
let program_end = program
@@ -797,7 +808,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
797808

798809
fn dispatch_signal_or_trap(&mut self, signal: Signal)
799810
where
800-
M: AtomMode + DataSpaceMode,
811+
M: AtomMode + DataSpaceMode + VectorMode,
801812
{
802813
if self.core.dispatch_signal(signal).is_err() {
803814
self.core.hart.pc.write(0);
@@ -810,7 +821,7 @@ impl<MC: memory::MemoryConfig, PC: PageCache<MC, M>, M: Mode> MachineState<MC, P
810821
) where
811822
MB: memory::buddy::Buddy<M>,
812823
MC: MemoryConfig<State<M> = memory::state::MemoryImpl<PAGES, TOTAL_BYTES, MB, M>>,
813-
M: AtomMode + DataSpaceMode,
824+
M: AtomMode + DataSpaceMode + VectorMode,
814825
{
815826
let (main_memory, listener) = self.memory_with_listener();
816827
main_memory.set_all_readable_writeable(listener);

0 commit comments

Comments
 (0)