/****************************************************************************** * * Filename: env_vars.c * * Instantiation of environment variables, structures, and other globals. * * Revision information: * * 20AUG2004 kb_admin initial creation * * BEGIN_KBDD_BLOCK * No warranty, expressed or implied, is included with this software. It is * provided "AS IS" and no warranty of any kind including statutory or aspects * relating to merchantability or fitness for any purpose is provided. All * intellectual property rights of others is maintained with the respective * owners. This software is not copyrighted and is intended for reference * only. * END_BLOCK * * $FreeBSD$ *****************************************************************************/ #include "env_vars.h" #include "loader_prompt.h" #include "lib.h" /******************************* GLOBALS *************************************/ char boot_commands[MAX_BOOT_COMMANDS][MAX_INPUT_SIZE]; char env_table[MAX_ENV_SIZE_BYTES]; extern char BootCommandSection; /************************** PRIVATE FUNCTIONS ********************************/ static int currentIndex; static int currentOffset; /* * .KB_C_FN_DEFINITION_START * int ReadCharFromEnvironment(char *) * This private function reads characters from the enviroment variables * to service the command prompt during auto-boot or just to setup the * default environment. Returns positive value if valid character was * set in the pointer. Returns negative value to signal input stream * terminated. Returns 0 to indicate _wait_ condition. * .KB_C_FN_DEFINITION_END */ static int ReadCharFromEnvironment(int timeout) { int ch; if (currentIndex < MAX_BOOT_COMMANDS) { ch = boot_commands[currentIndex][currentOffset++]; if (ch == '\0' || (currentOffset >= MAX_INPUT_SIZE)) { currentOffset = 0; ++currentIndex; ch = '\r'; } return (ch); } return (-1); } /*************************** GLOBAL FUNCTIONS ********************************/ /* * .KB_C_FN_DEFINITION_START * void WriteCommandTable(void) * This global function write the current command table to the non-volatile * memory. * .KB_C_FN_DEFINITION_END */ void WriteCommandTable(void) { int i, size = MAX_ENV_SIZE_BYTES, copySize; char *cPtr = env_table; p_memset(env_table, 0, sizeof(env_table)); for (i = 0; i < MAX_BOOT_COMMANDS; ++i) { copySize = p_strlen(boot_commands[i]); size -= copySize + 1; if (size < 0) { continue; } memcpy(cPtr, boot_commands[i], copySize); cPtr += copySize; *cPtr++ = 0; } /* We're executing in low RAM so addr in ram == offset in eeprom */ WriteEEPROM((unsigned)&BootCommandSection, env_table, sizeof(env_table)); } /* * .KB_C_FN_DEFINITION_START * void SetBootCommand(int index, char *command) * This global function replaces the specified index with the string residing * at command. Execute this function with a NULL string to clear the * associated command index. * .KB_C_FN_DEFINITION_END */ void SetBootCommand(int index, char *command) { int i; if ((unsigned)index < MAX_BOOT_COMMANDS) { p_memset(boot_commands[index], 0, MAX_INPUT_SIZE); if (!command) return ; for (i = 0; i < MAX_INPUT_SIZE; ++i) { boot_commands[index][i] = command[i]; if (!(boot_commands[index][i])) return; } } } /* * .KB_C_FN_DEFINITION_START * void DumpBootCommands(void) * This global function displays the current boot commands. * .KB_C_FN_DEFINITION_END */ void DumpBootCommands(void) { int i, j; for (i = 0; i < MAX_BOOT_COMMANDS; ++i) { printf("0x%x : ", i); for (j = 0; j < MAX_INPUT_SIZE; ++j) { putchar(boot_commands[i][j]); if (!(boot_commands[i][j])) break; } printf("[E]\n\r"); } } /* * .KB_C_FN_DEFINITION_START * void LoadBootCommands(void) * This global function loads the existing boot commands from raw format and * coverts it to the standard, command-index format. Notice, the processed * boot command table has much more space allocated than the actual table * stored in non-volatile memory. This is because the processed table * exists in RAM which is larger than the non-volatile space. * .KB_C_FN_DEFINITION_END */ void LoadBootCommands(void) { int index, j, size; char *cPtr; p_memset((char*)boot_commands, 0, sizeof(boot_commands)); cPtr = &BootCommandSection; size = MAX_ENV_SIZE_BYTES; for (index = 0; (index < MAX_BOOT_COMMANDS) && size; ++index) { for (j = 0; (j < MAX_INPUT_SIZE) && size; ++j) { size--; boot_commands[index][j] = *cPtr++; if (!(boot_commands[index][j])) { break; } } } } /* * .KB_C_FN_DEFINITION_START * void ExecuteEnvironmentFunctions(void) * This global function executes applicable entries in the environment. * .KB_C_FN_DEFINITION_END */ void ExecuteEnvironmentFunctions(void) { currentIndex = 0; currentOffset = 0; DumpBootCommands(); Bootloader(ReadCharFromEnvironment); }