OpenWrtにおける "kirkwood" targetのデバイスにおいて、Linux Kernelは再起動 (reboot) を以下の通り実行する。
表題の件に関係しない呼び出しは省く。また以下でのリンクは5.10のものを使用する
kirkwoodのデバイスではその中の
なお、本来であればkirkwoodデバイスにおいてはこのrestartで足りるはずであるものの、I-O DATA HDL-AやHDL2-Aにおいてはreset周りをR8C/25マイコンが担当しており、それに対してコマンドを送らなければ正しく再起動を行えず、停止してしまう。
ちなみに、Linux Kernel 5.14以降では上記の
- kernel/reboot.c の
kernel_restartを呼び出し(ここ) - arch/arm/kernel/reboot.c の
machine_restartを呼び出し(ここ) - 上から呼ばれた
machine_restartにおいて、ARM特有のarm_pm_restartが登録されて(nullでない)いればarm_pm_restartを呼び出し、未登録なら kernel/reboot.c のdo_kernel_restartを呼び出し(ここ)
arm_pm_restart であり、これはブート時に arch/arm/kernel/setup.c の setup_arch 内において、 mdesc->restart が登録されて(nullでない)いる場合それを arm_pm_restart に登録する(ここ)。mdesc は arch/arm/ 内に存在する各プラットフォーム(mach-*)毎またはその中での系統毎に定義されるものをDeviceTreeと一致を取るなどして取り出したものであり(ここ)、OpenWrtにおける "kirkwood" target用のものは ここ で定義されている。kirkwoodのデバイスではその中の
.restart が登録されている為にそれが arm_pm_restart にも適用されてしまい、別途登録した restart_handler が使用できなくなってしまう。なお、本来であればkirkwoodデバイスにおいてはこのrestartで足りるはずであるものの、I-O DATA HDL-AやHDL2-Aにおいてはreset周りをR8C/25マイコンが担当しており、それに対してコマンドを送らなければ正しく再起動を行えず、停止してしまう。
ちなみに、Linux Kernel 5.14以降では上記の
arm_pm_restart が削除され、各プラットフォームまたは系統毎に定義されるrestartは restart_handler の一つとして登録するよう変更されている。この為、もし別途 restart_handler を使用したい場合、ARM側のハンドラよりも高い優先度(数字を大きくする)でハンドラを登録すれば、そちらが先に使用される。