summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2012-11-15 10:40:06 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-11-16 22:03:16 -0600
commitd33218560b7b2bf2ebc4b5a33fed8aa77b8793e6 (patch)
tree7fff02186430b3d6c87b1238311e217b9cf6e37c /src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C
parent9342e9d7df794e5bcb352799a989d5a9f40e4ca0 (diff)
downloadblackbird-hostboot-d33218560b7b2bf2ebc4b5a33fed8aa77b8793e6.tar.gz
blackbird-hostboot-d33218560b7b2bf2ebc4b5a33fed8aa77b8793e6.zip
Merged common FSP and HB PRD code to prdf/common/
Change-Id: Iac94c3690598b7263de230934b911bb4ced34557 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2350 Tested-by: Jenkins Server Reviewed-by: Bradley W. Bishop <bradleyb@us.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2368 Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C')
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C b/src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C
new file mode 100755
index 000000000..a23e286aa
--- /dev/null
+++ b/src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C
@@ -0,0 +1,170 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/diag/prdf/common/framework/rule/prdrLoadChipCache.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2006,2012 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#ifndef __HOSTBOOT_MODULE
+
+#include <utilreg.H> // for UtilReg
+
+#endif
+
+
+#include <string.h> // for strncat
+#include <prdrLoadChipCache.H>
+#include <utilfile.H>
+#include <prdfTrace.H>
+
+namespace Prdr
+{
+ // Declare private member instance.
+ LoadChipCache::Cache_t LoadChipCache::cv_cache;
+
+ //---------------------------------------------------------------------
+ void LoadChipCache::flushCache()
+ {
+ // Delete all objects within the cache.
+ for (Cache_t::iterator i = cv_cache.begin();
+ i != cv_cache.end();
+ ++i)
+ {
+ if (NULL != i->second)
+ delete (PrdrChip*)i->second;
+ }
+
+ // Clear map.
+ cv_cache.clear();
+ };
+ //---------------------------------------------------------------------
+
+ //---------------------------------------------------------------------
+ errlHndl_t LoadChipCache::loadChip(const char * i_file,
+ PrdrChip ** o_chip)
+ {
+ errlHndl_t l_errl = NULL;
+ *o_chip = NULL;
+
+ Cache_t::iterator i = cv_cache.find(i_file);
+
+ if (cv_cache.end() != i) // Found object in cache.
+ {
+ (*o_chip) = (PrdrChip*)(*i).second;
+ l_errl = NULL;
+ }
+ else
+ {
+ (*o_chip) = new PrdrChip;
+
+ do
+ {
+ // NOTE: to patch PRF files require rebuilding
+ // entire Hostboot image and put in a special
+ // location on FSP /nfs mount.
+ // FIXME: if we need to patch prf files directly
+ // on Hostboot, need to discuss with Patrick
+ // about a possibility of creating a new PNOR
+ // partition outside of the cryptographically
+ // signed area just for PRD.
+
+#ifdef __HOSTBOOT_MODULE
+
+ char* l_filePathName;
+ size_t l_filePathSize = strlen(i_file) + 4 + 1; // 4 is for ".prf"
+ l_filePathName = new char[l_filePathSize];
+ strcpy(l_filePathName, i_file);
+ strncat(l_filePathName, ".prf", l_filePathSize-1);
+
+ UtilFile l_ruleFile(l_filePathName);
+ if (!l_ruleFile.exists())
+ {
+ // FIXME: do we need to log and commit an error here?
+ PRDF_ERR("LoadChipCache::loadChip() failed to find %s", l_filePathName);
+ }
+ else
+ {
+ l_ruleFile.Open("r");
+ }
+
+ delete[] l_filePathName;
+
+#else
+
+ // Read the correct directory path for flash.
+ size_t l_rootPathSize = 256;
+ char l_rootPath[256] = { '\0' };
+ l_errl = UtilReg::read("fstp/RO_Root",
+ (void *) l_rootPath,
+ l_rootPathSize);
+ strncat(l_rootPath, "prdf/", 255);
+ strncat(l_rootPath, i_file, 255);
+ strncat(l_rootPath, ".prf", 255);
+
+ if (NULL != l_errl) break;
+
+ // Read /nfs/data/... directory path
+ size_t l_nfsPathSize = 256;
+ char l_nfsPath[256] = { '\0' };
+ l_errl = UtilReg::read("fstp/NFS_Root",
+ (void *) l_nfsPath,
+ l_nfsPathSize);
+
+ strncat(l_nfsPath, "prdf/", 255);
+ strncat(l_nfsPath, i_file, 255);
+ strncat(l_nfsPath, ".prf", 255);
+
+ if (NULL != l_errl) break;
+
+ // Open File to read chip.
+ UtilFile l_ruleFile(l_nfsPath);
+ if (!l_ruleFile.exists()) // check for NFS file.
+ {
+ l_ruleFile.Open(l_rootPath, "r");
+ }
+ else
+ {
+ l_ruleFile.Open("r");
+ }
+
+#endif
+ // Load chip object.
+ l_errl = Prdr::prdrLoadChip(l_ruleFile, *(*o_chip));
+
+ } while (0);
+
+ if (NULL == l_errl)
+ {
+ // Add chip object to the cache.
+ cv_cache[i_file] = *o_chip;
+ }
+ else
+ {
+ PRDF_ERR("LoadChipCache::loadChip() l_errl is not null!");
+ delete *o_chip;
+ (*o_chip) = NULL;
+ }
+
+ }
+
+ return l_errl;
+
+ };
+ //---------------------------------------------------------------------
+}
OpenPOWER on IntegriCloud