summaryrefslogtreecommitdiff
path: root/src/non_critical/kern_panic
diff options
context:
space:
mode:
Diffstat (limited to 'src/non_critical/kern_panic')
-rw-r--r--src/non_critical/kern_panic/mod.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/non_critical/kern_panic/mod.rs b/src/non_critical/kern_panic/mod.rs
new file mode 100644
index 0000000..4dccc34
--- /dev/null
+++ b/src/non_critical/kern_panic/mod.rs
@@ -0,0 +1,34 @@
+use std::process::Command;
+use std::path::PathBuf;
+use std::env;
+
+extern "C" {
+ pub fn linux_sysrq_start();
+ pub fn linux_sysrq_panic();
+}
+
+pub unsafe fn sysrq_panic() {
+ linux_sysrq_start();
+ linux_sysrq_panic();
+}
+
+pub fn kmod_panic() -> Result<(), String> {
+ let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap_or_else(|_| "target/debug".into()));
+ let ko_file = out_dir.join("linux_kmod.ko");
+
+ if !ko_file.exists() {
+ return Err(format!("Kernel module not found at: {}", ko_file.display()));
+ }
+
+ let status = Command::new("insmod")
+ .arg(&ko_file)
+ .status()
+ .map_err(|e| format!("Failed to execute insmod: {}", e))?;
+
+ if !status.success() {
+ return Err(format!("Failed to load kernel module: exit code {:?}", status.code()));
+ }
+
+ Ok(())
+}
+