Add system dbus service for MDR V2

Add BIOS version and UUID in smbios table and provide dbus
interface for redfish to get these information.

Tested:
DC cycle the system and waiting for BIOS entering setup page.
Redfish should be able to show correct UUID.

Signed-off-by: Cheng C Yang <cheng.c.yang@linux.intel.com>
Change-Id: I0d364f27488d3efa24e4a9dde97086f09e94d2a2
diff --git a/src/system.cpp b/src/system.cpp
new file mode 100644
index 0000000..8cdcbe3
--- /dev/null
+++ b/src/system.cpp
@@ -0,0 +1,83 @@
+/*
+// Copyright (c) 2018 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#include "system.hpp"
+
+#include "mdrv2.hpp"
+
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+namespace phosphor
+{
+namespace smbios
+{
+
+std::string System::uUID(std::string value)
+{
+    uint8_t *dataIn = storage;
+    dataIn = getSMBIOSTypePtr(dataIn, systemType);
+    if (dataIn != nullptr)
+    {
+        auto systemInfo = reinterpret_cast<struct SystemInfo *>(dataIn);
+        std::stringstream stream;
+        stream << std::setfill('0') << std::hex;
+        stream << std::setw(8) << systemInfo->uUID.timeLow;
+        stream << "-";
+        stream << std::setw(4) << systemInfo->uUID.timeMid;
+        stream << "-";
+        stream << std::setw(4) << systemInfo->uUID.timeHiAndVer;
+        stream << "-";
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.clockSeqHi);
+        stream << std::setw(2)
+               << static_cast<int>(systemInfo->uUID.clockSeqLow);
+        stream << "-";
+        static_assert(sizeof(systemInfo->uUID.node) == 6);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[0]);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[1]);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[2]);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[3]);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[4]);
+        stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[5]);
+
+        return sdbusplus::xyz::openbmc_project::Common::server::UUID::uUID(
+            stream.str());
+    }
+
+    return sdbusplus::xyz::openbmc_project::Common::server::UUID::uUID(
+        "00000000-0000-0000-0000-000000000000");
+}
+
+std::string System::version(std::string value)
+{
+    std::string result = "No BIOS Version";
+    uint8_t *dataIn = storage;
+    dataIn = getSMBIOSTypePtr(dataIn, biosType);
+    if (dataIn != nullptr)
+    {
+        auto biosInfo = reinterpret_cast<struct BIOSInfo *>(dataIn);
+        uint8_t biosVerByte = biosInfo->biosVersion;
+        std::string tempS =
+            positionToString(biosInfo->biosVersion, biosInfo->length, dataIn);
+        result = tempS;
+    }
+
+    return sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
+        Revision::version(result);
+}
+
+} // namespace smbios
+} // namespace phosphor