starnix_core/device/
block.rs1use crate::device::DeviceMode;
6use crate::device::kobject::DeviceMetadata;
7use crate::fs::sysfs::{BlockDeviceInfo, build_block_device_directory};
8use crate::task::{CurrentTask, Kernel};
9use crate::vfs::{FileOps, FsString, NamespaceNode};
10use starnix_logging::track_stub;
11use starnix_uapi::device_id::DeviceId;
12use starnix_uapi::errors::Errno;
13use starnix_uapi::open_flags::OpenFlags;
14use starnix_uapi::user_address::ArchSpecific;
15use starnix_uapi::{errno, uapi};
16use std::sync::Arc;
17
18pub fn canonicalize_ioctl_request(current_task: &CurrentTask, request: u32) -> u32 {
19 if current_task.is_arch32() {
20 match request {
21 uapi::arch32::BLKGETSIZE64 => uapi::BLKGETSIZE64,
22 _ => request,
23 }
24 } else {
25 request
26 }
27}
28
29pub struct MmcBlockDevice;
30
31impl BlockDeviceInfo for MmcBlockDevice {
32 fn size(&self) -> Result<usize, Errno> {
33 track_stub!(TODO("https://fxbug.dev/488067251"), "mmcblk query size");
34 Err(errno!(ENOTSUP))
35 }
36}
37
38fn open_mmc_block_device(
39 _current_task: &CurrentTask,
40 _id: DeviceId,
41 _node: &NamespaceNode,
42 _flags: OpenFlags,
43) -> Result<Box<dyn FileOps>, Errno> {
44 track_stub!(TODO("https://fxbug.dev/488067251"), "mmcblk open device");
45 Err(errno!(ENOTSUP))
46}
47
48pub fn add_mmc_block_device(kernel: &Kernel) -> Result<Arc<MmcBlockDevice>, Errno> {
51 let name = FsString::from("mmcblk0");
52 let class = kernel.device_registry.objects.block_class();
53 let device = Arc::new(MmcBlockDevice);
54 let device_weak = Arc::downgrade(&device);
55 kernel.device_registry.register_device_with_dir(
56 kernel,
57 name.as_ref(),
58 DeviceMetadata::new(name.clone(), DeviceId::MMCBLK0, DeviceMode::Block),
59 None,
60 class,
61 |device, dir| build_block_device_directory(device, device_weak, dir),
62 open_mmc_block_device,
63 )?;
64 Ok(device)
65}
66
67#[cfg(test)]
68mod tests {
69 use super::*;
70 use crate::testing::{anon_test_file, spawn_kernel_and_run};
71 use crate::vfs::VecOutputBuffer;
72 use starnix_uapi::open_flags::OpenFlags;
73
74 #[::fuchsia::test]
75 async fn test_mmc_block_device() {
76 spawn_kernel_and_run(async |current_task| {
77 let _device = add_mmc_block_device(current_task.kernel()).unwrap();
78 let root = ¤t_task.kernel().device_registry.objects.root;
79 assert!(root.lookup(b"devices/virtual/block/mmcblk0/holders".into()).is_some());
81 let size_node = root.lookup(b"devices/virtual/block/mmcblk0/size".into()).unwrap();
84 let file_ops = size_node.create_file_ops(¤t_task, OpenFlags::RDONLY).unwrap();
85 let file = anon_test_file(¤t_task, file_ops, OpenFlags::RDONLY);
86 let mut buf = VecOutputBuffer::new(10);
87 assert_eq!(file.read(¤t_task, &mut buf).unwrap_err(), errno!(ENOTSUP));
88 })
89 .await;
90 }
91}