VirtioRngDevice

Struct VirtioRngDevice 

Source
pub struct VirtioRngDevice {
    base_addr: usize,
    virtqueues: Mutex<[VirtQueue<'static>; 1]>,
    buffer: Mutex<VecDeque<u8>>,
    features: RwLock<u32>,
    initialized: RwLock<bool>,
}
Expand description

VirtIO RNG Device

This device provides access to a hardware random number generator through the VirtIO interface, acting as an entropy source for the kernel RNG.

Fields§

§base_addr: usize

Base memory address for MMIO access

§virtqueues: Mutex<[VirtQueue<'static>; 1]>

VirtIO queue for random number requests

§buffer: Mutex<VecDeque<u8>>

Internal buffer for random data

§features: RwLock<u32>

Negotiated features

§initialized: RwLock<bool>

Device initialization status

Implementations§

Source§

impl VirtioRngDevice

Source

pub fn new(base_addr: usize) -> Self

Create a new VirtIO RNG device

§Arguments
  • base_addr - Base memory address for the device’s MMIO region
§Returns

A new VirtioRngDevice instance

Source

fn fill_buffer(&self) -> Result<usize, &'static str>

Fill the internal buffer with random data from the device

This method requests random data from the VirtIO RNG device and stores it in the internal buffer for later reads.

§Returns

The number of bytes added to the buffer, or an error message

Source

fn read_byte_internal(&self) -> Option<u8>

Read a byte from the internal buffer, filling it if necessary

§Returns

A byte from the buffer, or None if unable to get random data

Trait Implementations§

Source§

impl EntropySource for VirtioRngDevice

Source§

fn name(&self) -> &'static str

Get a name for this entropy source
Source§

fn read_entropy(&self, buffer: &mut [u8]) -> usize

Read random bytes from this source Read more
Source§

fn is_available(&self) -> bool

Check if this source is available and ready
Source§

impl VirtioDevice for VirtioRngDevice

Source§

fn get_base_addr(&self) -> usize

Source§

fn get_virtqueue_count(&self) -> usize

Source§

fn get_virtqueue_size(&self, queue_idx: usize) -> usize

Source§

fn get_queue_desc_addr(&self, queue_idx: usize) -> Option<u64>

Get the descriptor address for a virtqueue
Source§

fn get_queue_driver_addr(&self, queue_idx: usize) -> Option<u64>

Get the driver area address for a virtqueue
Source§

fn get_queue_device_addr(&self, queue_idx: usize) -> Option<u64>

Get the device area address for a virtqueue
Source§

fn get_supported_features(&self, _device_features: u32) -> u32

Get device features supported by this driver Read more
Source§

fn debug_dump_mmio_state(&self, tag: &'static str)

Source§

fn debug_log_status_transition( &self, tag: &'static str, old: u32, new: u32, readback: u32, )

Source§

fn wait_for_status_zero( &self, tag: &'static str, max_iters: usize, ) -> Result<(), &'static str>

Source§

fn init(&mut self) -> Result<u32, &'static str>

Initialize the device Read more
Source§

fn is_modern_device(&self) -> bool

Source§

fn supports_feature(&self, feature: u32) -> bool

Source§

fn reset(&mut self) -> Result<(), &'static str>

Reset the device by writing 0 to the Status register
Source§

fn acknowledge(&mut self)

Set ACKNOWLEDGE status bit
Source§

fn driver(&mut self)

Set DRIVER status bit
Source§

fn driver_ok(&mut self)

Set DRIVER_OK status bit
Source§

fn set_failed(&mut self)

Set FAILED status bit
Source§

fn negotiate_features(&mut self) -> Result<u32, &'static str>

Negotiate device features Read more
Source§

fn allow_ring_features(&self) -> bool

Source§

fn setup_queue(&mut self, queue_idx: usize, queue_size: usize) -> bool

Set up a virtqueue Read more
Source§

fn read_config<T: Sized>(&self, offset: usize) -> T

Read device-specific configuration Read more
Source§

fn write_config<T: Sized>(&self, offset: usize, value: T)

Write device-specific configuration Read more
Source§

fn get_device_info(&self) -> (u32, u32)

Get device and vendor IDs Read more
Source§

fn get_interrupt_status(&self) -> u32

Get interrupt status Read more
Source§

fn process_interrupts(&mut self) -> u32

Process interrupts (polling method) Read more
Source§

fn memory_barrier(&self)

Memory barrier for ensuring memory operations ordering
Source§

fn notify(&self, virtqueue_idx: usize)

Notify the device about new buffers in a specified virtqueue Read more
Source§

fn read32_register(&self, register: Register) -> u32

Read a 32-bit value from a device register Read more
Source§

fn write32_register(&self, register: Register, value: u32)

Write a 32-bit value to a device register Read more
Source§

fn read64_register(&self, register: Register) -> u64

Read a 64-bit value from a device register Read more
Source§

fn write64_register(&self, register: Register, value: u64)

Write a 64-bit value to a device register Read more

Auto Trait Implementations§

§

impl !Freeze for VirtioRngDevice

§

impl !RefUnwindSafe for VirtioRngDevice

§

impl Send for VirtioRngDevice

§

impl Sync for VirtioRngDevice

§

impl Unpin for VirtioRngDevice

§

impl !UnwindSafe for VirtioRngDevice

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.