Skip to content

Commit 4f9b231

Browse files
RoyLinRoyLin
authored andcommitted
feat: add support for 9pfs disk images and various improvements
- Add linux_errno module for errno handling - Enhance vsock device implementation - Add pollable_channel and signal utilities - Add sized_vec and worker_message utilities - Add syscall abstraction layer - Add shm device manager support - Add block, fs, net, kernel config modules - Add firmware and instance_info support - Add kernel_bundle and kernel_cmdline modules
1 parent 963353a commit 4f9b231

19 files changed

Lines changed: 1805 additions & 0 deletions

File tree

src/arch/src/lib.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,92 @@ pub struct InitrdConfig {
6767

6868
/// Default (smallest) memory page size for the supported architectures.
6969
pub const PAGE_SIZE: usize = 4096;
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
75+
#[test]
76+
fn test_arch_memory_info_default() {
77+
let info = ArchMemoryInfo::default();
78+
assert_eq!(info.ram_last_addr, 0);
79+
assert_eq!(info.shm_start_addr, 0);
80+
assert_eq!(info.page_size, 0);
81+
assert_eq!(info.initrd_addr, 0);
82+
assert_eq!(info.firmware_addr, 0);
83+
}
84+
85+
#[cfg(target_arch = "x86_64")]
86+
#[test]
87+
fn test_arch_memory_info_x86_64() {
88+
let mut info = ArchMemoryInfo::default();
89+
info.ram_below_gap = 0x1000;
90+
info.ram_above_gap = 0x2000;
91+
info.ram_last_addr = 0xFFFF_FFFF;
92+
info.shm_start_addr = 0x1_0000_0000;
93+
info.page_size = 4096;
94+
info.initrd_addr = 0x2000_0000;
95+
info.firmware_addr = 0xFFFC_0000;
96+
97+
assert_eq!(info.ram_below_gap, 0x1000);
98+
assert_eq!(info.ram_above_gap, 0x2000);
99+
}
100+
101+
#[cfg(target_arch = "aarch64")]
102+
#[test]
103+
fn test_arch_memory_info_aarch64() {
104+
let mut info = ArchMemoryInfo::default();
105+
info.ram_start_addr = 0x4000_0000;
106+
info.ram_last_addr = 0x7F_FFFF_FFFF;
107+
info.shm_start_addr = 0x1_0000_0000;
108+
info.page_size = 4096;
109+
info.fdt_addr = 0x4000_0000;
110+
info.initrd_addr = 0x4_0000_0000;
111+
info.firmware_addr = 0x0;
112+
113+
assert_eq!(info.ram_start_addr, 0x4000_0000);
114+
assert_eq!(info.fdt_addr, 0x4000_0000);
115+
}
116+
117+
#[test]
118+
fn test_initrd_config() {
119+
use vm_memory::GuestAddress;
120+
121+
let initrd = InitrdConfig {
122+
address: GuestAddress(0x2000_0000),
123+
size: 0x5000,
124+
};
125+
126+
assert_eq!(initrd.address, GuestAddress(0x2000_0000));
127+
assert_eq!(initrd.size, 0x5000);
128+
}
129+
130+
#[test]
131+
fn test_initrd_config_default() {
132+
let initrd = InitrdConfig {
133+
address: vm_memory::GuestAddress(0),
134+
size: 0,
135+
};
136+
137+
assert_eq!(initrd.address, vm_memory::GuestAddress(0));
138+
assert_eq!(initrd.size, 0);
139+
}
140+
141+
#[test]
142+
fn test_page_size_constant() {
143+
assert_eq!(PAGE_SIZE, 4096);
144+
}
145+
146+
#[test]
147+
fn test_arch_memory_info_clone() {
148+
let mut info = ArchMemoryInfo::default();
149+
info.ram_last_addr = 0xFFFF_FFFF;
150+
info.shm_start_addr = 0x1_0000_0000;
151+
info.page_size = 4096;
152+
153+
let cloned = info.clone();
154+
assert_eq!(info.ram_last_addr, cloned.ram_last_addr);
155+
assert_eq!(info.shm_start_addr, cloned.shm_start_addr);
156+
assert_eq!(info.page_size, cloned.page_size);
157+
}
158+
}

src/devices/src/lib.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,101 @@ impl fmt::Display for DeviceType {
5656
write!(f, "{self:?}")
5757
}
5858
}
59+
60+
#[cfg(test)]
61+
mod tests {
62+
use super::*;
63+
64+
#[test]
65+
fn test_device_type_virtio() {
66+
let device = DeviceType::Virtio(1);
67+
assert_eq!(format!("{:?}", device), "Virtio(1)");
68+
assert_eq!(format!("{}", device), "Virtio(1)");
69+
}
70+
71+
#[cfg(target_arch = "aarch64")]
72+
#[test]
73+
fn test_device_type_gpio() {
74+
let device = DeviceType::Gpio;
75+
assert_eq!(format!("{:?}", device), "Gpio");
76+
}
77+
78+
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
79+
#[test]
80+
fn test_device_type_serial() {
81+
let device = DeviceType::Serial;
82+
assert_eq!(format!("{:?}", device), "Serial");
83+
}
84+
85+
#[cfg(target_arch = "aarch64")]
86+
#[test]
87+
fn test_device_type_rtc() {
88+
let device = DeviceType::RTC;
89+
assert_eq!(format!("{:?}", device), "RTC");
90+
}
91+
92+
#[test]
93+
fn test_device_type_clone() {
94+
let device = DeviceType::Virtio(42);
95+
let cloned = device.clone();
96+
assert_eq!(device, cloned);
97+
}
98+
99+
#[test]
100+
fn test_device_type_eq() {
101+
let device1 = DeviceType::Virtio(1);
102+
let device2 = DeviceType::Virtio(1);
103+
let device3 = DeviceType::Virtio(2);
104+
assert_eq!(device1, device2);
105+
assert_ne!(device1, device3);
106+
}
107+
108+
#[test]
109+
fn test_error_debug() {
110+
let io_error = std::io::Error::new(std::io::ErrorKind::Other, "test");
111+
let error = Error::FailedReadingQueue {
112+
event_type: "RX",
113+
underlying: io_error,
114+
};
115+
assert_eq!(format!("{:?}", error), "FailedReadingQueue { event_type: \"RX\", underlying: Custom { kind: Other, error: \"\" } }");
116+
}
117+
118+
#[test]
119+
fn test_error_display() {
120+
let io_error = std::io::Error::new(std::io::ErrorKind::Other, "test error");
121+
let error = Error::IoError(io_error);
122+
assert!(format!("{}", error).contains("test error"));
123+
}
124+
125+
#[test]
126+
fn test_error_failed_read_tap() {
127+
let error = Error::FailedReadTap;
128+
assert_eq!(format!("{:?}", error), "FailedReadTap");
129+
}
130+
131+
#[test]
132+
fn test_error_no_avail_buffers() {
133+
let error = Error::NoAvailBuffers;
134+
assert_eq!(format!("{:?}", error), "NoAvailBuffers");
135+
}
136+
137+
#[test]
138+
fn test_error_spurious_event() {
139+
let error = Error::SpuriousEvent;
140+
assert_eq!(format!("{:?}", error), "SpuriousEvent");
141+
}
142+
143+
#[test]
144+
fn test_error_payload_expected() {
145+
let error = Error::PayloadExpected;
146+
assert_eq!(format!("{:?}", error), "PayloadExpected");
147+
}
148+
149+
#[test]
150+
fn test_error_failed_signaling_used_queue() {
151+
let io_error = std::io::Error::new(std::io::ErrorKind::Other, "signal error");
152+
let error = Error::FailedSignalingUsedQueue(io_error);
153+
let display = format!("{}", error);
154+
assert!(display.contains("FailedSignalingUsedQueue"));
155+
}
156+
}

0 commit comments

Comments
 (0)