Index: branches/azimutz/CleanCut/i386/libsaio/acpi_patcher.c =================================================================== --- branches/azimutz/CleanCut/i386/libsaio/acpi_patcher.c (revision 364) +++ branches/azimutz/CleanCut/i386/libsaio/acpi_patcher.c (revision 365) @@ -90,13 +90,15 @@ /** The following ACPI Table search algo, should be reused anywhere needed: */ int search_and_get_acpi_fd(const char * filename, const char ** outDirspec) { - char dirSpecDSDT[128] = ""; + static bool first_time = true; + static char dirSpecDSDT[128] = ""; const char *override_pathname = NULL; // full path to a file. int len = 0, fd = 0; extern char gMacOSVersion; - // Take in account user overriding - if (getValueForKey(kDSDTKey, &override_pathname, &len, &bootInfo->bootConfig)) + // Take in account user overriding if it's DSDT only + if (strstr(filename, "DSDT") && + getValueForKey(kDSDTKey, &override_pathname, &len, &bootInfo->bootConfig)) { // Specify a path to a file, e.g. DSDT=/Extra/test.aml sprintf(dirSpecDSDT, override_pathname); @@ -104,6 +106,33 @@ if (fd >= 0) goto success_fd; } + // Check that dirSpecDSDT is not already assigned with a path + if (!first_time && *dirSpecDSDT) + { // it is so start searching this cached patch first + //extract path + for (len = strlen(dirSpecDSDT)-1; len; len--) + { + if (dirSpecDSDT[len] == '/' || len == 0) + { + dirSpecDSDT[len] = '\0'; + break; + } + } + + // now concat with the filename + strncat(dirSpecDSDT, "/", sizeof(dirSpecDSDT)); + strncat(dirSpecDSDT, filename, sizeof(dirSpecDSDT)); + + // and test to see if we don't have our big boy here: + fd = open(dirSpecDSDT,0); + if (fd >= 0) + { + printf("ACPI file search cache hit: file found at %s\n", dirSpecDSDT); + goto success_fd; + } + } + + // Start searching any potential location for ACPI Table // Check rd's root. sprintf(dirSpecDSDT, "rd(0,0)/%s", filename); fd = open(dirSpecDSDT, 0); @@ -125,14 +154,16 @@ //if (fd>=0) goto success_fd; // NOT FOUND: - //Azi: a reminder - handling this only on pci_root.c, getPciRootUID() (it's enough to check if .aml file exists), - // to reduce number of printed messages and the confusion caused by them on users. + //Azi: a reminder - handling this verbose only on pci_root.c, getPciRootUID() + // (it's enough to check if *.aml file exists), to reduce number of printed messages + // and the confusion caused by them on users. //verbose("ACPI Table not found: %s\n", filename); - if (outDirspec) *outDirspec = ""; + first_time = false; return -1; // FOUND success_fd: + first_time = false; if (outDirspec) *outDirspec = dirSpecDSDT; return fd; }