pub struct Monitor {
locks: LockCollection<(&'static RwLock<ThreadMgr>, &'static RwLock<CompartmentMgr>, &'static RwLock<&'static mut Context>, &'static RwLock<HandleMgr<LibraryHandle>>, &'static RwLock<HandleMgr<CompartmentHandle>>)>,
unmapper: OnceLock<Unmapper>,
pub space: &'static Mutex<Space>,
pub thread_mgr: &'static RwLock<ThreadMgr>,
pub comp_mgr: &'static RwLock<CompartmentMgr>,
pub dynlink: &'static RwLock<&'static mut Context>,
pub library_handles: &'static RwLock<HandleMgr<LibraryHandle>>,
pub _compartment_handles: &'static RwLock<HandleMgr<CompartmentHandle>>,
}
Expand description
A security monitor instance. All monitor logic is implemented as methods for this type. We split the state into the following components: ‘space’, managing the virtual memory space and mapping objects, ‘thread_mgr’, which manages all threads owned by the monitor (typically, all threads started by compartments), ‘compartments’, which manages compartment state, and ‘dynlink’, which contains the dynamic linker state. The unmapper allows for background unmapping and cleanup of objects and handles. There are also two hangle managers, for the monitor to hand out handles to libraries and compartments to callers.
Fields§
§locks: LockCollection<(&'static RwLock<ThreadMgr>, &'static RwLock<CompartmentMgr>, &'static RwLock<&'static mut Context>, &'static RwLock<HandleMgr<LibraryHandle>>, &'static RwLock<HandleMgr<CompartmentHandle>>)>
§unmapper: OnceLock<Unmapper>
§space: &'static Mutex<Space>
Management of address space.
thread_mgr: &'static RwLock<ThreadMgr>
Management of all threads.
comp_mgr: &'static RwLock<CompartmentMgr>
Management of compartments.
dynlink: &'static RwLock<&'static mut Context>
Dynamic linker state.
library_handles: &'static RwLock<HandleMgr<LibraryHandle>>
Open handles to libraries.
_compartment_handles: &'static RwLock<HandleMgr<CompartmentHandle>>
Open handles to compartments.
Implementations§
Source§impl Monitor
impl Monitor
Sourcepub fn get_compartment_info(
&self,
instance: ObjID,
thread: ObjID,
desc: Option<Descriptor>,
) -> Result<CompartmentInfo, TwzError>
pub fn get_compartment_info( &self, instance: ObjID, thread: ObjID, desc: Option<Descriptor>, ) -> Result<CompartmentInfo, TwzError>
Get CompartmentInfo for this caller. Note that this will write to the compartment-thread’s simple buffer.
Sourcepub fn get_compartment_gate_address(
&self,
instance: ObjID,
thread: ObjID,
desc: Option<Descriptor>,
name_len: usize,
) -> Result<usize, TwzError>
pub fn get_compartment_gate_address( &self, instance: ObjID, thread: ObjID, desc: Option<Descriptor>, name_len: usize, ) -> Result<usize, TwzError>
Get CompartmentInfo for this caller. Note that this will write to the compartment-thread’s simple buffer.
Sourcepub fn get_compartment_handle(
&self,
caller: ObjID,
compartment: ObjID,
) -> Result<Descriptor, TwzError>
pub fn get_compartment_handle( &self, caller: ObjID, compartment: ObjID, ) -> Result<Descriptor, TwzError>
Open a compartment handle for this caller compartment.
Sourcepub fn lookup_compartment(
&self,
instance: ObjID,
thread: ObjID,
name_len: usize,
) -> Result<Descriptor, TwzError>
pub fn lookup_compartment( &self, instance: ObjID, thread: ObjID, name_len: usize, ) -> Result<Descriptor, TwzError>
Open a compartment handle for this caller compartment.
pub fn compartment_wait( &self, caller: ObjID, desc: Option<Descriptor>, flags: u64, ) -> u64
Sourcepub fn get_compartment_deps(
&self,
caller: ObjID,
desc: Option<Descriptor>,
dep_n: usize,
) -> Result<Descriptor, TwzError>
pub fn get_compartment_deps( &self, caller: ObjID, desc: Option<Descriptor>, dep_n: usize, ) -> Result<Descriptor, TwzError>
Open a handle to the n’th dependency compartment of a given compartment.
Sourcepub fn get_compartment_thread_info(
&self,
caller: ObjID,
desc: Option<Descriptor>,
t_n: usize,
) -> Result<ThreadInfo, TwzError>
pub fn get_compartment_thread_info( &self, caller: ObjID, desc: Option<Descriptor>, t_n: usize, ) -> Result<ThreadInfo, TwzError>
Get the n’th thread’s info from a compartment.
Sourcepub fn load_compartment(
&self,
caller: ObjID,
thread: ObjID,
name_len: usize,
args_len: usize,
env_len: usize,
new_comp_flags: NewCompartmentFlags,
) -> Result<Descriptor, TwzError>
pub fn load_compartment( &self, caller: ObjID, thread: ObjID, name_len: usize, args_len: usize, env_len: usize, new_comp_flags: NewCompartmentFlags, ) -> Result<Descriptor, TwzError>
Load a new compartment with a root library ID, and return a compartment handle.
Sourcepub fn drop_compartment_handle(&self, caller: ObjID, desc: Descriptor)
pub fn drop_compartment_handle(&self, caller: ObjID, desc: Descriptor)
Drop a compartment handle.
pub fn update_compartment_flags( &self, instance: ObjID, f: impl FnOnce(u64) -> Option<u64>, ) -> bool
pub fn load_compartment_flags(&self, instance: ObjID) -> u64
pub fn wait_for_compartment_state_change(&self, instance: ObjID, state: u64)
Source§impl Monitor
impl Monitor
Sourcepub fn get_library_info(
&self,
instance: ObjID,
thread: ObjID,
desc: Descriptor,
) -> Result<LibraryInfo, TwzError>
pub fn get_library_info( &self, instance: ObjID, thread: ObjID, desc: Descriptor, ) -> Result<LibraryInfo, TwzError>
Get LibraryInfo for a given library handle. Note that this will write to the compartment-thread’s simple buffer.
Sourcepub fn get_library_handle(
&self,
caller: ObjID,
comp: Option<Descriptor>,
num: usize,
) -> Result<Descriptor, TwzError>
pub fn get_library_handle( &self, caller: ObjID, comp: Option<Descriptor>, num: usize, ) -> Result<Descriptor, TwzError>
Open a handle to the n’th library for a compartment.
Sourcepub fn load_library(
&self,
_caller: ObjID,
_id: ObjID,
_comp: Option<Descriptor>,
) -> Result<Descriptor, TwzError>
pub fn load_library( &self, _caller: ObjID, _id: ObjID, _comp: Option<Descriptor>, ) -> Result<Descriptor, TwzError>
Load a library in the given compartment.
Sourcepub fn drop_library_handle(&self, caller: ObjID, desc: Descriptor)
pub fn drop_library_handle(&self, caller: ObjID, desc: Descriptor)
Drop a library handle.
Source§impl Monitor
impl Monitor
Sourcepub fn start_background_threads(&self)
pub fn start_background_threads(&self)
Start the background threads for the monitor instance. Must be done only once the monitor has been initialized.
Sourcepub fn new(init: InitDynlinkContext) -> Self
pub fn new(init: InitDynlinkContext) -> Self
Build a new monitor state from the initial dynamic linker context.
Sourcepub fn start_thread(
&self,
main: Box<dyn FnOnce()>,
) -> Result<Arc<ManagedThreadInner>, TwzError>
pub fn start_thread( &self, main: Box<dyn FnOnce()>, ) -> Result<Arc<ManagedThreadInner>, TwzError>
Start a managed monitor thread.
Sourcepub fn spawn_compartment_thread(
&self,
instance: ObjID,
args: ThreadSpawnArgs,
stack_ptr: usize,
thread_ptr: usize,
) -> Result<ObjID, TwzError>
pub fn spawn_compartment_thread( &self, instance: ObjID, args: ThreadSpawnArgs, stack_ptr: usize, thread_ptr: usize, ) -> Result<ObjID, TwzError>
Spawn a thread into a given compartment, using initial thread arguments.
Sourcepub fn get_comp_config(
&self,
sctx: ObjID,
) -> Result<*const SharedCompConfig, TwzError>
pub fn get_comp_config( &self, sctx: ObjID, ) -> Result<*const SharedCompConfig, TwzError>
Get the compartment config for the given compartment.
Sourcepub fn map_object(
&self,
sctx: ObjID,
info: MapInfo,
) -> Result<Arc<MapHandleInner>, TwzError>
pub fn map_object( &self, sctx: ObjID, info: MapInfo, ) -> Result<Arc<MapHandleInner>, TwzError>
Map an object into a given compartment.
Sourcepub fn map_pair(
&self,
sctx: ObjID,
info: MapInfo,
info2: MapInfo,
) -> Result<(Arc<MapHandleInner>, Arc<MapHandleInner>), TwzError>
pub fn map_pair( &self, sctx: ObjID, info: MapInfo, info2: MapInfo, ) -> Result<(Arc<MapHandleInner>, Arc<MapHandleInner>), TwzError>
Map a pair of objects into a given compartment.
Sourcepub fn unmap_object(&self, sctx: ObjID, info: MapInfo)
pub fn unmap_object(&self, sctx: ObjID, info: MapInfo)
Unmap an object from a given compartmen.
Sourcepub fn get_thread_simple_buffer(
&self,
sctx: ObjID,
thread: ObjID,
) -> Result<ObjID, TwzError>
pub fn get_thread_simple_buffer( &self, sctx: ObjID, thread: ObjID, ) -> Result<ObjID, TwzError>
Get the object ID for this compartment-thread’s simple buffer.
Sourcepub fn _write_thread_simple_buffer(
&self,
sctx: ObjID,
thread: ObjID,
bytes: &[u8],
) -> Result<usize, TwzError>
pub fn _write_thread_simple_buffer( &self, sctx: ObjID, thread: ObjID, bytes: &[u8], ) -> Result<usize, TwzError>
Write bytes to this per-compartment thread’s simple buffer.
Sourcepub fn read_thread_simple_buffer(
&self,
sctx: ObjID,
thread: ObjID,
len: usize,
) -> Result<Vec<u8>, TwzError>
pub fn read_thread_simple_buffer( &self, sctx: ObjID, thread: ObjID, len: usize, ) -> Result<Vec<u8>, TwzError>
Read bytes from this per-compartment thread’s simple buffer.
pub fn upcall_handle( &self, frame: &mut UpcallFrame, info: &UpcallData, ) -> Result<Option<ResumeFlags>, TwzError>
Sourcepub fn compartment_ctrl(
&self,
info: &GateCallInfo,
cmd: MonitorCompControlCmd,
) -> Option<i32>
pub fn compartment_ctrl( &self, info: &GateCallInfo, cmd: MonitorCompControlCmd, ) -> Option<i32>
Perform a compartment control action on the calling compartment.
pub fn set_nameroot( &self, _info: &GateCallInfo, root: ObjID, ) -> Result<(), TwzError>
Auto Trait Implementations§
impl !Crossing for Monitor
impl !Freeze for Monitor
impl !ObjSafe for Monitor
impl !RefUnwindSafe for Monitor
impl Send for Monitor
impl !StoreCopy for Monitor
impl Sync for Monitor
impl Unpin for Monitor
impl !UnwindSafe for Monitor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<D> OwoColorize for D
impl<D> OwoColorize for D
§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg
] or
a color-specific method, such as [OwoColorize::green
], Read more§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg
] or
a color-specific method, such as [OwoColorize::on_yellow
], Read more