Index: branches/azimutz/Chazi/doc-azi/CHANGES.txt =================================================================== --- branches/azimutz/Chazi/doc-azi/CHANGES.txt (revision 519) +++ branches/azimutz/Chazi/doc-azi/CHANGES.txt (revision 520) @@ -49,11 +49,9 @@ ---------------//---------------//--------------- -- (rev 335) +- (rev 335) (REVERTED to trunk way, rev 520) Change: merged the educational side of arch=i386 + the practical one of -x32, into a simple 32 booter flag. - - Type just 32 to get you booted into i386 arch. Note: -x32 was removed from trunk on rev 377. @@ -69,18 +67,16 @@ ---------------//---------------//--------------- -- (rev 335) +- (rev 335) (REMOVED, rev 520) Change: added -legacy kernel flag. This flag tells the booter to load i386 arch before is passed to the kernel. This procedure only needs to be done on Snow Leopard. -legacy tells the kernel to disable "64 Bit Mode", which allows 64 bit processors to run 64 bit apps under i386 mach kernel. - Type -legacy to get you booted into i386 arch, Legacy Mode. + Type -legacy to get you booted into Legacy Mode. Note: only useful on 64 bit processors. - Note: this flag is not really needed; typing "32 -legacy" (no "") does the trick. It's just handy! - Note: just out of curiosity and for those who don't know, Legacy Mode is in fact the mode used by 32 bit "only" processors! Since OS X kernel can handle 64 bit apps even on i386 arch, 64 bit processors need this flag to disable any handling of 64 bit instructions, when @@ -91,7 +87,7 @@ ---------------//---------------//--------------- -- (rev 335) +- (rev 335) (REVERTED to trunk way, rev 520) Change: added 64 bit booter flag, to keep company to the 32 one :) Motif: mainly to override 32 or -legacy if they are flagged on the Boot.plist. @@ -113,7 +109,7 @@ ---------------//---------------//--------------- - (revs 337 --> 360) -Changes: file loading related changes (search algo). The short story: +Changes: file loading related (search algo). The short story: Change: added a key to disable "override" Boot.plist from overriding the values on the "default" Boot.plist. Only the values overriding is disabled, not the file loading. @@ -310,6 +306,17 @@ ---------------//---------------//--------------- +- (rev 520) +Change: removed -legacy flag interaction with the booter and reverted 32/64 flags to the trunk way. + + Type arch=i386 to load i386 kernel architecture. + arch=x86_64 overrides i386 arch, if flagged on Boot.plist. + On Snow type arch=i386 -legacy to load i386 arch Legacy Mode. + +Motif: don't want to contribute to confusion. + + ---------------//---------------//--------------- + - (rev ) Change: template Index: branches/azimutz/Chazi/i386/libsaio/stringTable.c =================================================================== --- branches/azimutz/Chazi/i386/libsaio/stringTable.c (revision 519) +++ branches/azimutz/Chazi/i386/libsaio/stringTable.c (revision 520) @@ -656,7 +656,7 @@ int count, ret, fd, len = 0; // Take in account user overriding the override :P - if (getValueForKey(kTestConfigKey, &override_pathname, &len, &bootInfo->bootConfig)) + if (getValueForKey(kAltConfigKey, &override_pathname, &len, &bootInfo->bootConfig)) { // Specify a path to a file, e.g. config=/Extra/test.plist strcpy(dirSpecBplist, override_pathname); @@ -674,6 +674,11 @@ fd = open(dirSpecBplist, 0); // if (fd >= 0) goto success_fd; +// restore?? can be useful with ramdisks... +// sprintf(dirSpecBplist, "bt(0,0)/Extra/%s", filename); +// fd = open(dirSpecBplist, 0); +// if (fd >= 0) goto success_fd; + //Azi: i really don't like these two! // "/Extra/com.apple.Boot.plist" // "/Library/Preferences/SystemConfiguration/com.apple.Boot.plist" Index: branches/azimutz/Chazi/i386/boot2/boot.c =================================================================== --- branches/azimutz/Chazi/i386/boot2/boot.c (revision 519) +++ branches/azimutz/Chazi/i386/boot2/boot.c (revision 520) @@ -489,25 +489,26 @@ // Other status (e.g. 0) means that we should proceed with boot. - // If cpu doesn't handle 64 bit instructions,... - if (!platformCPUFeature(CPU_FEATURE_EM64T) || - // ... user forced i386 kernel architecture on cpu with "em64t"... - getValueForKey(kArchI386Flag, &val, &len, &bootInfo->bootConfig) || - // ... or forced Legacy Mode... - getValueForKey(kLegacyModeFlag, &val, &len, &bootInfo->bootConfig)) + // If cpu handles 64 bit instructions... + if (platformCPUFeature(CPU_FEATURE_EM64T)) { - // ... use i386 kernel arch. - archCpuType = CPU_TYPE_I386; + // use x86_64 kernel arch,... + archCpuType = CPU_TYPE_X86_64; } else { - // Else use x86_64 kernel arch. - archCpuType = CPU_TYPE_X86_64; + // else use i386 kernel arch. + archCpuType = CPU_TYPE_I386; } - // Override i386/-legacy, if flagged on Boot.plist. - if (getValueForKey(kArchX86_64Flag, &val, &len, &bootInfo->bootConfig)) + // If user override... + if (getValueForKey(kArchKey, &val, &len, &bootInfo->bootConfig)) { - archCpuType = CPU_TYPE_X86_64; + // matches i386... + if (strncmp(val, "i386", 4) == 0) + { + // use i386 kernel arch. + archCpuType = CPU_TYPE_I386; + } } if (!getBoolForKey (kWakeKey, &tryresume, &bootInfo->bootConfig)) { @@ -546,7 +547,7 @@ break; if (!forceresume && ((sleeptime+3)modTime)) { - printf ("Hibernate image is too old by %d seconds. Use ForceWake=y to override\n",bvr->modTime-sleeptime); + printf ("Hibernate image is too old by %d seconds. Use ForceWake=y to override.\n",bvr->modTime-sleeptime); break; } Index: branches/azimutz/Chazi/i386/boot2/boot.h =================================================================== --- branches/azimutz/Chazi/i386/boot2/boot.h (revision 519) +++ branches/azimutz/Chazi/i386/boot2/boot.h (revision 520) @@ -29,12 +29,12 @@ #ifndef __BOOT2_BOOT_H #define __BOOT2_BOOT_H -//Azi: keep it minimal for now. +//Azi: // Todo: don't include headers like boot.h on other headers, unless...! // move keys to the headers of the files they're in, if they have it!? // check header wrappers... -//#include "saio_internal.h" // the only one needed by boot.h it self, afaics. +//#include "saio_internal.h" // the only one needed by boot.h it self. #include "bootstruct.h" /* @@ -54,7 +54,7 @@ */ /* - * Undeclared (or undeclared here) keys. + * Undeclared (or undeclared here) */ /* "-checkers" gui.c, getValFK; @@ -62,109 +62,84 @@ "timeout" mboot.c, getValFBK "partno" mboot.c, getValFBK "DumpSPD" spd.c, getBollFK - -kNVCAP nvidia.c, getValFK - key is declared as a "variable", char kNVCAP[12], on setup_nvidia_devprop(). -Check: http://efixusers.com/showthread.php?t=644, Update Version 1.1.9 (Asere's booter). -"If you want to override the NVCAP value, you must determine the PCI DeviceID of your graphic card. -For instance: my new GTX260 has the DeviceID 0×05e2. Knowing the DeviceID add this to your com.apple.Boot.plist: -NVCAP_05e2 -0000000000000000000000000000000000000000 -The NVCAP value is exactly 20 bytes long. You have to specify it using ASCII-HEX (0-9,a-f)." - -ramdisk specific: -"Info" // ramdisk.c, getValFK -"BTAlias" // ramdisk.c, getBollFK */ /* - * Internal or "default" Boot.plist only keys (firstrun) - these end with "Key". - * - * keys that make no sense on "override" Boot.plist or at boot prompt; - * like so, they won't be present on BootHelp.txt. - * + * Keys used in system Boot.plist - these end with "Key". */ -// identifier string location -#define kTextModeKey "Text Mode" // graphics.c -#define kProductVersionKey "ProductVersion" // options.c (boot.c on trunk) -#define kDefaultPartitionKey "Default Partition" // sys.c -#define kHidePartitionKey "Hide Partition" // disk.c -#define kRenamePartitionKey "Rename Partition" // disk.c -#define kInstantMenuKey "Instant Menu" // boot.c -#define kQuietBootKey "Quiet Boot" // boot.c -#define kTimeoutKey "Timeout" // options.c -#define kThemeNameKey "Theme" // gui.c -#define kGUIKey "GUI" // boot.c -#define kBootBannerKey "Boot Banner" // options.c -#define kDebugInfoKey "DebugInfo" // gui.c, graphics.c -#define kCDROMPromptKey "CD-ROM Prompt" // options.c -#define kCDROMOptionKey "CD-ROM Option Key" // options.c -#define kRescanPromptKey "Rescan Prompt" // boot.c -#define kRescanKey "Rescan" // boot.c -#define kScanSingleDriveKey "Scan Single Drive" // boot.c -#define kDevicePropertiesKey "device-properties" // device_inject.c +// identifier string location type comment +#define kTextModeKey "Text Mode" // graphics.c getNumberArraiFP - default 80x25 - kFlag - does it work?? +//#define kProductVersionKey "ProductVersion" // options.c getValFK - (boot.c on trunk) - reverted +#define kDefaultPartitionKey "Default Partition" // sys.c getStringFK +#define kHidePartitionKey "Hide Partition" // disk.c getValFK +#define kRenamePartitionKey "Rename Partition" // disk.c getStringFK +#define kInstantMenuKey "Instant Menu" // boot.c getBoolFK +#define kQuietBootKey "Quiet Boot" // boot.c getBoolFK - kFlag +#define kTimeoutKey "Timeout" // options.c getIntFK +#define kThemeNameKey "Theme" // gui.c getValFK +#define kGUIKey "GUI" // boot.c getBoolFK +#define kBootBannerKey "Boot Banner" // options.c getBoolFK +#define kDebugInfoKey "DebugInfo" // gui.c, graphics.c getBoolFK +#define kRescanPromptKey "Rescan Prompt" // boot.c getBoolFK - cdrom only - firstrun +#define kRescanKey "Rescan" // boot.c getBoolFK - cdrom only?? - firstrun +#define kCDROMPromptKey "CD-ROM Prompt" // options.c getValFK - internal?? +#define kCDROMOptionKey "CD-ROM Option Key" // options.c getIntFK - internal?? (F8) +#define kScanSingleDriveKey "Scan Single Drive" // boot.c getBoolFK +#define kDevicePropertiesKey "device-properties" // device_inject.c getValFK - here because ?? +#define kWaitForKeypressKey "Wait" // boot.c getBoolFK +#define kAltConfigKey "config" // stringTable.c getValFK - kFlag - hum.. handle like kFlag?? +#define kCanOverrideKey "CanOverride" // stringTable.c getBoolFK +#define kRootDeviceKey "rd" // options.c processBootArg - kFlag +#define kBootDeviceKey "Boot Device" // options.c getValFK - kFlag/option?????? +#define kBootUUIDKey "boot-uuid" // options.c processBootArg - kFlag +#define kHelperRootUUIDKey "Root UUID" // options.c getValFK +#define kArchKey "arch" // boot.c getValFK - kFlag +#define kKernelNameKey "Kernel" // options.c getValFK +#define kKernelCacheKey "Kernel Cache" // boot.c getValFK - kFlag +#define kKernelFlagsKey "Kernel Flags" // options.c getValFK +#define kKPatcherKey "PatchKernel" // kernel_patcher.c getBoolFK +#define kAltExtensionsKey "kext" // drivers.c getValFK +#define kMKextCacheKey "MKext Cache" // options.c getValFK - kFlag +#define kMD0ImageKey "md0" // ramdisk.c getValFK +#define kWakeKey "Wake" // boot.c getBoolFK +#define kForceWakeKey "ForceWake" // boot.c getBoolFK +#define kWakeKeyImageKey "WakeImage" // boot.c getValFK +#define kUseAtiROMKey "UseAtiROM" // ati.c getBoolFK +#define kUseNvidiaROMKey "UseNvidiaROM" // nvidia.c getBoolFK +#define kVBIOSKey "VBIOS" // nvidia.c getBoolFK +#define kGraphicsModeKey "Graphics Mode" // graphics.c getNumberArraiFP - kFlag +#define kAutoResolutionKey "AutoResolution" // boot.c getBoolFK +#define kGraphicsEnablerKey "GraphicsEnabler" // pci_setup.c getBoolFK +#define kLegacyLogoKey "Legacy Logo" // gui.c getBoolFK +#define kDSDTKey "DSDT" // acpi_patcher.c getValFK +#define kDropSSDTKey "DropSSDT" // acpi_patcher.c getBoolFK +#define kRestartFixKey "RestartFix" // acpi_patcher.c getBoolFK +#define kGeneratePStatesKey "GeneratePStates" // acpi_patcher.c getBoolFK +#define kGenerateCStatesKey "GenerateCStates" // acpi_patcher.c getBoolFK +#define kEnableC4StatesKey "EnableC4State" // acpi_patcher.c getBoolFK +#define kUseMemDetectKey "UseMemDetect" // platform.c getBoolFK +#define kSMBIOSdefaultsKey "SMBIOSdefaults" // smbios_patcher.c getBoolFK +#define kSMBIOSKey "SMBIOS" // fake_efi.c getValFK +#define kSystemIDKey "SystemId" // fake_efi.c getStringFK - change to SystemID? +#define kSystemTypeKey "SystemType" // fake_efi.c getStringFK +#define kPCIRootUIDKey "PciRoot" // pci_root.c getValFK +#define kEthernetBuiltInKey "EthernetBuiltIn" // pci_setup.c getBoolFK +#define kForceHPETKey "ForceHPET" // pci_setup.c getBoolFK +#define kUSBBusFixKey "USBBusFix" // usb.c getBoolFK +#define kEHCIacquireKey "EHCIacquire" // usb.c getBoolFK +#define kEHCIhardKey "EHCIhard" // usb.c getBoolFK - ?? +#define kUHCIresetKey "UHCIreset" // usb.c getBoolFK +#define kLegacyOffKey "USBLegacyOff" // usb.c getBoolFK - /* - * Prompt or Boot.plist keys (secondrun) - these end with "Key". - * - * Keys that make some/all sense at boot prompt or any Boot.plist. - * - */ -#define kWaitForKeypressKey "Wait" // boot.c -#define kTestConfigKey "config" // stringTable.c -#define kCanOverrideKey "CanOverride" // stringTable.c -#define kRootDeviceKey "rd" // options.c -#define kBootDeviceKey "Boot Device" // options.c - ????? internal -#define kBootUUIDKey "boot-uuid" // options.c -#define kHelperRootUUIDKey "Root UUID" // options.c -#define kKernelNameKey "Kernel" // options.c -#define kKernelCacheKey "Kernel Cache" // boot.c -#define kKernelFlagsKey "Kernel Flags" // options.c -#define kKPatcherKey "PatchKernel" // kernel_patcher.c -#define kExtensionsKey "kext" // drivers.c -#define kMKextCacheKey "MKext Cache" // options.c -#define kMD0ImageKey "md0" // ramdisk.c -#define kWakeKey "Wake" // boot.c -#define kForceWakeKey "ForceWake" // boot.c -#define kWakeKeyImageKey "WakeImage" // boot.c -#define kUseAtiROMKey "UseAtiROM" // ati.c -#define kUseNvidiaROMKey "UseNvidiaROM" // nvidia.c -#define kVBIOSKey "VBIOS" // nvidia.c -#define kGraphicsModeKey "Graphics Mode" // graphics.c - here because of AutoResolution patch, which uses it + F2!! -#define kAutoResolutionKey "AutoResolution" // boot.c -#define kGraphicsEnablerKey "GraphicsEnabler" // pci_setup.c -#define kLegacyLogoKey "Legacy Logo" // gui.c -#define kDSDTKey "DSDT" // acpi_patcher.c -#define kDropSSDTKey "DropSSDT" // acpi_patcher.c -#define kRestartFixKey "RestartFix" // acpi_patcher.c -#define kGeneratePStatesKey "GeneratePStates" // acpi_patcher.c -#define kGenerateCStatesKey "GenerateCStates" // acpi_patcher.c -#define kEnableC4StatesKey "EnableC4State" // acpi_patcher.c -#define kUseMemDetectKey "UseMemDetect" // platform.c -#define kSMBIOSdefaultsKey "SMBIOSdefaults" // smbios_patcher.c -#define kSMBIOSKey "SMBIOS" // fake_efi.c -#define kSystemIDKey "SystemId" // fake_efi.c -#define kSystemTypeKey "SystemType" // fake_efi.c -#define kPCIRootUIDKey "PciRoot" // pci_root.c -#define kEthernetBuiltInKey "EthernetBuiltIn" // pci_setup.c -#define kForceHPETKey "ForceHPET" // pci_setup.c -#define kUSBBusFixKey "USBBusFix" // usb.c -#define kEHCIacquireKey "EHCIacquire" // usb.c -#define kEHCIhardKey "EHCIhard" // usb.c - ????? internal -#define kUHCIresetKey "UHCIreset" // usb.c -#define kLegacyOffKey "USBLegacyOff" // usb.c - -/* * Flags to the booter and/or kernel - these end with "Flag". */ -#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 kLegacyModeFlag "-legacy" // boot.c -#define kArchI386Flag "32" // boot.c - to be reverted!? -#define kArchX86_64Flag "64" // boot.c - to be reverted!? +// identifier string location type comment +#define kVerboseModeFlag "-v" // options.c getValFK - kFlag +#define kSafeModeFlag "-x" // options.c getValFBootK & getValFK - ?? - kFlag +#define kIgnoreCachesFlag "-f" // options.c getValFK - kFlag +#define kIgnoreBootFileFlag "-F" // options.c getValFBootK - kFlag +#define kSingleUserModeFlag "-s" // options.c getValFK - kFlag /* * Booter behavior control Index: branches/azimutz/Chazi/i386/boot2/drivers.c =================================================================== --- branches/azimutz/Chazi/i386/boot2/drivers.c (revision 519) +++ branches/azimutz/Chazi/i386/boot2/drivers.c (revision 520) @@ -184,7 +184,7 @@ else if ( gBootFileType == kBlockDeviceType ) { // Take in account user overriding. - if (getValueForKey(kExtensionsKey, &override_pathfolder, &len, &bootInfo->bootConfig)) + if (getValueForKey(kAltExtensionsKey, &override_pathfolder, &len, &bootInfo->bootConfig)) { // Specify a path to a folder, ending with / e.g. kext=/Extra/testkext/ strcpy(dirSpecExtra, override_pathfolder); Index: branches/azimutz/Chazi/i386/boot2/ramdisk.c =================================================================== --- branches/azimutz/Chazi/i386/boot2/ramdisk.c (revision 519) +++ branches/azimutz/Chazi/i386/boot2/ramdisk.c (revision 520) @@ -25,8 +25,7 @@ int fh = -1; int len; - if(getValueForKey(kMD0ImageKey, &override_filename, &len, - &bootInfo->bootConfig)) + if(getValueForKey(kMD0ImageKey, &override_filename, &len, &bootInfo->bootConfig)) { // Use user specified md0 file sprintf(filename, "%s", override_filename); @@ -246,9 +245,11 @@ int loadPrebootRAMDisk() { mountRAMDisk("bt(0,0)/Extra/Preboot.dmg"); + // change md0 to be handled with the menu below?? + if (gRAMDiskMI != NULL) { - printf("\n"); + printf("\n"); // damn line break :P return 0; } else Index: branches/azimutz/Chazi/i386/boot2/options.c =================================================================== --- branches/azimutz/Chazi/i386/boot2/options.c (revision 519) +++ branches/azimutz/Chazi/i386/boot2/options.c (revision 520) @@ -777,20 +777,28 @@ int cnt; int optionKey; - if (getValueForKey(kCDROMPromptKey, &val, &cnt, &bootInfo->bootConfig)) { + //Azi:--- + if (getValueForKey(kCDROMPromptKey, &val, &cnt, &bootInfo->bootConfig)) + { prompt = malloc(cnt + 1); strncat(prompt, val, cnt); - } else { + } + else + { name = malloc(80); getBootVolumeDescription(gBootVolume, name, 79, false); prompt = malloc(256); + //Azi: too long for 80X25, GUI=n, vmware, depending on the device name (more than 5 char). sprintf(prompt, "Press any key to start up from %s, or press F8 to enter startup options.", name); free(name); } - if (getIntForKey( kCDROMOptionKey, &optionKey, &bootInfo->bootConfig )) { + if (getIntForKey( kCDROMOptionKey, &optionKey, &bootInfo->bootConfig )) + { // The key specified is a special key. - } else { + } + else + { // Default to F8. optionKey = 0x4200; } @@ -968,10 +976,9 @@ { lspci(); } - else if (strcmp(booterCommand, "more") == 0) //Azi:?more + else if (strcmp(booterCommand, "more") == 0) { -// showTextFile(booterParam); - showTextFile("bt(0,0)/Extra/BootExtra.txt"); + showTextFile(booterParam); } else if (strcmp(booterCommand, "rd") == 0) { @@ -1328,60 +1335,73 @@ configKernelFlags = malloc(cnt + 1); strlcpy(configKernelFlags, val, cnt + 1); - if (processBootArgument(kBootUUIDKey, cp, configKernelFlags, bootInfo->config, &argP, &cntRemaining, 0)) { - // boot-uuid was set either on the command-line - // or in the config file. + if (processBootArgument(kBootUUIDKey, cp, configKernelFlags, bootInfo->config, &argP, &cntRemaining, 0)) + { + // boot-uuid was set either on the command-line or in the config file. uuidSet = true; - } else { - + } + else + { // // Try an alternate method for getting the root UUID on boot helper partitions. // if (gBootVolume->flags & kBVFlagBooter) { - if((loadHelperConfig(&bootInfo->helperConfig) == 0) - && getValueForKey(kHelperRootUUIDKey, &val, &cnt, &bootInfo->helperConfig) ) + if ((loadHelperConfig(&bootInfo->helperConfig) == 0) && + getValueForKey(kHelperRootUUIDKey, &val, &cnt, &bootInfo->helperConfig) ) { - getValueForKey(kHelperRootUUIDKey, &val, &cnt, &bootInfo->helperConfig); - copyArgument(kBootUUIDKey, val, cnt, &argP, &cntRemaining); - uuidSet = true; + getValueForKey(kHelperRootUUIDKey, &val, &cnt, &bootInfo->helperConfig); + copyArgument(kBootUUIDKey, val, cnt, &argP, &cntRemaining); + uuidSet = true; } } - if (!uuidSet && gBootVolume->fs_getuuid && gBootVolume->fs_getuuid (gBootVolume, uuidStr) == 0) { + if (!uuidSet && gBootVolume->fs_getuuid && gBootVolume->fs_getuuid (gBootVolume, uuidStr) == 0) + { verbose("Setting boot-uuid to: %s\n", uuidStr); copyArgument(kBootUUIDKey, uuidStr, strlen(uuidStr), &argP, &cntRemaining); uuidSet = true; } } - if (!processBootArgument(kRootDeviceKey, cp, configKernelFlags, bootInfo->config, &argP, &cntRemaining, gRootDevice)) { + if (!processBootArgument(kRootDeviceKey, cp, configKernelFlags, bootInfo->config, &argP, &cntRemaining, gRootDevice)) + { cnt = 0; - if ( getValueForKey( kBootDeviceKey, &val, &cnt, &bootInfo->bootConfig)) { + if ( getValueForKey( kBootDeviceKey, &val, &cnt, &bootInfo->bootConfig)) + { valueBuffer[0] = '*'; cnt++; strlcpy(valueBuffer + 1, val, cnt); val = valueBuffer; - } else { - if (uuidSet) { + } + else + { + if (uuidSet) + { val = "*uuid"; cnt = 5; - } else { + } + else + { // Don't set "rd=.." if there is no boot device key // and no UUID. val = ""; cnt = 0; } - } - if (cnt > 0) { + } + + if (cnt > 0) + { copyArgument( kRootDeviceKey, val, cnt, &argP, &cntRemaining); } strlcpy( gRootDevice, val, (cnt + 1)); } if (!getValueForBootKey(cp, kSafeModeFlag, &val, &cnt) && - !getValueForBootKey(configKernelFlags, kSafeModeFlag, &val, &cnt)) { - if (gBootMode & kBootModeSafe) { + !getValueForBootKey(configKernelFlags, kSafeModeFlag, &val, &cnt)) + { + if (gBootMode & kBootModeSafe) + { copyArgument(0, kSafeModeFlag, strlen(kSafeModeFlag), &argP, &cntRemaining); } } @@ -1448,7 +1468,7 @@ if (valid) { - if (getValueForKey(kProductVersionKey, &val, &len, &systemVersion)) + if (getValueForKey("ProductVersion", &val, &len, &systemVersion)) { // getValueForKey uses const char for val // so copy it and trim