mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-08 21:06:48 +00:00
70 lines
2.0 KiB
Rust
70 lines
2.0 KiB
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
mod null;
|
|
mod pty;
|
|
mod random;
|
|
mod shm;
|
|
pub mod tty;
|
|
mod urandom;
|
|
mod zero;
|
|
|
|
#[cfg(all(target_arch = "x86_64", feature = "cvm_guest"))]
|
|
mod tdxguest;
|
|
|
|
pub use pty::{new_pty_pair, PtyMaster, PtySlave};
|
|
pub use random::Random;
|
|
pub use urandom::Urandom;
|
|
|
|
use self::tty::get_n_tty;
|
|
use crate::{
|
|
fs::device::{add_node, Device, DeviceId, DeviceType},
|
|
prelude::*,
|
|
};
|
|
|
|
/// Init the device node in fs, must be called after mounting rootfs.
|
|
pub fn init() -> Result<()> {
|
|
let null = Arc::new(null::Null);
|
|
add_node(null, "null")?;
|
|
let zero = Arc::new(zero::Zero);
|
|
add_node(zero, "zero")?;
|
|
tty::init();
|
|
let console = get_n_tty().clone();
|
|
add_node(console, "console")?;
|
|
let tty = Arc::new(tty::TtyDevice);
|
|
add_node(tty, "tty")?;
|
|
#[cfg(target_arch = "x86_64")]
|
|
ostd::if_tdx_enabled!({
|
|
add_node(Arc::new(tdxguest::TdxGuest), "tdx_guest")?;
|
|
});
|
|
let random = Arc::new(random::Random);
|
|
add_node(random, "random")?;
|
|
let urandom = Arc::new(urandom::Urandom);
|
|
add_node(urandom, "urandom")?;
|
|
pty::init()?;
|
|
shm::init()?;
|
|
Ok(())
|
|
}
|
|
|
|
// TODO: Implement a more scalable solution for ID-to-device mapping.
|
|
// Instead of hardcoding every device numbers in this function,
|
|
// a registration mechanism should be used to allow each driver to
|
|
// allocate device IDs either statically or dynamically.
|
|
pub fn get_device(dev: usize) -> Result<Arc<dyn Device>> {
|
|
if dev == 0 {
|
|
return_errno_with_message!(Errno::EPERM, "whiteout device")
|
|
}
|
|
|
|
let devid = DeviceId::from(dev as u64);
|
|
let major = devid.major();
|
|
let minor = devid.minor();
|
|
|
|
match (major, minor) {
|
|
(1, 3) => Ok(Arc::new(null::Null)),
|
|
(1, 5) => Ok(Arc::new(zero::Zero)),
|
|
(5, 0) => Ok(Arc::new(tty::TtyDevice)),
|
|
(1, 8) => Ok(Arc::new(random::Random)),
|
|
(1, 9) => Ok(Arc::new(urandom::Urandom)),
|
|
_ => return_errno_with_message!(Errno::EINVAL, "unsupported device"),
|
|
}
|
|
}
|