␉finalizeBootStruct();␊ |
␊ |
␉// Jump to kernel's entry point. There's no going back now.␊ |
␉if (MacOSVerCurrent >= MacOSVer2Int("10.7"))␊ |
␉if ( TIGER || LEOPARD || SNOW_LEOPARD )␊ |
␉{␊ |
␉␉// Notify modules that the kernel is about to be started␊ |
␉␉execute_hook("Kernel Start", (void *)kernelEntry, (void *)bootArgsPreLion, NULL, NULL);␊ |
␊ |
␉␉startprog( kernelEntry, bootArgsPreLion );␊ |
␉}␊ |
␉else␊ |
␉{␊ |
␉␉// Notify modules that the kernel is about to be started␊ |
␉␉execute_hook("Kernel Start", (void *)kernelEntry, (void *)bootArgs, NULL, NULL);␊ |
␊ |
␉␉// Masking out so that Lion doesn't doublefault␊ |
|
␊ |
␉␉startprog( kernelEntry, bootArgs );␊ |
␉}␊ |
␉else␊ |
␉{␊ |
␉␉// Notify modules that the kernel is about to be started␊ |
␉␉execute_hook("Kernel Start", (void*)kernelEntry, (void*)bootArgsPreLion, NULL, NULL);␊ |
␊ |
␉␉startprog( kernelEntry, bootArgsPreLion );␊ |
␉}␊ |
␊ |
␉// Not reached␊ |
␉__builtin_unreachable();␊ |
}␊ |
|
//==========================================================================␊ |
// LoadKernelCache - Try to load Kernel Cache.␊ |
// return the length of the loaded cache file or -1 on error␊ |
long LoadKernelCache(const char* cacheFile, void **binary)␊ |
long LoadKernelCache(const char *cacheFile, void **binary)␊ |
{␊ |
␉char␉␉kernelCacheFile[512];␊ |
␉char␉␉kernelCachePath[512];␊ |
|
␉}␊ |
␉else␊ |
␉{␊ |
␉␉// Lion, Mountain Lion, Mavericks and Yosemite prelink kernel cache file␊ |
␉␉if (MacOSVerCurrent >= MacOSVer2Int("10.7")) // OSX is Lion (10.7) or newer␊ |
␉␉// Leopard prelink kernel cache file␊ |
␉␉if ( TIGER || LEOPARD ) // OSX is 10.4 or 10.5␊ |
␉␉{␊ |
␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%skernelcache", kDefaultCachePathSnow);␊ |
␉␉␉verbose("Kernel Cache file path (Mac OS X 10.7 and newer): %s\n", kernelCacheFile);␊ |
␉␉␉// Reset cache name.␊ |
␉␉␉bzero(gCacheNameAdler + 64, sizeof(gCacheNameAdler) - 64);␊ |
␉␉␉snprintf(gCacheNameAdler + 64, sizeof(gCacheNameAdler) - 64, "%s,%s", gRootDevice, bootInfo->bootFile);␊ |
␉␉␉adler32 = Adler32((unsigned char *)gCacheNameAdler, sizeof(gCacheNameAdler));␊ |
␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%s.%08lX", kDefaultCachePathLeo, adler32);␊ |
␉␉␉verbose("Reseted kernel cache file path: %s\n", kernelCacheFile);␊ |
␊ |
␉␉}␊ |
␉␉// Snow Leopard prelink kernel cache file␊ |
␉␉else␊ |
␉␉else if ( SNOW_LEOPARD )␊ |
␉␉{␊ |
␉␉␉if (MacOSVerCurrent >= MacOSVer2Int("10.6")) // OSX is Snow (10.6)␊ |
␉␉␉{␊ |
␉␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "kernelcache_%s",␊ |
␉␉␉␉␉(archCpuType == CPU_TYPE_I386) ? "i386" : "x86_64");␊ |
␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "kernelcache_%s",␊ |
␉␉␉␉(archCpuType == CPU_TYPE_I386) ? "i386" : "x86_64");␊ |
␊ |
␉␉␉␉int␉lnam = strlen(kernelCacheFile) + 9; //with adler32␊ |
␉␉␉␉char␉*name;␊ |
␉␉␉␉u_int32_t prev_time = 0;␊ |
␉␉␉int␉␉lnam = strlen(kernelCacheFile) + 9; //with adler32␊ |
␉␉␉char␉␉*name;␊ |
␉␉␉u_int32_t␉prev_time = 0;␊ |
␊ |
␉␉␉␉struct dirstuff* cacheDir = opendir(kDefaultCachePathSnow);␊ |
␉␉␉struct dirstuff *cacheDir = opendir(kDefaultCachePathSnow);␊ |
␊ |
␉␉␉␉/* TODO: handle error? */␊ |
␉␉␉␉if (cacheDir)␊ |
␉␉␉/* TODO: handle error? */␊ |
␉␉␉if (cacheDir)␊ |
␉␉␉{␊ |
␉␉␉␉while(readdir(cacheDir, (const char**)&name, &flags, &time) >= 0)␊ |
␉␉␉␉{␊ |
␉␉␉␉␉while(readdir(cacheDir, (const char**)&name, &flags, &time) >= 0)␊ |
␉␉␉␉␉if (((flags & kFileTypeMask) != kFileTypeDirectory) && time > prev_time␊ |
␉␉␉␉␉␉&& strstr(name, kernelCacheFile) && (name[lnam] != '.'))␊ |
␉␉␉␉␉{␊ |
␉␉␉␉␉␉if (((flags & kFileTypeMask) != kFileTypeDirectory) && time > prev_time␊ |
␉␉␉␉␉␉␉&& strstr(name, kernelCacheFile) && (name[lnam] != '.'))␊ |
␉␉␉␉␉␉{␊ |
␉␉␉␉␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%s%s", kDefaultCachePathSnow, name);␊ |
␉␉␉␉␉␉␉prev_time = time;␊ |
␉␉␉␉␉␉}␊ |
␉␉␉␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%s%s", kDefaultCachePathSnow, name);␊ |
␉␉␉␉␉␉prev_time = time;␊ |
␉␉␉␉␉}␊ |
␉␉␉␉␉verbose("Kernel Cache file path (Mac OS X 10.6.X): %s\n", kernelCacheFile);␊ |
␉␉␉␉}␊ |
␉␉␉␉closedir(cacheDir);␊ |
␉␉␉␉verbose("Kernel Cache file path (Mac OS X 10.6.X): %s\n", kernelCacheFile);␊ |
␉␉␉}␊ |
␉␉␉else␊ |
␉␉␉{␊ |
␉␉␉␉// Leopard prelink kernel cache file␊ |
␉␉␉␉// Reset cache name.␊ |
␉␉␉␉bzero(gCacheNameAdler + 64, sizeof(gCacheNameAdler) - 64);␊ |
␉␉␉␉snprintf(gCacheNameAdler + 64, sizeof(gCacheNameAdler) - 64, "%s,%s", gRootDevice, bootInfo->bootFile);␊ |
␉␉␉␉adler32 = Adler32((unsigned char *)gCacheNameAdler, sizeof(gCacheNameAdler));␊ |
␉␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%s.%08lX", kDefaultCachePathLeo, adler32);␊ |
␉␉␉␉verbose("Reseted kernel cache file path: %s\n", kernelCacheFile);␊ |
␉␉␉}␊ |
␉␉␉closedir(cacheDir);␊ |
␉␉}␊ |
␉␉else␊ |
␉␉{␊ |
␉␉␉// Lion, Mountain Lion, Mavericks and Yosemite prelink kernel cache file␊ |
␉␉␉// for 10.7 10.8 10.9 10.10␊ |
␉␉␉snprintf(kernelCacheFile, sizeof(kernelCacheFile), "%skernelcache", kDefaultCachePathSnow);␊ |
␉␉␉verbose("Kernel Cache file path (Mac OS X 10.7 and newer): %s\n", kernelCacheFile);␊ |
␊ |
␉␉}␊ |
␉}␊ |
␊ |
␉// Check if the kernel cache file exists␊ |
|
␉␉␉// bootFile must start with a / if it not start with a device name␊ |
␉␉␉if (!bootFileWithDevice && (bootInfo->bootFile)[0] != '/')␊ |
␉␉␉{␊ |
␉␉␉␉if (MacOSVerCurrent >= MacOSVer2Int("10.10")) // OSX is 10.10 or newer␊ |
␉␉␉␉if ( !YOSEMITE ) // Is not Yosemite 10.10␊ |
␉␉␉␉{␊ |
␉␉␉␉␉snprintf(bootFile, sizeof(bootFile), kDefaultKernelPathForYos "%s", bootInfo->bootFile); // Yosemite␊ |
␉␉␉␉␉snprintf(bootFile, sizeof(bootFile), "/%s", bootInfo->bootFile); // append a leading /␊ |
␉␉␉␉}␊ |
␉␉␉␉else␊ |
␉␉␉␉{␊ |
␉␉␉␉␉snprintf(bootFile, sizeof(bootFile), "/%s", bootInfo->bootFile); // append a leading '/'␊ |
␉␉␉␉␉snprintf(bootFile, sizeof(bootFile), kDefaultKernelPathForYos"%s", bootInfo->bootFile); // Yosemite␊ |
␉␉␉␉}␊ |
␉␉␉}␊ |
␉␉␉else␊ |