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 21*26de0d73SKuiying Wang #include <fstream> 22b4651b9cSCheng C Yang #include <iomanip> 23b4651b9cSCheng C Yang #include <iostream> 24b4651b9cSCheng C Yang #include <sstream> 25b4651b9cSCheng C Yang namespace phosphor 26b4651b9cSCheng C Yang { 27b4651b9cSCheng C Yang namespace smbios 28b4651b9cSCheng C Yang { 29b4651b9cSCheng C Yang 30b4651b9cSCheng C Yang std::string System::uUID(std::string value) 31b4651b9cSCheng C Yang { 32b4651b9cSCheng C Yang uint8_t* dataIn = storage; 33b4651b9cSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, systemType); 34b4651b9cSCheng C Yang if (dataIn != nullptr) 35b4651b9cSCheng C Yang { 36b4651b9cSCheng C Yang auto systemInfo = reinterpret_cast<struct SystemInfo*>(dataIn); 37b4651b9cSCheng C Yang std::stringstream stream; 38b4651b9cSCheng C Yang stream << std::setfill('0') << std::hex; 39b4651b9cSCheng C Yang stream << std::setw(8) << systemInfo->uUID.timeLow; 40b4651b9cSCheng C Yang stream << "-"; 41b4651b9cSCheng C Yang stream << std::setw(4) << systemInfo->uUID.timeMid; 42b4651b9cSCheng C Yang stream << "-"; 43b4651b9cSCheng C Yang stream << std::setw(4) << systemInfo->uUID.timeHiAndVer; 44b4651b9cSCheng C Yang stream << "-"; 45b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.clockSeqHi); 46b4651b9cSCheng C Yang stream << std::setw(2) 47b4651b9cSCheng C Yang << static_cast<int>(systemInfo->uUID.clockSeqLow); 48b4651b9cSCheng C Yang stream << "-"; 49b4651b9cSCheng C Yang static_assert(sizeof(systemInfo->uUID.node) == 6); 50b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[0]); 51b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[1]); 52b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[2]); 53b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[3]); 54b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[4]); 55b4651b9cSCheng C Yang stream << std::setw(2) << static_cast<int>(systemInfo->uUID.node[5]); 56b4651b9cSCheng C Yang 57b4651b9cSCheng C Yang return sdbusplus::xyz::openbmc_project::Common::server::UUID::uUID( 58b4651b9cSCheng C Yang stream.str()); 59b4651b9cSCheng C Yang } 60b4651b9cSCheng C Yang 61b4651b9cSCheng C Yang return sdbusplus::xyz::openbmc_project::Common::server::UUID::uUID( 62b4651b9cSCheng C Yang "00000000-0000-0000-0000-000000000000"); 63b4651b9cSCheng C Yang } 64b4651b9cSCheng C Yang 65b4651b9cSCheng C Yang std::string System::version(std::string value) 66b4651b9cSCheng C Yang { 67b4651b9cSCheng C Yang std::string result = "No BIOS Version"; 68b4651b9cSCheng C Yang uint8_t* dataIn = storage; 69b4651b9cSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, biosType); 70b4651b9cSCheng C Yang if (dataIn != nullptr) 71b4651b9cSCheng C Yang { 72b4651b9cSCheng C Yang auto biosInfo = reinterpret_cast<struct BIOSInfo*>(dataIn); 73b4651b9cSCheng C Yang uint8_t biosVerByte = biosInfo->biosVersion; 74b4651b9cSCheng C Yang std::string tempS = 75b4651b9cSCheng C Yang positionToString(biosInfo->biosVersion, biosInfo->length, dataIn); 76*26de0d73SKuiying Wang if (std::find_if(tempS.begin(), tempS.end(), 77*26de0d73SKuiying Wang [](char ch) { return !isprint(ch); }) != tempS.end()) 78*26de0d73SKuiying Wang { 79*26de0d73SKuiying Wang std::ofstream smbiosFile(mdrType2File, std::ios_base::trunc); 80*26de0d73SKuiying Wang if (!smbiosFile.good()) 81*26de0d73SKuiying Wang { 82*26de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 83*26de0d73SKuiying Wang "Open MDRV2 table file failure"); 84*26de0d73SKuiying Wang return result; 85*26de0d73SKuiying Wang } 86*26de0d73SKuiying Wang smbiosFile.clear(); 87*26de0d73SKuiying Wang smbiosFile.close(); 88*26de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 89*26de0d73SKuiying Wang "Find non-print char, delete the broken MDRV2 table file!"); 90*26de0d73SKuiying Wang return sdbusplus::xyz::openbmc_project::Inventory::Decorator:: 91*26de0d73SKuiying Wang server::Revision::version(result); 92*26de0d73SKuiying Wang } 93b4651b9cSCheng C Yang result = tempS; 94b4651b9cSCheng C Yang } 95b4651b9cSCheng C Yang 96b4651b9cSCheng C Yang return sdbusplus::xyz::openbmc_project::Inventory::Decorator::server:: 97b4651b9cSCheng C Yang Revision::version(result); 98b4651b9cSCheng C Yang } 99b4651b9cSCheng C Yang 100b4651b9cSCheng C Yang } // namespace smbios 101b4651b9cSCheng C Yang } // namespace phosphor 102