Index: branches/azimutz/CleanCut/doc/BootHelp.txt =================================================================== --- branches/azimutz/CleanCut/doc/BootHelp.txt (revision 401) +++ branches/azimutz/CleanCut/doc/BootHelp.txt (revision 402) @@ -14,9 +14,10 @@ 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) - 32 (i386 arch) -legacy (no 64 bit apps - kernel flag) + 32 (i386 arch) -legacy (no 64 bit apps - kernel flag) 64 (x86_64 arch) "Graphics Mode"="WIDTHxHEIGHTxDEPTH" (e.g. "1024x768x32") Index: branches/azimutz/CleanCut/i386/libsaio/disk.c =================================================================== --- branches/azimutz/CleanCut/i386/libsaio/disk.c (revision 401) +++ branches/azimutz/CleanCut/i386/libsaio/disk.c (revision 402) @@ -1448,12 +1448,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: branches/azimutz/CleanCut/i386/boot2/boot.h =================================================================== --- branches/azimutz/CleanCut/i386/boot2/boot.h (revision 401) +++ branches/azimutz/CleanCut/i386/boot2/boot.h (revision 402) @@ -101,6 +101,7 @@ */ #define kVerboseModeFlag "-v" // options.c #define kSafeModeFlag "-x" // options.c +#define kIgnoreCachesFlag "-f" // options.c #define kIgnoreBootFileFlag "-F" // options.c #define kSingleUserModeFlag "-s" // options.c #define kArchI386Flag "32" // boot.c Index: branches/azimutz/CleanCut/i386/boot2/options.c =================================================================== --- branches/azimutz/CleanCut/i386/boot2/options.c (revision 401) +++ branches/azimutz/CleanCut/i386/boot2/options.c (revision 402) @@ -184,12 +184,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) @@ -436,22 +446,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; } @@ -691,12 +698,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; @@ -726,32 +735,27 @@ gBootMode |= kBootModeSafe; } + // Checking user pressed keys + bool f8press = false, spress = false, vpress = false; + 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); @@ -1330,6 +1334,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 ) )