我需要在處理內核中的IRQ時重新啓動。如何從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被觸發,但我有一些錯誤的時候,即使我通過/bin/rm /tmp/its-not-working
更換/sbin/reboot
。
我測試的其他辦法做到像重新啓動,我沒有IRQ範圍之外mvBoardReset()
,machine_halt()
,arm_pm_restart()
,pm_power_off()
,kill(1, SIGTSTP)
,reboot()
,handle_sysrq('b')
,我總是有誤差。
我真的想打電話/sbin/reboot
,因爲它確實乾淨軟復位。
謝謝你的時間。
我修正了它的方式:) https://github.com/moul/junk/blob/master/kernel/irq_reboot.c – moul 2012-03-16 03:04:50