Looks good. Reviewed-by: Maurice Ma <maurice...@intel.com> -----Original Message----- From: Guo Dong [mailto:guo.d...@intel.com] Sent: Monday, May 18, 2015 11:38 PM To: edk2-devel@lists.sourceforge.net Subject: [edk2] [Patch 1/2] CorebootModulePkg/CbParseLib: Support current coreboot IMD
The latest coreboot use IMD (In Memory Database) to report Tables. This patch adds IMD support in UEFI payload. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Dong <guo.d...@intel.com> --- CorebootModulePkg/Include/Coreboot.h | 21 ++++++++- CorebootModulePkg/Library/CbParseLib/CbParseLib.c | 52 +++++++++++++++++------ 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/CorebootModulePkg/Include/Coreboot.h b/CorebootModulePkg/Include/Coreboot.h index 703c034..f2f18be 100644 --- a/CorebootModulePkg/Include/Coreboot.h +++ b/CorebootModulePkg/Include/Coreboot.h @@ -1,9 +1,9 @@ /** @file Coreboot PEI module include file. - Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2014 - 2015, Intel Corporation. All rights + reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -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..56c8472 100644 --- a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c +++ b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c @@ -1,10 +1,10 @@ /** @file This library will parse the coreboot table in memory and extract those required information. - Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2014 - 2015, Intel Corporation. All rights + reserved.<BR> This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php @@ -124,28 +124,52 @@ FindCbTag ( return TagPtr; } RETURN_STATUS FindCbMemTable ( - struct cbmem_root *root, - IN UINT32 TableId, - IN VOID** pMemTable, - IN UINT32* pMemTableSize + IN struct cbmem_root *Root, + IN UINT32 TableId, + OUT VOID **pMemTable, + OUT UINT32 *pMemTableSize ) { - UINTN Idx; + UINTN Idx; + BOOLEAN IsImdEntry; + struct cbmem_entry *Entries; - if ((!root) || (!pMemTable)) - return RETURN_INVALID_PARAMETER; + if ((Root == NULL) || (pMemTable == NULL)) { + 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 != NULL) { + *pMemTableSize = Entries[Idx].size; + } - DEBUG ((EFI_D_ERROR, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n", TableId, *pMemTable, *pMemTableSize)); + DEBUG ((EFI_D_INFO, "Find CbMemTable Id 0x%x, base %p, size + 0x%x\n", TableId, *pMemTable, *pMemTableSize)); return RETURN_SUCCESS; } } return RETURN_NOT_FOUND; -- 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 edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ 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 edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel