1 #pragma once
2 
3 #include <stdint.h>
4 
5 #include <map>
6 #include <string>
7 
8 /**
9  * @brief TI special attention handler
10  *
11  * Handle special attention due to a terminate immediately (TI) condition.
12  */
13 namespace attn
14 {
15 
16 // TI data area definition
17 #pragma pack(push)
18 #pragma pack(1)
19 struct TiDataArea
20 {
21     uint8_t tiAreaValid;       // 0x00, common (non-zero == valid)
22     uint8_t command;           // 0x01, phyp/opal = 0xA1
23     uint16_t numDataBytes;     // 0x02, phyp/opal
24     uint8_t reserved1;         // 0x04, reserved
25     uint8_t hbTerminateType;   // 0x05, hostboot only
26     uint16_t hardwareDumpType; // 0x06, phyp/opal
27     uint8_t srcFormat;         // 0x08, phyp/opal = 0x02
28     uint8_t srcFlags;          // 0x09, phyp/opal
29     uint8_t numAsciiWords;     // 0x0a, phyp/opal
30     uint8_t numHexWords;       // 0x0b, phyp/opal
31     uint8_t hbFlags;           // 0x0c, hostboot only
32     uint8_t source;            // 0x0d, hostboot only
33     uint16_t lenSrc;           // 0x0e, phyp/opal
34     uint32_t srcWord12HbWord0; // 0x10, common
35     uint32_t srcWord13HbWord2; // 0x14, common (Word1 intentionally skipped)
36     uint32_t srcWord14HbWord3; // 0x18, common
37     uint32_t srcWord15HbWord4; // 0x1c, common
38     uint32_t srcWord16HbWord5; // 0x20, common
39     uint32_t srcWord17HbWord6; // 0x24, common
40     uint32_t srcWord18HbWord7; // 0x28, common
41     uint32_t srcWord19HbWord8; // 0x2c, common
42     uint32_t asciiData0;       // 0x30, phyp/opal, hostboot error_data
43     uint32_t asciiData1;       // 0x34, phyp/opal, hostboot EID
44     uint32_t asciiData2;       // 0x38, phyp/opal
45     uint32_t asciiData3;       // 0x3c, phyp/opal
46     uint32_t asciiData4;       // 0x40, phyp/opal
47     uint32_t asciiData5;       // 0x44, phyp/opal
48     uint32_t asciiData6;       // 0x48, phyp/opal
49     uint32_t asciiData7;       // 0x4c, phyp/opal
50     uint8_t location;          // 0x50, phyp/opal
51     uint8_t codeSection;       // 0x51, phyp/opal
52     uint8_t additionalSize;    // 0x52, phyp/opal
53     uint8_t andData;           // 0x53, phyp/opal
54 };
55 #pragma pack(pop)
56 
57 // TI info defines
58 constexpr uint8_t hbDumpFlag = 0x01;
59 constexpr uint8_t hbNotVisibleFlag = 0x02;
60 
61 // miscellaneous defines
62 constexpr uint8_t TI_WITH_PLID = 0x01;
63 constexpr uint8_t TI_WITH_SRC = 0x02;
64 constexpr uint8_t TI_WITH_EID = 0x03;
65 
66 // component ID's
67 constexpr uint16_t INITSVC_COMP_ID = 0x0500;
68 constexpr uint16_t PNOR_COMP_ID = 0x0600;
69 constexpr uint16_t HWAS_COMP_ID = 0x0C00;
70 constexpr uint16_t SECURE_COMP_ID = 0x1E00;
71 constexpr uint16_t TRBOOT_COMP_ID = 0x2B00;
72 
73 // HBFW::INITSERVICE::SHUTDOWNPREQUESTED_BY_FSP
74 constexpr uint16_t HB_SRC_SHUTDOWN_REQUEST = INITSVC_COMP_ID | 0x0b;
75 
76 // SHUTDOWN_KEY_TRANSITION
77 constexpr uint16_t HB_SRC_KEY_TRANSITION = INITSVC_COMP_ID | 0x15;
78 
79 // HBFW::HWAS::RC_SYSAVAIL_INSUFFICIENT_HW
80 constexpr uint16_t HB_SRC_INSUFFICIENT_HW = HWAS_COMP_ID | 0x04;
81 
82 // HBFW::TRUSTDBOOT::RC_TPM_NOFUNCTIONALTPM_FAIL
83 constexpr uint16_t HB_SRC_TPM_FAIL = TRBOOT_COMP_ID | 0xAD;
84 
85 // HBFW::SECUREBOOT::RC_ROM_VERIFY
86 constexpr uint16_t HB_SRC_ROM_VERIFY = SECURE_COMP_ID | 0x07;
87 
88 // HBFW::PNOR::RC_BASE_EXT_MISMATCH
89 constexpr uint16_t HB_SRC_EXT_MISMATCH = PNOR_COMP_ID | 0x2F;
90 
91 // HBFW::PNOR:RC_ECC_UE
92 constexpr uint16_t HB_SRC_ECC_UE = PNOR_COMP_ID | 0x0F;
93 
94 // HBFW::PNOR:RC_UNSUPPORTED_MODE
95 constexpr uint16_t HB_SRC_UNSUPPORTED_MODE = PNOR_COMP_ID | 0x0D;
96 
97 // HBFW::PNOR:RC_UNSUPPORTED_SFCRANGE
98 constexpr uint16_t HB_SRC_UNSUPPORTED_SFCRANGE = PNOR_COMP_ID | 0x0E;
99 
100 // HBFW::PNOR:RC_PARTITION_TABLE_INVALID
101 constexpr uint16_t HB_SRC_PARTITION_TABLE = PNOR_COMP_ID | 0x0C;
102 
103 // HBFW::PNOR:RC_UNSUPPORTED_HARDWARE
104 constexpr uint16_t HB_SRC_UNSUPPORTED_HARDWARE = PNOR_COMP_ID | 0x0A;
105 
106 // HBFW::PNOR:RC_PNOR_CORRUPTION
107 constexpr uint16_t HB_SRC_PNOR_CORRUPTION = PNOR_COMP_ID | 0x99;
108 
109 /** @brief Handle terminate immediate special attentions */
110 int tiHandler(TiDataArea* i_tiDataArea);
111 
112 /** @brief Handle phyp terminate immediately special attention */
113 void handlePhypTi(TiDataArea* i_tiDataArea);
114 
115 /** @brief Handle hostboot terminate immediately special attention */
116 void handleHbTi(TiDataArea* i_tiDataArea);
117 
118 /**
119  * @brief Parse TI info data as PHYP/OPAL data
120  *
121  * Read the TI data, parse as PHYP/OPAL data and place into map.
122  */
123 void parsePhypOpalTiInfo(std::map<std::string, std::string>& i_map,
124                          TiDataArea* i_tiDataArea);
125 
126 /**
127  * @brief Parse TI info data as hostboot data
128  *
129  * Read the TI data, parse as hostboot data and place into map.
130  */
131 void parseHbTiInfo(std::map<std::string, std::string>& i_map,
132                    TiDataArea* i_tiDataArea);
133 
134 constexpr uint8_t defaultPhypTiInfo[0x58] = {
135     0x01, 0xa1, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00,
136     0x09, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139     0x00, 0x00, 0x00, 0x00, 0x42, 0x37, 0x30, 0x30, 0x46, 0x46, 0x46,
140     0x46, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
141     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
142     0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
143 
144 constexpr uint8_t defaultHbTiInfo[0x58] = {
145     0x01, 0xa1, 0x02, 0xa8, 0x00, TI_WITH_SRC, 0x00, 0x00, 0x00, 0x00, 0x00,
146     0x09, 0x01, 0x00, 0x00, 0x00, 0xbc,        0x80, 0x1b, 0x99, 0x00, 0x00,
147     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00,
148     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00,
149     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00,
150     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00,
151     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00,
152     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00};
153 
154 } // namespace attn
155