summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-02-26 18:30:47 +0100
committerDennis Kobert <dennis@kobert.dev>2025-02-26 18:30:47 +0100
commit7de5af67e21714a8e76f4e570478011a9b21901f (patch)
tree54ed1d967533317f0657083ce052bf4dbb4afe22 /src
parent2a374e447e624e9402ea823152490d249940102e (diff)
Implement basic ioctl abstractions
Diffstat (limited to 'src')
-rw-r--r--src/mock.rs56
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
+ }
+}