kasunath | a1a69f1 | 2022-05-27 14:31:38 -0700 | [diff] [blame] | 1 | #pragma once |
| 2 | |
| 3 | #include <cstdint> |
| 4 | #include <memory> |
| 5 | #include <optional> |
| 6 | #include <span> |
| 7 | #include <unordered_map> |
| 8 | #include <vector> |
| 9 | |
| 10 | namespace bios_bmc_smm_error_logger |
| 11 | { |
| 12 | namespace rde |
| 13 | { |
| 14 | |
| 15 | /** |
| 16 | * @brief Resource ID for the annotation dictionary. The other entity |
| 17 | * communicating with the BMC (Eg: BIOS) should use the same resource ID for the |
| 18 | * annotation dictionary. |
| 19 | */ |
| 20 | constexpr uint32_t annotationResourceId = 0; |
| 21 | |
| 22 | /** |
| 23 | * @brief Holds an RDE BEJ dictionary entry. |
| 24 | */ |
| 25 | struct DictionaryEntry |
| 26 | { |
| 27 | DictionaryEntry(bool valid, const std::span<const uint8_t> data) : |
| 28 | valid(valid), data(data.begin(), data.end()) |
| 29 | {} |
| 30 | // True indicates that the dictionary data is ready to be used. |
| 31 | bool valid; |
| 32 | std::vector<uint8_t> data; |
| 33 | }; |
| 34 | |
| 35 | /** |
| 36 | * @brief Manages RDE BEJ dictionaries. |
| 37 | */ |
| 38 | class DictionaryManager |
| 39 | { |
| 40 | public: |
| 41 | DictionaryManager(); |
| 42 | |
| 43 | /** |
| 44 | * @brief Starts a dictionary entry with the provided data. |
| 45 | * |
| 46 | * @param[in] resourceId - PDR resource id corresponding to the dictionary. |
| 47 | * @param[in] data - dictionary data. |
| 48 | */ |
| 49 | void startDictionaryEntry(uint32_t resourceId, |
| 50 | const std::span<const uint8_t> data); |
| 51 | |
| 52 | /** |
| 53 | * @brief Set the dictionary valid status. Until this is called, dictionary |
| 54 | * data is considered to be incomplete for use. |
| 55 | * |
| 56 | * @param[in] resourceId - PDR resource id corresponding to the dictionary. |
| 57 | * @return true if successful. |
| 58 | */ |
| 59 | bool markDataComplete(uint32_t resourceId); |
| 60 | |
| 61 | /** |
| 62 | * @brief Add more dictionary data for an existing entry. Adding data to a |
| 63 | * completed dictionary will mark the dictionary as incomplete. |
| 64 | * |
| 65 | * @param[in] resourceId - PDR resource id corresponding to the dictionary. |
| 66 | * @param[in] data - dictionary data. |
| 67 | * @return true if successful. |
| 68 | */ |
| 69 | bool addDictionaryData(uint32_t resourceId, |
| 70 | const std::span<const uint8_t> data); |
| 71 | |
| 72 | /** |
| 73 | * @brief Get a dictionary. |
| 74 | * |
| 75 | * @param[in] resourceId - PDR resource id corresponding to the dictionary. |
| 76 | * @return a pointer to the dictionary, if the dictionary is complete else |
| 77 | * std::nullopt. |
| 78 | */ |
| 79 | std::optional<std::span<const uint8_t>> getDictionary(uint32_t resourceId); |
| 80 | |
| 81 | /** |
| 82 | * @brief Get the annotation dictionary. |
| 83 | * |
| 84 | * @return a pointer to the annotation dictionary, if the dictionary is |
| 85 | * complete else std::nullopt. |
| 86 | */ |
| 87 | std::optional<std::span<const uint8_t>> getAnnotationDictionary(); |
| 88 | |
| 89 | /** |
| 90 | * @brief Get the completed dictionary count. |
| 91 | * |
| 92 | * @return number of completed dictionaries available. |
| 93 | */ |
| 94 | uint32_t getDictionaryCount(); |
| 95 | |
| 96 | /** |
| 97 | * @brief Invalidate all dictionaries. |
| 98 | */ |
| 99 | void invalidateDictionaries(); |
| 100 | |
| 101 | private: |
| 102 | uint32_t validDictionaryCount; |
| 103 | std::unordered_map<uint32_t, std::unique_ptr<DictionaryEntry>> dictionaries; |
| 104 | |
| 105 | /** |
| 106 | * @brief Set a dictionary entry to be invalid and reduce the valid |
| 107 | * dictionary count. |
| 108 | * |
| 109 | * @param[in] entry - A dictionary entry. |
| 110 | */ |
| 111 | void invalidateDictionaryEntry(DictionaryEntry& entry); |
| 112 | |
| 113 | /** |
| 114 | * @brief Set the dictionary entry valid flag and increase the valid |
| 115 | * dictionary count. |
| 116 | * |
| 117 | * @param[in] entry - A dictionary entry. |
| 118 | */ |
| 119 | void validateDictionaryEntry(DictionaryEntry& entry); |
| 120 | }; |
| 121 | |
| 122 | } // namespace rde |
| 123 | } // namespace bios_bmc_smm_error_logger |