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 hbDumpFlag; // 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 // miscellaneous defines 58 constexpr uint8_t TI_WITH_PLID = 0x01; 59 constexpr uint8_t TI_WITH_SRC = 0x02; 60 constexpr uint8_t TI_WITH_EID = 0x03; 61 62 // component ID's 63 constexpr uint16_t INITSVC_COMP_ID = 0x0500; 64 constexpr uint16_t PNOR_COMP_ID = 0x0600; 65 constexpr uint16_t HWAS_COMP_ID = 0x0C00; 66 constexpr uint16_t SECURE_COMP_ID = 0x1E00; 67 constexpr uint16_t TRBOOT_COMP_ID = 0x2B00; 68 69 // HBFW::INITSERVICE::SHUTDOWNPREQUESTED_BY_FSP 70 constexpr uint16_t HB_SRC_SHUTDOWN_REQUEST = INITSVC_COMP_ID | 0x0b; 71 72 // SHUTDOWN_KEY_TRANSITION 73 constexpr uint16_t HB_SRC_KEY_TRANSITION = INITSVC_COMP_ID | 0x15; 74 75 // HBFW::HWAS::RC_SYSAVAIL_INSUFFICIENT_HW 76 constexpr uint16_t HB_SRC_INSUFFICIENT_HW = HWAS_COMP_ID | 0x04; 77 78 // HBFW::TRUSTDBOOT::RC_TPM_NOFUNCTIONALTPM_FAIL 79 constexpr uint16_t HB_SRC_TPM_FAIL = TRBOOT_COMP_ID | 0xAD; 80 81 // HBFW::SECUREBOOT::RC_ROM_VERIFY 82 constexpr uint16_t HB_SRC_ROM_VERIFY = SECURE_COMP_ID | 0x07; 83 84 // HBFW::PNOR::RC_BASE_EXT_MISMATCH 85 constexpr uint16_t HB_SRC_EXT_MISMATCH = PNOR_COMP_ID | 0x2F; 86 87 // HBFW::PNOR:RC_ECC_UE 88 constexpr uint16_t HB_SRC_ECC_UE = PNOR_COMP_ID | 0x0F; 89 90 // HBFW::PNOR:RC_UNSUPPORTED_MODE 91 constexpr uint16_t HB_SRC_UNSUPPORTED_MODE = PNOR_COMP_ID | 0x0D; 92 93 // HBFW::PNOR:RC_UNSUPPORTED_SFCRANGE 94 constexpr uint16_t HB_SRC_UNSUPPORTED_SFCRANGE = PNOR_COMP_ID | 0x0E; 95 96 // HBFW::PNOR:RC_PARTITION_TABLE_INVALID 97 constexpr uint16_t HB_SRC_PARTITION_TABLE = PNOR_COMP_ID | 0x0C; 98 99 // HBFW::PNOR:RC_UNSUPPORTED_HARDWARE 100 constexpr uint16_t HB_SRC_UNSUPPORTED_HARDWARE = PNOR_COMP_ID | 0x0A; 101 102 // HBFW::PNOR:RC_PNOR_CORRUPTION 103 constexpr uint16_t HB_SRC_PNOR_CORRUPTION = PNOR_COMP_ID | 0x99; 104 105 /** @brief Handle terminate immediate special attentions */ 106 int tiHandler(TiDataArea* i_tiDataArea); 107 108 /** @brief Handle phyp terminate immediately special attention */ 109 void handlePhypTi(TiDataArea* i_tiDataArea); 110 111 /** @brief Handle hostboot terminate immediately special attention */ 112 void handleHbTi(TiDataArea* i_tiDataArea); 113 114 /** 115 * @brief Parse TI info data as PHYP/OPAL data 116 * 117 * Read the TI data, parse as PHYP/OPAL data and place into map. 118 */ 119 void parsePhypOpalTiInfo(std::map<std::string, std::string>& i_map, 120 TiDataArea* i_tiDataArea); 121 122 /** 123 * @brief Parse TI info data as hostboot data 124 * 125 * Read the TI data, parse as hostboot data and place into map. 126 */ 127 void parseHbTiInfo(std::map<std::string, std::string>& i_map, 128 TiDataArea* i_tiDataArea); 129 130 constexpr uint8_t defaultPhypTiInfo[0x58] = { 131 0x01, 0xa1, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 132 0x09, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 0x00, 0x00, 0x00, 0x00, 0x42, 0x37, 0x30, 0x30, 0x46, 0x46, 0x46, 136 0x46, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 137 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 138 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 139 140 constexpr uint8_t defaultHbTiInfo[0x58] = { 141 0x01, 0xa1, 0x02, 0xa8, 0x00, TI_WITH_SRC, 0x00, 0x00, 0x00, 0x00, 0x00, 142 0x09, 0x01, 0x00, 0x00, 0x00, 0xbc, 0x80, 0x1b, 0x99, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 150 } // namespace attn 151