diff options
| author | Dennis Kobert <dennis@kobert.dev> | 2025-02-26 18:30:47 +0100 |
|---|---|---|
| committer | Dennis Kobert <dennis@kobert.dev> | 2025-02-26 18:30:47 +0100 |
| commit | 7de5af67e21714a8e76f4e570478011a9b21901f (patch) | |
| tree | 54ed1d967533317f0657083ce052bf4dbb4afe22 /src | |
| parent | 2a374e447e624e9402ea823152490d249940102e (diff) | |
Implement basic ioctl abstractions
Diffstat (limited to 'src')
| -rw-r--r-- | src/mock.rs | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/src/mock.rs b/src/mock.rs index ac4fa75..4ee9ed4 100644 --- a/src/mock.rs +++ b/src/mock.rs @@ -1,20 +1,64 @@ +use iocuddle::*; use libc::rand; use rand::Rng; trait KernelModule { - fn start_trace(pid: u64) {} - fn stop_trace(pid: u64) {} - fn read_consumption(pid: u64) -> u64 {} + fn start_trace(&mut self, _pid: u64) {} + fn stop_trace(&mut self, _pid: u64) {} + fn read_consumption(&mut self, pid: u64) -> u64; } struct MockModule; impl KernelModule for MockModule { - fn start_trace(pid: u64) {} + fn start_trace(&mut self, pid: u64) { + println!("starting trace of {pid}"); + } - fn stop_trace(pid: u64) {} + fn stop_trace(&mut self, pid: u64) { + println!("stopping trace of {pid}"); + } - fn read_consumption(pid: u64) -> u64 { + fn read_consumption(&mut self, _pid: u64) -> u64 { rand::rng().random() } } + +#[derive(Debug)] +struct KernelDriver { + file: std::fs::File, +} + +impl Default for KernelDriver { + fn default() -> Self { + KernelDriver::new("/dev/rust").unwrap() + } +} +impl KernelDriver { + fn new(path: impl AsRef<std::path::Path>) -> Result<Self, std::io::Error> { + let file = std::fs::File::open(path)?; + Ok(Self { file }) + } +} + +const PERF_MON: Group = Group::new(b'|'); +const PREFIX: u8 = b'|'; +const START_TRACE: Ioctl<Write, &u64> = unsafe { PERF_MON.write(0x0) }; +const STOP_TRACE: Ioctl<Write, &u64> = unsafe { PERF_MON.write(0x1) }; +const READ_POWER: Ioctl<WriteRead, &u64> = unsafe { PERF_MON.write_read(0x2) }; + +impl KernelModule for KernelDriver { + fn start_trace(&mut self, pid: u64) { + START_TRACE.ioctl(&mut self.file, &pid).unwrap(); + } + + fn stop_trace(&mut self, pid: u64) { + STOP_TRACE.ioctl(&mut self.file, &pid).unwrap(); + } + + fn read_consumption(&mut self, pid: u64) -> u64 { + let mut arg = pid; + READ_POWER.ioctl(&mut self.file, &mut arg).unwrap(); + arg + } +} |
