From 7de5af67e21714a8e76f4e570478011a9b21901f Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Wed, 26 Feb 2025 18:30:47 +0100 Subject: Implement basic ioctl abstractions --- src/mock.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) (limited to 'src') 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) -> Result { + 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 = unsafe { PERF_MON.write(0x0) }; +const STOP_TRACE: Ioctl = unsafe { PERF_MON.write(0x1) }; +const READ_POWER: Ioctl = 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 + } +} -- cgit v1.3.1