xref: /openbmc/smbios-mdr/src/system.cpp (revision 7393e48d)
1b4651b9cSCheng C Yang /*
2b4651b9cSCheng C Yang // Copyright (c) 2018 Intel Corporation
3b4651b9cSCheng C Yang //
4b4651b9cSCheng C Yang // Licensed under the Apache License, Version 2.0 (the "License");
5b4651b9cSCheng C Yang // you may not use this file except in compliance with the License.
6b4651b9cSCheng C Yang // You may obtain a copy of the License at
7b4651b9cSCheng C Yang //
8b4651b9cSCheng C Yang //      http://www.apache.org/licenses/LICENSE-2.0
9b4651b9cSCheng C Yang //
10b4651b9cSCheng C Yang // Unless required by applicable law or agreed to in writing, software
11b4651b9cSCheng C Yang // distributed under the License is distributed on an "AS IS" BASIS,
12b4651b9cSCheng C Yang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4651b9cSCheng C Yang // See the License for the specific language governing permissions and
14b4651b9cSCheng C Yang // limitations under the License.
15b4651b9cSCheng C Yang */
16b4651b9cSCheng C Yang 
17b4651b9cSCheng C Yang #include "system.hpp"
18b4651b9cSCheng C Yang 
19b4651b9cSCheng C Yang #include "mdrv2.hpp"
20b4651b9cSCheng C Yang 
2126de0d73SKuiying Wang #include <fstream>
22b4651b9cSCheng C Yang #include <iomanip>
23b4651b9cSCheng C Yang #include <iostream>
24b4651b9cSCheng C Yang #include <sstream>
25*7393e48dSJayaprakash Mutyala 
26*7393e48dSJayaprakash Mutyala static constexpr const char* biosActiveObjPath =
27*7393e48dSJayaprakash Mutyala     "/xyz/openbmc_project/software/bios_active";
28*7393e48dSJayaprakash Mutyala static constexpr const char* biosVersionIntf =
29*7393e48dSJayaprakash Mutyala     "xyz.openbmc_project.Software.Version";
30*7393e48dSJayaprakash Mutyala static constexpr const char* biosVersionProp = "Version";
31*7393e48dSJayaprakash Mutyala 
32b4651b9cSCheng C Yang namespace phosphor
33b4651b9cSCheng C Yang {
34b4651b9cSCheng C Yang namespace smbios
35b4651b9cSCheng C Yang {
36b4651b9cSCheng C Yang 
37e7770991SJason M. Bills std::string System::uuid(std::string value)
38b4651b9cSCheng C Yang {
39b4651b9cSCheng C Yang     uint8_t* dataIn = storage;
40b4651b9cSCheng C Yang     dataIn = getSMBIOSTypePtr(dataIn, systemType);
41b4651b9cSCheng C Yang     if (dataIn != nullptr)
42b4651b9cSCheng C Yang     {
43b4651b9cSCheng C Yang         auto systemInfo = reinterpret_cast<struct SystemInfo*>(dataIn);
44b4651b9cSCheng C Yang         std::stringstream stream;
45b4651b9cSCheng C Yang         stream << std::setfill('0') << std::hex;
46e7770991SJason M. Bills         stream << std::setw(8) << systemInfo->uuid.timeLow;
47b4651b9cSCheng C Yang         stream << "-";
48e7770991SJason M. Bills         stream << std::setw(4) << systemInfo->uuid.timeMid;
49b4651b9cSCheng C Yang         stream << "-";
50e7770991SJason M. Bills         stream << std::setw(4) << systemInfo->uuid.timeHiAndVer;
51b4651b9cSCheng C Yang         stream << "-";
52e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.clockSeqHi);
53b4651b9cSCheng C Yang         stream << std::setw(2)
54e7770991SJason M. Bills                << static_cast<int>(systemInfo->uuid.clockSeqLow);
55b4651b9cSCheng C Yang         stream << "-";
56e7770991SJason M. Bills         static_assert(sizeof(systemInfo->uuid.node) == 6);
57e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[0]);
58e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[1]);
59e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[2]);
60e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[3]);
61e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[4]);
62e7770991SJason M. Bills         stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[5]);
63b4651b9cSCheng C Yang 
64e7770991SJason M. Bills         return sdbusplus::xyz::openbmc_project::Common::server::UUID::uuid(
65b4651b9cSCheng C Yang             stream.str());
66b4651b9cSCheng C Yang     }
67b4651b9cSCheng C Yang 
68e7770991SJason M. Bills     return sdbusplus::xyz::openbmc_project::Common::server::UUID::uuid(
69b4651b9cSCheng C Yang         "00000000-0000-0000-0000-000000000000");
70b4651b9cSCheng C Yang }
71b4651b9cSCheng C Yang 
72*7393e48dSJayaprakash Mutyala static std::string getService(sdbusplus::bus::bus& bus,
73*7393e48dSJayaprakash Mutyala                               const std::string& objectPath,
74*7393e48dSJayaprakash Mutyala                               const std::string& interface)
75*7393e48dSJayaprakash Mutyala {
76*7393e48dSJayaprakash Mutyala     auto method =
77*7393e48dSJayaprakash Mutyala         bus.new_method_call("xyz.openbmc_project.ObjectMapper",
78*7393e48dSJayaprakash Mutyala                             "/xyz/openbmc_project/object_mapper",
79*7393e48dSJayaprakash Mutyala                             "xyz.openbmc_project.ObjectMapper", "GetObject");
80*7393e48dSJayaprakash Mutyala 
81*7393e48dSJayaprakash Mutyala     method.append(objectPath);
82*7393e48dSJayaprakash Mutyala     method.append(std::vector<std::string>({interface}));
83*7393e48dSJayaprakash Mutyala 
84*7393e48dSJayaprakash Mutyala     std::vector<std::pair<std::string, std::vector<std::string>>> response;
85*7393e48dSJayaprakash Mutyala 
86*7393e48dSJayaprakash Mutyala     try
87*7393e48dSJayaprakash Mutyala     {
88*7393e48dSJayaprakash Mutyala         auto reply = bus.call(method);
89*7393e48dSJayaprakash Mutyala         reply.read(response);
90*7393e48dSJayaprakash Mutyala     }
91*7393e48dSJayaprakash Mutyala     catch (const sdbusplus::exception_t& e)
92*7393e48dSJayaprakash Mutyala     {
93*7393e48dSJayaprakash Mutyala         lg2::error("Error in mapper method call - {ERROR}, SERVICE - "
94*7393e48dSJayaprakash Mutyala                    "{SERVICE}, PATH - {PATH}",
95*7393e48dSJayaprakash Mutyala                    "ERROR", e.what(), "SERVICE", objectPath.c_str(), "PATH",
96*7393e48dSJayaprakash Mutyala                    interface.c_str());
97*7393e48dSJayaprakash Mutyala 
98*7393e48dSJayaprakash Mutyala         return std::string{};
99*7393e48dSJayaprakash Mutyala     }
100*7393e48dSJayaprakash Mutyala 
101*7393e48dSJayaprakash Mutyala     return response[0].first;
102*7393e48dSJayaprakash Mutyala }
103*7393e48dSJayaprakash Mutyala 
104*7393e48dSJayaprakash Mutyala static void setProperty(sdbusplus::bus::bus& bus, const std::string& objectPath,
105*7393e48dSJayaprakash Mutyala                         const std::string& interface,
106*7393e48dSJayaprakash Mutyala                         const std::string& propertyName,
107*7393e48dSJayaprakash Mutyala                         const std::string& value)
108*7393e48dSJayaprakash Mutyala {
109*7393e48dSJayaprakash Mutyala     auto service = getService(bus, objectPath, interface);
110*7393e48dSJayaprakash Mutyala     if (service.empty())
111*7393e48dSJayaprakash Mutyala     {
112*7393e48dSJayaprakash Mutyala         return;
113*7393e48dSJayaprakash Mutyala     }
114*7393e48dSJayaprakash Mutyala 
115*7393e48dSJayaprakash Mutyala     auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
116*7393e48dSJayaprakash Mutyala                                       "org.freedesktop.DBus.Properties", "Set");
117*7393e48dSJayaprakash Mutyala     method.append(interface.c_str(), propertyName.c_str(),
118*7393e48dSJayaprakash Mutyala                   std::variant<std::string>{value});
119*7393e48dSJayaprakash Mutyala 
120*7393e48dSJayaprakash Mutyala     bus.call_noreply(method);
121*7393e48dSJayaprakash Mutyala }
122*7393e48dSJayaprakash Mutyala 
123b4651b9cSCheng C Yang std::string System::version(std::string value)
124b4651b9cSCheng C Yang {
125b4651b9cSCheng C Yang     std::string result = "No BIOS Version";
126b4651b9cSCheng C Yang     uint8_t* dataIn = storage;
127b4651b9cSCheng C Yang     dataIn = getSMBIOSTypePtr(dataIn, biosType);
128b4651b9cSCheng C Yang     if (dataIn != nullptr)
129b4651b9cSCheng C Yang     {
130b4651b9cSCheng C Yang         auto biosInfo = reinterpret_cast<struct BIOSInfo*>(dataIn);
131b4651b9cSCheng C Yang         uint8_t biosVerByte = biosInfo->biosVersion;
132b4651b9cSCheng C Yang         std::string tempS =
133b4651b9cSCheng C Yang             positionToString(biosInfo->biosVersion, biosInfo->length, dataIn);
13426de0d73SKuiying Wang         if (std::find_if(tempS.begin(), tempS.end(),
13526de0d73SKuiying Wang                          [](char ch) { return !isprint(ch); }) != tempS.end())
13626de0d73SKuiying Wang         {
13726de0d73SKuiying Wang             std::ofstream smbiosFile(mdrType2File, std::ios_base::trunc);
13826de0d73SKuiying Wang             if (!smbiosFile.good())
13926de0d73SKuiying Wang             {
14026de0d73SKuiying Wang                 phosphor::logging::log<phosphor::logging::level::ERR>(
14126de0d73SKuiying Wang                     "Open MDRV2 table file failure");
14226de0d73SKuiying Wang                 return result;
14326de0d73SKuiying Wang             }
14426de0d73SKuiying Wang             smbiosFile.clear();
14526de0d73SKuiying Wang             smbiosFile.close();
14626de0d73SKuiying Wang             phosphor::logging::log<phosphor::logging::level::ERR>(
14726de0d73SKuiying Wang                 "Find non-print char, delete the broken MDRV2 table file!");
14826de0d73SKuiying Wang             return sdbusplus::xyz::openbmc_project::Inventory::Decorator::
14926de0d73SKuiying Wang                 server::Revision::version(result);
15026de0d73SKuiying Wang         }
151b4651b9cSCheng C Yang         result = tempS;
152*7393e48dSJayaprakash Mutyala 
153*7393e48dSJayaprakash Mutyala         setProperty(bus, biosActiveObjPath, biosVersionIntf, biosVersionProp,
154*7393e48dSJayaprakash Mutyala                     result);
155b4651b9cSCheng C Yang     }
1565f2d6275SAlex Schendel     lg2::info("VERSION INFO - BIOS - {VER}", "VER", result);
157*7393e48dSJayaprakash Mutyala 
158b4651b9cSCheng C Yang     return sdbusplus::xyz::openbmc_project::Inventory::Decorator::server::
159b4651b9cSCheng C Yang         Revision::version(result);
160b4651b9cSCheng C Yang }
161b4651b9cSCheng C Yang 
162b4651b9cSCheng C Yang } // namespace smbios
163b4651b9cSCheng C Yang } // namespace phosphor
164