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側のハンドラよりも高い優先度(数字を大きくする)でハンドラを登録すれば、そちらが先に使用される。