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