1711d51d8SMatt Spinler /** 2711d51d8SMatt Spinler * Copyright © 2019 IBM Corporation 3711d51d8SMatt Spinler * 4711d51d8SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License"); 5711d51d8SMatt Spinler * you may not use this file except in compliance with the License. 6711d51d8SMatt Spinler * You may obtain a copy of the License at 7711d51d8SMatt Spinler * 8711d51d8SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0 9711d51d8SMatt Spinler * 10711d51d8SMatt Spinler * Unless required by applicable law or agreed to in writing, software 11711d51d8SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS, 12711d51d8SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13711d51d8SMatt Spinler * See the License for the specific language governing permissions and 14711d51d8SMatt Spinler * limitations under the License. 15711d51d8SMatt Spinler */ 16131870c7SMatt Spinler #include "section_factory.hpp" 17131870c7SMatt Spinler 18*386a61e6SMatt Spinler #include "extended_user_data.hpp" 19c63e2e82SMatt Spinler #include "extended_user_header.hpp" 20131870c7SMatt Spinler #include "failing_mtms.hpp" 21131870c7SMatt Spinler #include "generic.hpp" 22131870c7SMatt Spinler #include "pel_types.hpp" 23131870c7SMatt Spinler #include "private_header.hpp" 24f9bae185SMatt Spinler #include "src.hpp" 2551c9263fSAatir Manzur #include "user_data.hpp" 26131870c7SMatt Spinler #include "user_header.hpp" 27131870c7SMatt Spinler 28131870c7SMatt Spinler namespace openpower 29131870c7SMatt Spinler { 30131870c7SMatt Spinler namespace pels 31131870c7SMatt Spinler { 32131870c7SMatt Spinler namespace section_factory 33131870c7SMatt Spinler { create(Stream & pelData)34131870c7SMatt Spinlerstd::unique_ptr<Section> create(Stream& pelData) 35131870c7SMatt Spinler { 36131870c7SMatt Spinler std::unique_ptr<Section> section; 37131870c7SMatt Spinler 38131870c7SMatt Spinler // Peek the section ID to create the appriopriate object. 39131870c7SMatt Spinler // If not enough data remains to do so, an invalid 40131870c7SMatt Spinler // Generic object will be created in the default case. 41131870c7SMatt Spinler uint16_t sectionID = 0; 42131870c7SMatt Spinler 43131870c7SMatt Spinler if (pelData.remaining() >= 2) 44131870c7SMatt Spinler { 45131870c7SMatt Spinler pelData >> sectionID; 46131870c7SMatt Spinler pelData.offset(pelData.offset() - 2); 47131870c7SMatt Spinler } 48131870c7SMatt Spinler 49131870c7SMatt Spinler switch (sectionID) 50131870c7SMatt Spinler { 51131870c7SMatt Spinler case static_cast<uint16_t>(SectionID::privateHeader): 52131870c7SMatt Spinler section = std::make_unique<PrivateHeader>(pelData); 53131870c7SMatt Spinler break; 5451c9263fSAatir Manzur case static_cast<uint16_t>(SectionID::userData): 5551c9263fSAatir Manzur section = std::make_unique<UserData>(pelData); 5651c9263fSAatir Manzur break; 57131870c7SMatt Spinler case static_cast<uint16_t>(SectionID::userHeader): 58131870c7SMatt Spinler section = std::make_unique<UserHeader>(pelData); 59131870c7SMatt Spinler break; 60131870c7SMatt Spinler case static_cast<uint16_t>(SectionID::failingMTMS): 61131870c7SMatt Spinler section = std::make_unique<FailingMTMS>(pelData); 62131870c7SMatt Spinler break; 63f9bae185SMatt Spinler case static_cast<uint16_t>(SectionID::primarySRC): 64f9bae185SMatt Spinler case static_cast<uint16_t>(SectionID::secondarySRC): 65f9bae185SMatt Spinler section = std::make_unique<SRC>(pelData); 66f9bae185SMatt Spinler break; 67c63e2e82SMatt Spinler case static_cast<uint16_t>(SectionID::extendedUserHeader): 68c63e2e82SMatt Spinler section = std::make_unique<ExtendedUserHeader>(pelData); 69c63e2e82SMatt Spinler break; 70*386a61e6SMatt Spinler case static_cast<uint16_t>(SectionID::extUserData): 71*386a61e6SMatt Spinler section = std::make_unique<ExtendedUserData>(pelData); 72*386a61e6SMatt Spinler break; 73131870c7SMatt Spinler default: 74131870c7SMatt Spinler // A generic object, but at least an object. 75131870c7SMatt Spinler section = std::make_unique<Generic>(pelData); 76131870c7SMatt Spinler break; 77131870c7SMatt Spinler } 78131870c7SMatt Spinler 79131870c7SMatt Spinler return section; 80131870c7SMatt Spinler } 81131870c7SMatt Spinler 82131870c7SMatt Spinler } // namespace section_factory 83131870c7SMatt Spinler } // namespace pels 84131870c7SMatt Spinler } // namespace openpower 85