summaryrefslogtreecommitdiff
path: root/src/non_critical/kern_panic/mod.rs
blob: 4dccc344a3b0c1d642c6819676cd50ad0f5b25f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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(())
}