Index: trunk/doc/BootHelp.txt =================================================================== --- trunk/doc/BootHelp.txt (revision 393) +++ trunk/doc/BootHelp.txt (revision 394) @@ -14,7 +14,8 @@ kernel: kernel name (e.g. "mach_kernel" - must be in "/" ) - flags: -v (verbose) -s (single user mode) -x (safe mode) + flags: -v (verbose) -s (single user mode) + -x (safe mode) -f (ignore caches) -F (ignore "Kernel Flags" specified in boot configuration file) "Graphics Mode"="WIDTHxHEIGHTxDEPTH" (e.g. "1024x768x32") Index: trunk/i386/libsaio/disk.c =================================================================== --- trunk/i386/libsaio/disk.c (revision 393) +++ trunk/i386/libsaio/disk.c (revision 394) @@ -1444,12 +1444,11 @@ void rescanBIOSDevice(int biosdev) { - struct DiskBVMap *oldMap = diskResetBootVolumes(biosdev); - CacheReset(); - diskFreeMap(oldMap); - oldMap = NULL; - - scanBootVolumes(biosdev, 0); + struct DiskBVMap *oldMap = diskResetBootVolumes(biosdev); + CacheReset(); + diskFreeMap(oldMap); + oldMap = NULL; + scanBootVolumes(biosdev, 0); } struct DiskBVMap* diskResetBootVolumes(int biosdev) Index: trunk/i386/boot2/boot.h =================================================================== --- trunk/i386/boot2/boot.h (revision 393) +++ trunk/i386/boot2/boot.h (revision 394) @@ -99,6 +99,7 @@ */ #define kVerboseModeFlag "-v" #define kSafeModeFlag "-x" +#define kIgnoreCachesFlag "-f" #define kIgnoreBootFileFlag "-F" #define kSingleUserModeFlag "-s" Index: trunk/i386/boot2/options.c =================================================================== --- trunk/i386/boot2/options.c (revision 393) +++ trunk/i386/boot2/options.c (revision 394) @@ -182,12 +182,22 @@ { gBootArgsPtr = gBootArgs; memset(gBootArgs, '\0', BOOT_STRING_LEN); - + if (bootArgs->Video.v_display == GRAPHICS_MODE) { clearGraphicBootPrompt(); } } +static void addBootArg(const char * argStr) +{ + if ( (gBootArgsPtr + strlen(argStr) + 1) < gBootArgsEnd) + { + *gBootArgsPtr++ = ' '; + strcat(gBootArgs, argStr); + gBootArgsPtr += strlen(argStr); + } +} + //========================================================================== static void showBootPrompt(int row, bool visible) @@ -434,22 +444,19 @@ case BOOT_VERBOSE: gVerboseMode = true; gBootMode = kBootModeNormal; - *gBootArgsPtr++ = '-'; - *gBootArgsPtr++ = 'v'; + addBootArg(kVerboseModeFlag); break; case BOOT_IGNORECACHE: gVerboseMode = false; gBootMode = kBootModeNormal; - *gBootArgsPtr++ = '-'; - *gBootArgsPtr++ = 'x'; + addBootArg(kIgnoreCachesFlag); break; case BOOT_SINGLEUSER: gVerboseMode = true; gBootMode = kBootModeNormal; - *gBootArgsPtr++ = '-'; - *gBootArgsPtr++ = 's'; + addBootArg(kSingleUserModeFlag); break; } @@ -689,12 +696,14 @@ } // ensure we're in graphics mode if gui is setup - if (gui.initialised) { - if (bootArgs->Video.v_display == VGA_TEXT_MODE) { - setVideoMode(GRAPHICS_MODE, 0); - } + if (gui.initialised && bootArgs->Video.v_display == VGA_TEXT_MODE) + { + setVideoMode(GRAPHICS_MODE, 0); } + // Clear command line boot arguments + clearBootArgs(); + // Allow user to override default timeout. if (multiboot_timeout_set) { timeout = multiboot_timeout; @@ -724,32 +733,28 @@ gBootMode |= kBootModeSafe; } + // Checking user pressed keys + bool f8press = false, spress = false, vpress = false; + int key; + while (readKeyboardStatus()) { + key = bgetc (); + if (key == 0x4200) f8press = true; + if ((key & 0xff) == 's' || (key & 0xff) == 'S') spress = true; + if ((key & 0xff) == 'v' || (key & 0xff) == 'V') vpress = true; + } // If user typed F8, abort quiet mode, and display the menu. - { - bool f8press = false, spress = false, vpress = false; - int key; - while (readKeyboardStatus()) { - key = bgetc (); - if (key == 0x4200) f8press = true; - if ((key & 0xff) == 's' || (key & 0xff) == 'S') spress = true; - if ((key & 0xff) == 'v' || (key & 0xff) == 'V') vpress = true; - } - if (f8press) { - gBootMode &= ~kBootModeQuiet; - timeout = 0; - } - if ((gBootMode & kBootModeQuiet) && firstRun && vpress && (gBootArgsPtr + 3 < gBootArgsEnd)) { - *(gBootArgsPtr++) = ' '; - *(gBootArgsPtr++) = '-'; - *(gBootArgsPtr++) = 'v'; - } - if ((gBootMode & kBootModeQuiet) && firstRun && spress && (gBootArgsPtr + 3 < gBootArgsEnd)) { - *(gBootArgsPtr++) = ' '; - *(gBootArgsPtr++) = '-'; - *(gBootArgsPtr++) = 's'; - } + if (f8press) { + gBootMode &= ~kBootModeQuiet; + timeout = 0; } - clearBootArgs(); + // If user typed 'v' or 'V', boot in verbose mode. + if ((gBootMode & kBootModeQuiet) && firstRun && vpress) { + addBootArg(kVerboseModeFlag); + } + // If user typed 's' or 'S', boot in single user mode. + if ((gBootMode & kBootModeQuiet) && firstRun && spress) { + addBootArg(kSingleUserModeFlag); + } if (bootArgs->Video.v_display == VGA_TEXT_MODE) { setCursorPosition(0, 0, 0); @@ -1312,6 +1317,10 @@ gBootMode = ( getValueForKey( kSafeModeFlag, &val, &cnt, &bootInfo->bootConfig ) ) ? kBootModeSafe : kBootModeNormal; + + if ( getValueForKey( kIgnoreCachesFlag, &val, &cnt, &bootInfo->bootConfig ) ) { + gBootMode = kBootModeSafe; + } } if ( getValueForKey( kMKextCacheKey, &val, &cnt, &bootInfo->bootConfig ) )