Signed-off-by: Guo Dong <[email protected]>
---
CorebootModulePkg/Include/Coreboot.h | 19 ++++++++++++
CorebootModulePkg/Library/CbParseLib/CbParseLib.c | 38 ++++++++++++++++++-----
2 files changed, 49 insertions(+), 8 deletions(-)
diff --git a/CorebootModulePkg/Include/Coreboot.h
b/CorebootModulePkg/Include/Coreboot.h
index 703c034..a256d50 100644
--- a/CorebootModulePkg/Include/Coreboot.h
+++ b/CorebootModulePkg/Include/Coreboot.h
@@ -49,10 +49,13 @@
#pragma warning( disable : 4200 )
#endif
#define DYN_CBMEM_ALIGN_SIZE (4096)
+#define IMD_ENTRY_MAGIC (~0xC0389481)
+#define CBMEM_ENTRY_MAGIC (~0xC0389479)
+
struct cbmem_entry {
UINT32 magic;
UINT32 start;
UINT32 size;
UINT32 id;
@@ -64,10 +67,26 @@ struct cbmem_root {
UINT32 locked;
UINT32 size;
struct cbmem_entry entries[0];
};
+struct imd_entry {
+ UINT32 magic;
+ UINT32 start_offset;
+ UINT32 size;
+ UINT32 id;
+};
+
+struct imd_root {
+ UINT32 max_entries;
+ UINT32 num_entries;
+ UINT32 flags;
+ UINT32 entry_align;
+ UINT32 max_offset;
+ struct imd_entry entries[0];
+};
+
struct cbuint64 {
UINT32 lo;
UINT32 hi;
};
diff --git a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
index c9b39b1..0f82b01 100644
--- a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
+++ b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
@@ -124,26 +124,48 @@ FindCbTag (
return TagPtr;
}
RETURN_STATUS
FindCbMemTable (
- struct cbmem_root *root,
+ IN struct cbmem_root *Root,
IN UINT32 TableId,
IN VOID** pMemTable,
IN UINT32* pMemTableSize
)
{
- UINTN Idx;
+ UINTN Idx;
+ BOOLEAN IsImdEntry;
+ struct cbmem_entry *Entries;
- if ((!root) || (!pMemTable))
+ if ((!Root) || (!pMemTable))
return RETURN_INVALID_PARAMETER;
- for (Idx = 0; Idx < root->num_entries; Idx++) {
- if (root->entries[Idx].id == TableId) {
- *pMemTable = (VOID *) (UINTN)root->entries[Idx].start;
- if (pMemTableSize)
- *pMemTableSize = root->entries[Idx].size;
+ //
+ // Check if the entry is CBMEM or IMD
+ // and handle them separately
+ //
+ Entries = Root->entries;
+ if (Entries[0].magic == CBMEM_ENTRY_MAGIC) {
+ IsImdEntry = FALSE;
+ } else {
+ Entries = (struct cbmem_entry *)((struct imd_root *)Root)->entries;
+ if (Entries[0].magic == IMD_ENTRY_MAGIC) {
+ IsImdEntry = TRUE;
+ } else {
+ return RETURN_NOT_FOUND;
+ }
+ }
+
+ for (Idx = 0; Idx < Root->num_entries; Idx++) {
+ if (Entries[Idx].id == TableId) {
+ if (IsImdEntry) {
+ *pMemTable = (VOID *) ((UINTN)Entries[Idx].start + (UINTN)Root);
+ } else {
+ *pMemTable = (VOID *) (UINTN)Entries[Idx].start;
+ }
+ if (pMemTableSize)
+ *pMemTableSize = Entries[Idx].size;
DEBUG ((EFI_D_ERROR, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n",
TableId, *pMemTable, *pMemTableSize));
return RETURN_SUCCESS;
}
}
--
1.9.5.msysgit.0
------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel