Kunlun OEM commands,The first version add two commands:
1,setCpuInfo:save cpu infomation from bios to file
2,getCpuInfo:load cpu infomation from file
Signed-off-by: Xiuzhi Cheng <xzcheng@zd-tech.com.cn>
diff --git a/src/kunlun_oem.cpp b/src/kunlun_oem.cpp
new file mode 100644
index 0000000..c82fab3
--- /dev/null
+++ b/src/kunlun_oem.cpp
@@ -0,0 +1,89 @@
+#include <filesystem>
+#include <ipmid/api.hpp>
+#include <phosphor-logging/log.hpp>
+
+#include "config.h"
+#include "kunlun_oem.hpp"
+
+namespace ipmi
+{
+
+using namespace phosphor::logging;
+
+// save cpu infomation from bios to file
+// index[in]: cpu index
+// info[in]: data saving to file
+static int saveInfoToFile(uint8_t index, std::vector<char> &info)
+{
+ char infoPath[PATH_MAX];
+
+ std::snprintf(infoPath, sizeof(infoPath), IPMI_BIOSDATA_DIR"/cpu%02x", index);
+
+ if (!(std::filesystem::exists(IPMI_BIOSDATA_DIR)))
+ {
+ std::filesystem::create_directory(IPMI_BIOSDATA_DIR);
+ }
+
+ std::ofstream ofs(infoPath, std::ios::out | std::ios::binary);
+ ofs.seekp(0);
+ ofs.write(info.data(), info.size());
+ ofs.close();
+
+ return 0;
+}
+
+// load cpu infomation from file
+// index[in]: cpu index
+// info[out]: data loading from file
+static int loadInfoFromFile(uint8_t index, std::vector<char> &info)
+{
+ char infoPath[PATH_MAX];
+
+ std::snprintf(infoPath, sizeof(infoPath), IPMI_BIOSDATA_DIR"/cpu%02x", index);
+
+ if (!(std::filesystem::exists(infoPath)))
+ {
+ std::filesystem::create_directory(infoPath);
+ }
+
+ std::ifstream ifs(infoPath, std::ios::in | std::ios::binary);
+
+ ifs.seekg(0, std::ios::end);
+ auto size = ifs.tellg();
+ ifs.seekg(0, std::ios::beg);
+
+ info.resize(size);
+
+ ifs.read(info.data(), size);
+ ifs.close();
+
+ return 0;
+}
+
+RspType<> setCpuInfo(uint8_t index, std::vector<char> info)
+{
+ saveInfoToFile(index, info);
+
+ return responseSuccess();
+}
+
+RspType<std::vector<char>> getCpuInfo(uint8_t index)
+{
+ std::vector<char> output;
+
+ loadInfoFromFile(index, output);
+
+ return responseSuccess(output);
+}
+
+void register_kunlun_oem_functions(void)
+{
+ registerHandler(prioOemBase, netfnKunlunOem, cmd::cmdSetCpuInfo,
+ Privilege::Admin, setCpuInfo);
+ registerHandler(prioOemBase, netfnKunlunOem, cmd::cmdGetCpuInfo,
+ Privilege::User, getCpuInfo);
+}
+
+void register_kunlun_oem_functions() __attribute__((constructor));
+
+} // namespace ipmi