Skip to content

Commit 5f6d33f

Browse files
committed
cmdline inode
1 parent 64469bb commit 5f6d33f

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

src/arch/arm64/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use aarch64_cpu::{
22
asm::wfi,
33
registers::{DAIF, MPIDR_EL1, ReadWriteable, Readable},
44
};
5+
use alloc::string::String;
56
use alloc::sync::Arc;
67
use cpu_ops::{local_irq_restore, local_irq_save};
78
use exceptions::ExceptionState;
@@ -140,6 +141,10 @@ impl Arch for Aarch64 {
140141
Self::halt()
141142
}
142143

144+
fn get_cmdline() -> Option<String> {
145+
fdt::get_cmdline()
146+
}
147+
143148
unsafe fn copy_from_user(
144149
src: UA,
145150
dst: *mut (),

src/arch/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::{
1616
thread_group::signal::{SigId, ksigaction::UserspaceSigAction},
1717
},
1818
};
19+
use alloc::string::String;
1920
use alloc::sync::Arc;
2021
use libkernel::{
2122
CpuOps, VirtualMemory,
@@ -54,6 +55,8 @@ pub trait Arch: CpuOps + VirtualMemory {
5455
/// Restarts the machine. Implementations must never return.
5556
fn restart() -> !;
5657

58+
fn get_cmdline() -> Option<String>;
59+
5760
/// Call a user-specified signal handler in the current process.
5861
fn do_signal(
5962
sig: SigId,

src/drivers/fs/proc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![allow(clippy::module_name_repetitions)]
22

3+
mod cmdline;
34
mod meminfo;
45
mod root;
56
mod stat;

src/drivers/fs/proc/cmdline.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use crate::arch::{Arch, ArchImpl};
2+
use alloc::boxed::Box;
3+
use alloc::vec::Vec;
4+
use async_trait::async_trait;
5+
use libkernel::fs::attr::FileAttr;
6+
use libkernel::fs::{InodeId, SimpleFile};
7+
8+
pub struct ProcCmdlineInode {
9+
id: InodeId,
10+
attr: FileAttr,
11+
}
12+
13+
impl ProcCmdlineInode {
14+
pub fn new(id: InodeId) -> Self {
15+
Self {
16+
id,
17+
attr: FileAttr {
18+
file_type: libkernel::fs::FileType::File,
19+
mode: libkernel::fs::attr::FilePermissions::from_bits_retain(0o444),
20+
..FileAttr::default()
21+
},
22+
}
23+
}
24+
}
25+
26+
#[async_trait]
27+
impl SimpleFile for ProcCmdlineInode {
28+
fn id(&self) -> InodeId {
29+
self.id
30+
}
31+
32+
async fn getattr(&self) -> libkernel::error::Result<FileAttr> {
33+
Ok(self.attr.clone())
34+
}
35+
36+
async fn read(&self) -> libkernel::error::Result<Vec<u8>> {
37+
let cmdline = ArchImpl::get_cmdline().unwrap_or_default();
38+
Ok(cmdline.into_bytes())
39+
}
40+
}

src/drivers/fs/proc/root.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::drivers::fs::proc::cmdline::ProcCmdlineInode;
12
use crate::drivers::fs::proc::get_inode_id;
23
use crate::drivers::fs::proc::meminfo::ProcMeminfoInode;
34
use crate::drivers::fs::proc::stat::ProcStatInode;
@@ -54,6 +55,10 @@ impl Inode for ProcRootInode {
5455
return Ok(Arc::new(ProcMeminfoInode::new(
5556
InodeId::from_fsid_and_inodeid(self.id.fs_id(), get_inode_id(&["meminfo"])),
5657
)));
58+
} else if name == "cmdline" {
59+
return Ok(Arc::new(ProcCmdlineInode::new(
60+
InodeId::from_fsid_and_inodeid(self.id.fs_id(), get_inode_id(&["cmdline"])),
61+
)));
5762
} else {
5863
let pid: u32 = name.parse().map_err(|_| FsError::NotFound)?;
5964
// Search for the task descriptor.
@@ -128,6 +133,12 @@ impl Inode for ProcRootInode {
128133
FileType::File,
129134
(entries.len() + 1) as u64,
130135
));
136+
entries.push(Dirent::new(
137+
"cmdline".to_string(),
138+
InodeId::from_fsid_and_inodeid(PROCFS_ID, get_inode_id(&["cmdline"])),
139+
FileType::File,
140+
(entries.len() + 1) as u64,
141+
));
131142

132143
Ok(Box::new(SimpleDirStream::new(entries, start_offset)))
133144
}

0 commit comments

Comments
 (0)