reboot
以下は,kernel-2.6.18.1の話.
rebootシステムコール(kernel/sys.c:sys_reboot)を追ってくると,
(arch/arm/kernel/process.c) void machine_restart(char * __unused) { arm_pm_restart(reboot_mode); }
となる.これは最終的にarch_reset(reboot_mode)となるのだが,
(include/asm-arm/arch-pxa/system.h) static inline void arch_reset(char mode) { if (mode == 's') { /* Jump into ROM at address 0 */ cpu_reset(0); } else { /* Initialize the watchdog and let it fire */ OWER = OWER_WME; OSSR = OSSR_M3; OSMR3 = OSCR + 368640; /* ... in 100 ms */ } }
となっており,リブートされるのは引数が's'の時である.
static char reboot_mode = 'h'; int __init reboot_setup(char *str) { reboot_mode = str[0]; return 1; }
より,reboot_modeの初期値は'h'で,reboot_setup()にて変更が可能.
reboot_setup()は,arch/arm/kernel/setup.c:setup_arch()にて呼ばれ,
MACHINE_START〜MACHINE_ENDの間に
.soft_reboot = 1,
があった場合,reboot_setup('s')を実行する.
つまり,基板設定としてソフトウェアリブートを設定していないと,cpu_reset()が実行されない.
あー,busyboxのせいと疑ってごめんなさい,s君.
busyboxが渡すマジックナンバーは,machine_restart()を呼ぶときの分岐に使われていました.