Sorry. For some reason, I didn't get to read the paragraph about TemporaryRamSupportPpi and shomehow skipped to the PS. I suppose my hint is not related to the crash then, though I hope it was still helpful in some way, as it seems to assume that the PPI List is in the temporary heap nevertheless.
Regards, Marvin. > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Marvin H?user > Sent: Saturday, August 13, 2016 3:47 AM > To: edk2-devel@lists.01.org > Cc: Andrew Fish <af...@apple.com> > Subject: Re: [edk2] [MdeModulePkg][PeiCore] I seemed to have crashed the > PEI Core by grabbing memory from PeiTemporaryRamBase? > > Hello Andrew, > > Unfortunately I cannot test anything right now and I don't have a whole lot of > knowledge in this area, though I might have a hint for you. > > While PpiList is equal to the original TempRam base, the TempRam based > passed to PEI is equal to the original TempRam base + the size of the PpiList, > hence PpiList is smaller than the base address passed to PEI. The PpiList is > then installed via the PeiServicesInstallPpi () function: > > call: > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > PeiMain/PeiMain.c#L386 > implementation: > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > Ppi/Ppi.c#L183 > > The list is then added to PpiData.PpiListPtrs. > > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > Ppi/Ppi.c#L229 > > I am not sure at which point of time you are experiencing the crash, but after > permanent memory is available, ConvertPpiPointers () is called, which then > calls ConverSinglePpiPointer () for old heap, old stack and old hole (I'm > afraid > I do not know what TempRam Hole is and if it is related). > > ConvertPpiPointers () call: > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > PeiMain/PeiMain.c#L237 > Old Heap ConverSinglePpiPointer () call: > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > Ppi/Ppi.c#L127 > > The call for the old heap conversion passes the TempRam base, which has > been incremented as we know, and thus the comparison to TempBottom will > fail, as TempBottom is PeiTemporaryRamBase, which is larger than PpiList, > which is one of the items in PpiListPtrs, which is the object of the > conversion. > > comparison to TempBottom: > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > Ppi/Ppi.c#L60 > > As the pointer to the PpiList passed by SecCore is probably not converted as > detailed above, I assume something post-mem attempts to access this > former PpiList by the old temporary RAM address and that somehow causes > trouble; I assume the SEC PpiList being part of the PEI memory is an > assumption made by the person who wrote this code. I'm not sure about > why it crashes, as I do not know the entire PEI control flow, though I hope > this can help you in some way. > > Please excuse me if I have made a mistake in understanding the referenced > code and wasted your time. > > Regards, > Marvin. > > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > > Andrew Fish > > Sent: Saturday, August 13, 2016 1:25 AM > > To: edk2-devel <edk2-devel@lists.01.org> > > Subject: [edk2] [MdeModulePkg][PeiCore] I seemed to have crashed the > > PEI Core by grabbing memory from PeiTemporaryRamBase? > > > > I grabbed some memory between SEC and the PEI Core by adjusting > > SecCoreData-> PeiTemporaryRamBase and SecCoreData-> > > PeiTemporaryRamSize. > > > > When looking at the code I don't really understand the logic of the > algorithm? > > So maybe I'm doing something wrong. > > > > This adjustment does not seem right to me? > > > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > > Dispatcher/Dispatcher.c#L768 > > // > > // Heap Offset > > // > > BaseOfNewHeap = TopOfNewStack; > > if (BaseOfNewHeap >= (UINTN)SecCoreData->PeiTemporaryRamBase) { > > Private->HeapOffsetPositive = TRUE; > > Private->HeapOffset = (UINTN)(BaseOfNewHeap - > > (UINTN)SecCoreData->PeiTemporaryRamBase); > > } else { > > Private->HeapOffsetPositive = FALSE; > > Private->HeapOffset = (UINTN)((UINTN)SecCoreData- > > >PeiTemporaryRamBase - BaseOfNewHeap); > > } > > > > > > The above code seems to be making a very strange adjustment. I noticed > > the adjustment in my failing case was off by 0xC0 which is the amount > > of memory I carved out prior to entering the PEI Core. > > > > > https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Pei/ > > Dispatcher/Dispatcher.c#L796 > > > > // > > // Temporary Ram Support PPI is provided by platform, it will copy > > // temporary memory to permenent memory and do stack switching. > > // After invoking Temporary Ram Support PPI, the following code's > > // stack is in permanent memory. > > // > > TemporaryRamSupportPpi->TemporaryRamMigration ( > > PeiServices, > > TemporaryRamBase, > > > > (EFI_PHYSICAL_ADDRESS)(UINTN)(TopOfNewStack - TemporaryStackSize), > > TemporaryRamSize > > ); > > > > > > And this is also a case in which the stack got bigger. But it seems to > > me the shift if really defined by TemporaryRamBase, TopOfNewStack, and > > TemporaryStackSize in this case. > > > > The failure I hit was OldCoreData->Fv pointer was shifted so when the > > PPI was called the system crashed. Is this a bug in the > > gEfiTemporaryRamSupportPpiGuid path? > > > > If I changed the HeadOffset algorithm my crash went away? Private- > > >HeapOffset = ((UINTN)TopOfNewStack - TemporaryStackSize) - > > TemporaryRamBase; > > > > Thanks, > > > > Andrew Fish > > > > PS My failure case was the EmulatorPkg. I've not had a chance to > > verify this failure in the open source yet, but I'm guessing reversing > > this #if will make it happen. > > > > > > > https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Sec/Sec.c#L1 > > 07 > > > > #if 0 > > // Tell the PEI Core to not use our buffer in temp RAM > > SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData- > > >PeiTemporaryRamBase; > > SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData- > > >PeiTemporaryRamBase + SecReseveredMemorySize); > > SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize; #else > > { > > // > > // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core > > crashes? Either there is a bug > > // or I don't understand temp RAM correctly? > > // > > EFI_PEI_PPI_DESCRIPTOR PpiArray[10]; > > > > SecPpiList = &PpiArray[0]; > > ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize); > > } > > #endif > > > > > > > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel