There is a call to PeiServiceAllocatePage() that passes in address of a pointer 
(IA32 sizeof (VOID *) == 4), but it casts this to a pointer to 
EFI_PHYSICAL_ADDRESS that is always UINT64. This means that 4 bytes of the 
stack are overwritten. 

https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c
  X64_IDT_TABLE             *IdtTableForX64;
    Status = PeiServicesAllocatePages (
               EfiBootServicesData,
               EFI_SIZE_TO_PAGES(sizeof (X64_IDT_TABLE) + SizeOfTemplate * 
IDT_ENTRY_COUNT),
               (EFI_PHYSICAL_ADDRESS *) &IdtTableForX64
               );
It should be:
IdtTableForX64 = AllocatePages (EFI_SIZE_TO_PAGES(sizeof (X64_IDT_TABLE) + 
SizeOfTemplate * IDT_ENTRY_COUNT));
I don’t think the bug causes any detectable error, since it is likely that 
Index is being over written, and it is set later in the function.

Thanks,

Andrew Fish

PS Also does it make sense for the DXE IPL to init a vector table? It looks 
like there are only 1 library call, GetNextGuidHob(), prior to the DXE Core 
calling InitializeCpuExceptionHandlers(). So it seems like the window to catch 
a bug is very small. There could always be a version of CpuExecptionHandlerLIb 
that just does the imp $ (imp .). 


https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
VOID
EFIAPI
DxeMain (
  IN  VOID *HobStart
  )
{
  EFI_STATUS                    Status;
  EFI_PHYSICAL_ADDRESS          MemoryBaseAddress;
  UINT64                        MemoryLength;
  PE_COFF_LOADER_IMAGE_CONTEXT  ImageContext;
  UINTN                         Index;
  EFI_HOB_GUID_TYPE             *GuidHob;
  EFI_VECTOR_HANDOFF_INFO       *VectorInfoList;
  EFI_VECTOR_HANDOFF_INFO       *VectorInfo;

  //
  // Setup the default exception handlers
  //
  VectorInfoList = NULL;
  GuidHob = GetNextGuidHob (&gEfiVectorHandoffInfoPpiGuid, HobStart);
  if (GuidHob != NULL) {
    VectorInfoList = (EFI_VECTOR_HANDOFF_INFO *) (GET_GUID_HOB_DATA(GuidHob));
  }
  Status = InitializeCpuExceptionHandlers (VectorInfoList);
  ASSERT_EFI_ERROR (Status);

------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to