diff --git a/src/.kunlun_oem.cpp.swp b/src/.kunlun_oem.cpp.swp
new file mode 100644
index 0000000..e41b7d0
--- /dev/null
+++ b/src/.kunlun_oem.cpp.swp
Binary files differ
diff --git a/src/.uuid b/src/.uuid
new file mode 100644
index 0000000..b77e90c
--- /dev/null
+++ b/src/.uuid
@@ -0,0 +1 @@
+3579f1bb-5c94-4e25-bf66-2bbd53b3674d
\ No newline at end of file
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
diff --git a/src/kunlun_oem.hpp b/src/kunlun_oem.hpp
new file mode 100644
index 0000000..acd62db
--- /dev/null
+++ b/src/kunlun_oem.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <cstdint>
+#include <ipmid/api.hpp>
+
+namespace ipmi
+{
+
+using NetFn = uint8_t;
+using Cmd   = uint8_t;
+using Cc    = uint8_t;
+
+constexpr NetFn netfnKunlunOem = netFnOemSix;
+namespace cmd
+{
+    constexpr Cmd cmdSetCpuInfo   = 0x0;
+    constexpr Cmd cmdGetCpuInfo   = 0x1;
+} // namespace cmd
+
+RspType<> setCpuInfo(uint8_t index, std::vector<char> info);
+RspType<std::vector<char>> getCpuInfo(uint8_t index);
+
+} // namespace ipmi
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000..cb77ffc
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,19 @@
+configure_file(output: 'config.h',
+    configuration: cdata,
+)
+
+src_inc = include_directories('.')
+
+so_version = '0.0.1'
+
+shared_library(
+  'kunlun-ipmi-oem',
+  'kunlun_oem.cpp',
+  dependencies: [
+    phosphor_logging,
+    libipmid,
+  ],
+  version: so_version,
+  install: true,
+  install_dir: get_option('libdir') / 'ipmid-providers'
+  )
