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 /**
128  * Request a dump from the dump manager
129  *
130  * Request a dump from the dump manager and register a monitor for observing
131  * the dump progress.
132  *
133  * @param logId The id of the event log associated with this dump request
134  */
135 void requestDump(const uint32_t logId);
136 
137 } // namespace attn
138