Мне нужно перезагрузиться после обработки IRQ на земле ядра.
Я хочу вызвать двоичный файл /sbin/reboot
, но у меня есть ограничения из-за области IRQ.
Код следует:
#define MY_IRQ_ID 42
void __init rebootmodule_init(void) {
request_any_context_irq(MY_IRQ_ID, rebootmodule_irq_handler, IRQF_TRIGGER_FALLING, "irq-name", NULL);
}
irqreturn_t rebootmodule_irq_handler(int irq, void *dev_id) {
my_reboot();
return IRQ_HANDLED;
}
void my_reboot(void) {
int ret;
char *argv[2], *envp[4];
argv[0] = "/sbin/reboot";
argv[1] = NULL;
envp[0] = "HOME=/";
envp[1] = "PWD=/";
envp[2] = "PATH=/sbin";
envp[3] = NULL;
ret = call_usermodehelper(argv[0], argv, envp, 0);
printk(KERN_INFO "trying to reboot (ret = %d)", ret);
}
Я вижу printk(...)
при срабатывании IRQ, но у меня возникают ошибки, даже если я заменяю /sbin/reboot
на /bin/rm /tmp/its-not-working
.
Я проверял другим способомсделать перезагрузку, как mvBoardReset()
, machine_halt()
, arm_pm_restart()
, pm_power_off()
, kill(1, SIGTSTP)
, reboot()
, handle_sysrq('b')
, у меня всегда есть ошибки, которых у меня нет вне области IRQ.
Я действительно хочу позвонить /sbin/reboot
, так как он выполняет чистую программную перезагрузку.
Спасибо за ваше время.