Example 4-1is the reboot program initialization source code provided in src/nucleus/bsp/powerpc/sbc8260/src/reboot/reboot.c.
#define MAX_CHUNKS 16
#define STR_LENGTH 256
PrstChunk chunks[MAX_CHUNKS];
char chunk_id_buf[STR_LENGTH];
RebootDesc rebootDesc;
BootConfRebootEntry rebootEntry;
DbgOps_reset resetOp;
BootParams bootParams;
void
reboot_main(BootConf* conf, BootParams* bootp)
{
if (conf->rebootDesc == 0) {
/*
* This is a cold reboot.
*/
/*
* Intialize printf()/scanf() support library
*/
_stdc_consInit(conf->dbgOps.consRead, conf->dbgOps.consWrite);
/*
* Register hot reboot descriptor
*/
rebootDesc.rebootOp = do_reboot;
rebootDesc.hot.prstMem.numChunks = 0;
rebootDesc.hot.prstMem.chunks = chunks;
rebootDesc.hot.prstMem.maxChunks = MAX_CHUNKS;
rebootDesc.hot.prstMem.curStrLen = 0;
rebootDesc.hot.prstMem.maxStrLen = STR_LENGTH;
rebootDesc.hot.prstMem.str = chunk_id_buf;
conf->rebootDesc = &rebootdesc;
/*
* Save hot reboot entry point
*/
rebootEntry = conf->rebootEntry;
/*
* Save reset entry point
*/
resetOp = conf->dbgOps.reset;
/*
* Save bootparams
*/
if (bootp) {
bootParams = *bootp;
}
} else {
/*
* This is a hot reboot.
*
* Nothing to do as the reboot program was intialized at the last cold
* reboot.
*/
}
}
The reboot program is installed only once during a cold boot. For subsequent hot reboots, the reboot program maintains the section of the system state that must be kept. reboot_main() is the reboot program entry point and is called by the bootstrap program each time the system boots.
For a cold boot, when the rebootDesc field of the conf argument is NULL, the reboot program intializes its static data. Whereas for a hot boot the reboot program re-intialization is empty.
One purpose of the program is to maintain a stable system state during hot reboots. This state is represented by a generic HotRebootDesc structure (see "HotRebootDesc Structure") and a board specific BootParams structure (see "Bootstrap Program Implementation").
The bootstrap program exports the address of the reboot service routine, do_reboot(), in the rebootOp field of the rebootDesc structure. The microkernel jumps to this routine to proceed with any kind of reboot. See "HotRebootDesc Structure" for details.