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 Spinler std::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