diff --git a/Cargo.lock b/Cargo.lock index 934d65f6518857ccd492f4625f4b10008cb9efd0..407c0ebf893705ff98422bfe63aef1b3d5061a1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -898,15 +898,15 @@ dependencies = [ [[package]] name = "ioctl-sys" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9d0b6b23885487578d10590edc36fd95426257c7017973b20633e34df23b08" +checksum = "8bd11f3a29434026f5ff98c730b668ba74b1033637b8817940b54d040696133c" [[package]] name = "ioctls" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5780ca662f733ea1b940647b657d5324abc55a7d8d9b0628e8af8fe96ab3ed2" +checksum = "935b1b0e0f1c6f47c4cffbc08782bd8875d4d475f78191eb1a0c3bcf60de71e8" dependencies = [ "ioctl-sys", "libc", diff --git a/exts/devmaster/Cargo.toml b/exts/devmaster/Cargo.toml index f1bfc619a97f9e581386f473f0322f2b5543f0e1..81d0a61cd216ecb4b2c4f4de5fcf8c9624ca9f07 100644 --- a/exts/devmaster/Cargo.toml +++ b/exts/devmaster/Cargo.toml @@ -53,8 +53,8 @@ cluFlock = { version = "1.2.7", default-features = false } confique = { version = "0.1.3", default-features = false, features = ['toml'] } futures = { version = "0.3.13", default-features = false } input-event-codes = "5.16.8" -ioctl-sys = "0.7.1" -ioctls = "0.6.1" +ioctl-sys = "0.8.0" +ioctls = "0.6.2" lazy_static = "1.4.0" libc = { version = "0.2.*", default-features = false } nix = { version = "0.24", default-features = false, features = [ diff --git a/exts/switch_root/src/switch_root.rs b/exts/switch_root/src/switch_root.rs index 86ba630ccc429642603acde517b872b5bc242b46..c3e1ec8d48ef4099c99cb335f80c9f862bb2a2ce 100644 --- a/exts/switch_root/src/switch_root.rs +++ b/exts/switch_root/src/switch_root.rs @@ -163,6 +163,14 @@ macro_rules! LIB_ARCH_TUPLE { "ld-linux-aarch64.so.1", false, ) + } else if cfg!(target_arch = "riscv64") { + BaseFilesystem::new( + "lib64", + MODE777, + vec!["usr/sbin/riscv64-linux-gnu", "usr/lib64/lp64d"], + "ld-linux-riscv64-lp64d.so.1", + false, + ) } else { BaseFilesystem::new( "lib64", diff --git a/libs/basic/src/machine.rs b/libs/basic/src/machine.rs index c8b5f1ca6fbce8b356488c0f14d7c200e5522077..33e0699bb3c2d45db199638e1806c6e38b5abb5e 100644 --- a/libs/basic/src/machine.rs +++ b/libs/basic/src/machine.rs @@ -155,6 +155,11 @@ impl Machine { #[cfg(target_arch = "aarch64")] unsafe_set_and_return!(CACHED_FOUND, vm); + #[cfg(target_arch = "riscv64")] + let vm = Machine::detect_vm_device_tree(); + #[cfg(target_arch = "riscv64")] + unsafe_set_and_return!(CACHED_FOUND, vm); + unsafe { CACHED_FOUND } } @@ -228,6 +233,19 @@ impl Machine { Machine::None } + #[cfg(target_arch = "riscv64")] + /// detect vm by device tree + pub fn detect_vm_device_tree() -> Self { + if let Ok(dir) = std::fs::read_dir("/proc/device-tree") { + for entry in dir.flatten() { + if entry.path().to_string_lossy().contains("fw-cfg") { + return Machine::Qemu; + } + } + } + Machine::None + } + /// detect vm for uml pub fn detect_vm_uml() -> Self { let cpuinfo_path = PathBuf::from("/proc/cpuinfo"); diff --git a/libs/basic/src/uuid.rs b/libs/basic/src/uuid.rs index 45ce8fef41b74bbfb65898bf9fc46d37176be032..836e26ea3c22d9e6d322a48d31311277b86677ba 100644 --- a/libs/basic/src/uuid.rs +++ b/libs/basic/src/uuid.rs @@ -44,6 +44,11 @@ pub const GPT_ROOT_NATIVE: Uuid = Uuid([ pub const GPT_ROOT_NATIVE: Uuid = Uuid([ 0x69, 0xda, 0xd7, 0x10, 0x2c, 0xe4, 0x4e, 0x3c, 0xb1, 0x6c, 0x21, 0xa1, 0xd4, 0x9a, 0xbe, 0xd3, ]); +#[cfg(target_arch = "riscv64")] +/// GPT_ROOT_NATIVE UUID type +pub const GPT_ROOT_NATIVE: Uuid = Uuid([ + 0x72, 0xec, 0x70, 0xa6, 0xcf, 0x74, 0x40, 0xe6, 0xbd, 0x49, 0x4b, 0xda, 0x08, 0xe8, 0xf2, 0x24, +]); /// uuid #[derive(PartialEq, Eq, Debug, Clone, Hash)] diff --git a/libs/device/src/device.rs b/libs/device/src/device.rs index b3f6cd21128a023ca273b715a60467240fe40cb3..0cd2d0b5b28d4e21f3abe454a0f38ab1f4a5736b 100644 --- a/libs/device/src/device.rs +++ b/libs/device/src/device.rs @@ -1827,7 +1827,18 @@ impl Device { /// set the sysname and sysnum of device object pub fn set_sysname_and_sysnum(&self) -> Result<(), Error> { /* The devpath is validated to begin with '/' when setting syspath. */ - let idx = self.devpath.borrow().rfind('/').unwrap(); + let idx = match self.devpath.borrow().rfind('/') { + Some(idx) => idx, + None => { + return Err(Error::Nix { + msg: format!( + "set_sysname_and_sysnum failed: devpath '{}' is not a valid device path", + self.devpath.borrow() + ), + source: Errno::ENODEV, + }); + } + }; let sysname = String::from(&self.devpath.borrow()[idx + 1..]); let sysname = sysname.replace('!', "/");