NMIハードウェアボタン用のカスタム割り込みハンドラ

NMIハードウェアボタン用のカスタム割り込みハンドラ

私のマザーボードにあるNMIハードウェアボタン用のカスタム割り込みハンドラを作成しようとしています。

この機能をテストするために、次の簡単なモジュールを作成しました。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/nmi.h>

static int nmi_custom_handler(unsigned int val, struct pt_regs* regs)
{
    pr_info("My custom NMI: 0x%x\n", val);
    return NMI_HANDLED;
}

static int __init nmi_handler_init(void) {
    pr_info("nmi_handler_init\n");
    register_nmi_handler(NMI_UNKNOWN, nmi_custom_handler, 0, "my_custom_nmi");
    return 0;
}

static void __exit nmi_handler_exit(void) {
    pr_info("nmi_handler_exit\n");
    unregister_nmi_handler(NMI_UNKNOWN, "my_custom_nmi");
}

module_init(nmi_handler_init);
module_exit(nmi_handler_exit);

MODULE_AUTHOR("Konstantin Aladyshev <[email protected]>");
MODULE_LICENSE("GPL");

このモジュールをロードしてNMIボタンを1回押すと、システムのすべてのCPUコアに「My Custom NMI」というメッセージが表示されます。 「/proc/interrupt」インターフェイスでも同じ状況を見ることができます。 NMI 割り込みカウントは CPU ごとに 0 から 1 に増加します。しかし、何らかの理由でこれは一度だけ機能します。私のモジュールまたは/ procインターフェースは、次のボタンの押下を記録しません。

なぜ? NMIハードウェア割り込みを再利用するには、何を変更する必要がありますか?

関連情報