From 3168768d6f3afd10c05a0918f9323388cf70be37 Mon Sep 17 00:00:00 2001 From: Nick Spinale Date: Sun, 14 Jul 2024 09:52:31 +0000 Subject: [PATCH] crates/sel4-supervising/types: Split out --- Cargo.lock | 7 ++ Cargo.toml | 1 + crates/sel4-supervising/Cargo.nix | 5 +- crates/sel4-supervising/Cargo.toml | 2 +- crates/sel4-supervising/src/lib.rs | 92 +-------------------- crates/sel4-supervising/types/Cargo.nix | 14 ++++ crates/sel4-supervising/types/Cargo.toml | 20 +++++ crates/sel4-supervising/types/src/lib.rs | 101 +++++++++++++++++++++++ 8 files changed, 150 insertions(+), 92 deletions(-) create mode 100644 crates/sel4-supervising/types/Cargo.nix create mode 100644 crates/sel4-supervising/types/Cargo.toml create mode 100644 crates/sel4-supervising/types/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index fc7f2ad28..178967da2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2741,6 +2741,13 @@ name = "sel4-supervising" version = "0.1.0" dependencies = [ "sel4", + "sel4-supervising-types", +] + +[[package]] +name = "sel4-supervising-types" +version = "0.1.0" +dependencies = [ "zerocopy", ] diff --git a/Cargo.toml b/Cargo.toml index 1760c245a..3cbcdb05e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -137,6 +137,7 @@ members = [ "crates/sel4-shared-ring-buffer/smoltcp", "crates/sel4-stack", "crates/sel4-supervising", + "crates/sel4-supervising/types", "crates/sel4-sync", "crates/sel4-sync/trivial", "crates/sel4-synthetic-elf", diff --git a/crates/sel4-supervising/Cargo.nix b/crates/sel4-supervising/Cargo.nix index 59b7b79ad..69dcf14f0 100644 --- a/crates/sel4-supervising/Cargo.nix +++ b/crates/sel4-supervising/Cargo.nix @@ -4,12 +4,11 @@ # SPDX-License-Identifier: BSD-2-Clause # -{ mk, versions, localCrates }: +{ mk, localCrates }: mk { package.name = "sel4-supervising"; dependencies = { - inherit (versions) zerocopy; - inherit (localCrates) sel4; + inherit (localCrates) sel4 sel4-supervising-types; }; } diff --git a/crates/sel4-supervising/Cargo.toml b/crates/sel4-supervising/Cargo.toml index fab25d6d8..a67dafb3b 100644 --- a/crates/sel4-supervising/Cargo.toml +++ b/crates/sel4-supervising/Cargo.toml @@ -18,4 +18,4 @@ license = "BSD-2-Clause" [dependencies] sel4 = { path = "../sel4" } -zerocopy = "0.7.32" +sel4-supervising-types = { path = "types" } diff --git a/crates/sel4-supervising/src/lib.rs b/crates/sel4-supervising/src/lib.rs index 9c92998c9..647617f9f 100644 --- a/crates/sel4-supervising/src/lib.rs +++ b/crates/sel4-supervising/src/lib.rs @@ -8,10 +8,12 @@ use core::ops::{Range, RangeInclusive}; -use zerocopy::AsBytes; - use sel4::{sel4_cfg, UnknownSyscall, UnknownSyscallInIpcBuffer, UserContext, Word}; +pub use sel4_supervising_types::{ + MemoryAccessData as VmFaultData, MemoryAccessWidth as VmFaultWidth, +}; + mod arch; pub use arch::*; @@ -349,92 +351,6 @@ where } } -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug)] -pub enum VmFaultWidth { - U8, - U16, - U32, - #[cfg(target_pointer_width = "64")] - U64, -} - -impl VmFaultWidth { - pub fn mask(self) -> Word { - match self { - Self::U8 => 0xff, - Self::U16 => 0xffff, - Self::U32 => 0xffff_ffff, - #[cfg(target_pointer_width = "64")] - Self::U64 => 0xffff_ffff_ffff_ffff, - } - } - - pub fn truncate(self, val: Word) -> VmFaultData { - match self { - Self::U8 => VmFaultData::U8(val as u8), - Self::U16 => VmFaultData::U16(val as u16), - Self::U32 => VmFaultData::U32(val as u32), - #[cfg(target_pointer_width = "64")] - Self::U64 => VmFaultData::U64(val as u64), - } - } -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -pub enum VmFaultData { - U8(u8), - U16(u16), - U32(u32), - #[cfg(target_pointer_width = "64")] - U64(u64), -} - -impl VmFaultData { - pub fn width(&self) -> VmFaultWidth { - match self { - Self::U8(_) => VmFaultWidth::U8, - Self::U16(_) => VmFaultWidth::U16, - Self::U32(_) => VmFaultWidth::U32, - #[cfg(target_pointer_width = "64")] - Self::U64(_) => VmFaultWidth::U64, - } - } - - pub fn zero_extend(&self) -> Word { - match self { - Self::U8(raw) => *raw as Word, - Self::U16(raw) => *raw as Word, - Self::U32(raw) => *raw as Word, - #[cfg(target_pointer_width = "64")] - Self::U64(raw) => *raw as Word, - } - } - - pub fn bytes(&self) -> &[u8] { - match self { - Self::U8(raw) => raw.as_bytes(), - Self::U16(raw) => raw.as_bytes(), - Self::U32(raw) => raw.as_bytes(), - #[cfg(target_pointer_width = "64")] - Self::U64(raw) => raw.as_bytes(), - } - } - - pub fn bytes_mut(&mut self) -> &mut [u8] { - match self { - Self::U8(raw) => raw.as_bytes_mut(), - Self::U16(raw) => raw.as_bytes_mut(), - Self::U32(raw) => raw.as_bytes_mut(), - #[cfg(target_pointer_width = "64")] - Self::U64(raw) => raw.as_bytes_mut(), - } - } - - pub fn set(&self, old_val: Word) -> Word { - (old_val & !self.width().mask()) | self.zero_extend() - } -} - #[allow(dead_code)] struct BitField { start: u8, diff --git a/crates/sel4-supervising/types/Cargo.nix b/crates/sel4-supervising/types/Cargo.nix new file mode 100644 index 000000000..38f4ca49f --- /dev/null +++ b/crates/sel4-supervising/types/Cargo.nix @@ -0,0 +1,14 @@ +# +# Copyright 2024, Colias Group, LLC +# +# SPDX-License-Identifier: BSD-2-Clause +# + +{ mk, versions }: + +mk { + package.name = "sel4-supervising-types"; + dependencies = { + inherit (versions) zerocopy; + }; +} diff --git a/crates/sel4-supervising/types/Cargo.toml b/crates/sel4-supervising/types/Cargo.toml new file mode 100644 index 000000000..fd3c546c7 --- /dev/null +++ b/crates/sel4-supervising/types/Cargo.toml @@ -0,0 +1,20 @@ +# +# Copyright 2023, Colias Group, LLC +# +# SPDX-License-Identifier: BSD-2-Clause +# +# +# This file is generated from './Cargo.nix'. You can edit this file directly +# if you are not using this project's Cargo manifest management tools. +# See 'hacking/cargo-manifest-management/README.md' for more information. +# + +[package] +name = "sel4-supervising-types" +version = "0.1.0" +authors = ["Nick Spinale "] +edition = "2021" +license = "BSD-2-Clause" + +[dependencies] +zerocopy = "0.7.32" diff --git a/crates/sel4-supervising/types/src/lib.rs b/crates/sel4-supervising/types/src/lib.rs new file mode 100644 index 000000000..75c114d8b --- /dev/null +++ b/crates/sel4-supervising/types/src/lib.rs @@ -0,0 +1,101 @@ +// +// Copyright 2024, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +#![no_std] + +use zerocopy::AsBytes; + +#[cfg(target_pointer_width = "64")] +type Word = u64; + +#[cfg(target_pointer_width = "32")] +type Word = u32; + +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug)] +pub enum MemoryAccessWidth { + U8, + U16, + U32, + #[cfg(target_pointer_width = "64")] + U64, +} + +impl MemoryAccessWidth { + pub fn mask(self) -> Word { + match self { + Self::U8 => 0xff, + Self::U16 => 0xffff, + Self::U32 => 0xffff_ffff, + #[cfg(target_pointer_width = "64")] + Self::U64 => 0xffff_ffff_ffff_ffff, + } + } + + pub fn truncate(self, val: Word) -> MemoryAccessData { + match self { + Self::U8 => MemoryAccessData::U8(val as u8), + Self::U16 => MemoryAccessData::U16(val as u16), + Self::U32 => MemoryAccessData::U32(val as u32), + #[cfg(target_pointer_width = "64")] + Self::U64 => MemoryAccessData::U64(val as u64), + } + } +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +pub enum MemoryAccessData { + U8(u8), + U16(u16), + U32(u32), + #[cfg(target_pointer_width = "64")] + U64(u64), +} + +impl MemoryAccessData { + pub fn width(&self) -> MemoryAccessWidth { + match self { + Self::U8(_) => MemoryAccessWidth::U8, + Self::U16(_) => MemoryAccessWidth::U16, + Self::U32(_) => MemoryAccessWidth::U32, + #[cfg(target_pointer_width = "64")] + Self::U64(_) => MemoryAccessWidth::U64, + } + } + + pub fn zero_extend(&self) -> Word { + match self { + Self::U8(raw) => *raw as Word, + Self::U16(raw) => *raw as Word, + Self::U32(raw) => *raw as Word, + #[cfg(target_pointer_width = "64")] + Self::U64(raw) => *raw as Word, + } + } + + pub fn bytes(&self) -> &[u8] { + match self { + Self::U8(raw) => raw.as_bytes(), + Self::U16(raw) => raw.as_bytes(), + Self::U32(raw) => raw.as_bytes(), + #[cfg(target_pointer_width = "64")] + Self::U64(raw) => raw.as_bytes(), + } + } + + pub fn bytes_mut(&mut self) -> &mut [u8] { + match self { + Self::U8(raw) => raw.as_bytes_mut(), + Self::U16(raw) => raw.as_bytes_mut(), + Self::U32(raw) => raw.as_bytes_mut(), + #[cfg(target_pointer_width = "64")] + Self::U64(raw) => raw.as_bytes_mut(), + } + } + + pub fn set(&self, old_val: Word) -> Word { + (old_val & !self.width().mask()) | self.zero_extend() + } +}