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> 25b4651b9cSCheng C Yang namespace phosphor 26b4651b9cSCheng C Yang { 27b4651b9cSCheng C Yang namespace smbios 28b4651b9cSCheng C Yang { 29b4651b9cSCheng C Yang 30*e7770991SJason M. Bills 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; 39*e7770991SJason M. Bills stream << std::setw(8) << systemInfo->uuid.timeLow; 40b4651b9cSCheng C Yang stream << "-"; 41*e7770991SJason M. Bills stream << std::setw(4) << systemInfo->uuid.timeMid; 42b4651b9cSCheng C Yang stream << "-"; 43*e7770991SJason M. Bills stream << std::setw(4) << systemInfo->uuid.timeHiAndVer; 44b4651b9cSCheng C Yang stream << "-"; 45*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.clockSeqHi); 46b4651b9cSCheng C Yang stream << std::setw(2) 47*e7770991SJason M. Bills << static_cast<int>(systemInfo->uuid.clockSeqLow); 48b4651b9cSCheng C Yang stream << "-"; 49*e7770991SJason M. Bills static_assert(sizeof(systemInfo->uuid.node) == 6); 50*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[0]); 51*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[1]); 52*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[2]); 53*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[3]); 54*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[4]); 55*e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[5]); 56b4651b9cSCheng C Yang 57*e7770991SJason M. Bills return sdbusplus::xyz::openbmc_project::Common::server::UUID::uuid( 58b4651b9cSCheng C Yang stream.str()); 59b4651b9cSCheng C Yang } 60b4651b9cSCheng C Yang 61*e7770991SJason M. Bills 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); 7626de0d73SKuiying Wang if (std::find_if(tempS.begin(), tempS.end(), 7726de0d73SKuiying Wang [](char ch) { return !isprint(ch); }) != tempS.end()) 7826de0d73SKuiying Wang { 7926de0d73SKuiying Wang std::ofstream smbiosFile(mdrType2File, std::ios_base::trunc); 8026de0d73SKuiying Wang if (!smbiosFile.good()) 8126de0d73SKuiying Wang { 8226de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 8326de0d73SKuiying Wang "Open MDRV2 table file failure"); 8426de0d73SKuiying Wang return result; 8526de0d73SKuiying Wang } 8626de0d73SKuiying Wang smbiosFile.clear(); 8726de0d73SKuiying Wang smbiosFile.close(); 8826de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 8926de0d73SKuiying Wang "Find non-print char, delete the broken MDRV2 table file!"); 9026de0d73SKuiying Wang return sdbusplus::xyz::openbmc_project::Inventory::Decorator:: 9126de0d73SKuiying Wang server::Revision::version(result); 9226de0d73SKuiying 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