Struct Monitor

Source
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

Source

pub(crate) fn start_compartment( &self, instance: ObjID, args: &[&CStr], env: &[&CStr], mondebug: bool, suspend_on_start: bool, ) -> Result<(), TwzError>

Source§

impl Monitor

Source

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.

Source

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.

Source

pub fn get_compartment_handle( &self, caller: ObjID, compartment: ObjID, ) -> Result<Descriptor, TwzError>

Open a compartment handle for this caller compartment.

Source

pub fn lookup_compartment( &self, instance: ObjID, thread: ObjID, name_len: usize, ) -> Result<Descriptor, TwzError>

Open a compartment handle for this caller compartment.

Source

pub fn compartment_wait( &self, caller: ObjID, desc: Option<Descriptor>, flags: u64, ) -> u64

Source

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.

Source

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.

Source

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.

Source

pub fn drop_compartment_handle(&self, caller: ObjID, desc: Descriptor)

Drop a compartment handle.

Source

pub fn update_compartment_flags( &self, instance: ObjID, f: impl FnOnce(u64) -> Option<u64>, ) -> bool

Source

pub fn load_compartment_flags(&self, instance: ObjID) -> u64

Source

pub fn wait_for_compartment_state_change(&self, instance: ObjID, state: u64)

Source§

impl Monitor

Source

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.

Source

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.

Source

pub fn load_library( &self, _caller: ObjID, _id: ObjID, _comp: Option<Descriptor>, ) -> Result<Descriptor, TwzError>

Load a library in the given compartment.

Source

pub fn drop_library_handle(&self, caller: ObjID, desc: Descriptor)

Drop a library handle.

Source§

impl Monitor

Source

pub fn stats(&self) -> MonitorStats

Source§

impl Monitor

Source

pub fn start_background_threads(&self)

Start the background threads for the monitor instance. Must be done only once the monitor has been initialized.

Source

pub fn new(init: InitDynlinkContext) -> Self

Build a new monitor state from the initial dynamic linker context.

Source

pub fn start_thread( &self, main: Box<dyn FnOnce()>, ) -> Result<Arc<ManagedThreadInner>, TwzError>

Start a managed monitor thread.

Source

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.

Source

pub fn get_comp_config( &self, sctx: ObjID, ) -> Result<*const SharedCompConfig, TwzError>

Get the compartment config for the given compartment.

Source

pub fn map_object( &self, sctx: ObjID, info: MapInfo, ) -> Result<Arc<MapHandleInner>, TwzError>

Map an object into a given compartment.

Source

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.

Source

pub fn unmap_object(&self, sctx: ObjID, info: MapInfo)

Unmap an object from a given compartmen.

Source

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.

Source

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.

Source

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.

Source

pub fn comp_name(&self, id: ObjID) -> Result<String, TwzError>

Read the name of a compartment.

Source

pub fn upcall_handle( &self, frame: &mut UpcallFrame, info: &UpcallData, ) -> Result<Option<ResumeFlags>, TwzError>

Source

pub fn compartment_ctrl( &self, info: &GateCallInfo, cmd: MonitorCompControlCmd, ) -> Option<i32>

Perform a compartment control action on the calling compartment.

Source

pub fn set_nameroot( &self, _info: &GateCallInfo, root: ObjID, ) -> Result<(), TwzError>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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

§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either [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,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either [OwoColorize::bg] or a color-specific method, such as [OwoColorize::on_yellow], Read more
§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more