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