lx/syscalls/
reboot.rs

1use core::ptr;
2
3use super::abi::*;
4use crate::{
5    result_from_value,
6    Error,
7};
8
9const LINUX_REBOOT_MAGIC1: u32 = 0xfee1dead;
10const LINUX_REBOOT_MAGIC2: u32 = 672274793;
11
12pub const RB_POWER_OFF: u32 = 0x4321FEDC;
13
14#[inline]
15#[allow(clippy::missing_safety_doc)]
16pub unsafe fn reboot(cmd: u32, arg: *mut u8) -> crate::Result<i32> {
17    let ret = syscall_4(
18        169,
19        LINUX_REBOOT_MAGIC1 as usize,
20        LINUX_REBOOT_MAGIC2 as usize,
21        cmd as usize,
22        arg as usize,
23    ) as i32;
24    result_from_value(ret)
25}
26
27/// Powers off the machine.
28///
29/// This function returns an `Error` instead of a `crate::Result<()>` because it can only return on
30/// failure.
31#[inline]
32pub fn reboot_power_off() -> Error {
33    match unsafe { reboot(RB_POWER_OFF, ptr::null_mut()) } {
34        Ok(ret) => unreachable!("reboot() returned {ret}"),
35        Err(err) => err,
36    }
37}