Hi Ard,

Sorry for the late. We tested the patch and it worked. Would you help to post it to EDK2?

Thanks and regards,

Heyi

On 22 October 2016 at 17:57, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
On 22 October 2016 at 09:28, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 22 October 2016 at 09:09, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> On 22 October 2016 at 04:21, Heyi Guo <heyi.guo@linaro.org> wrote:
>>> Hi folks,
>>>
>>> We are still using PrePi on some of our platforms and the code is still
>>> running on Flash at this stage. We found there is global data write in
>>> ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S. The change was introduced
>>> by this commit: 5dbacdb21b59748e885c2eccae370b81271ab795:
>>>
>>> +mSystemMemoryEnd:  .8byte 0^M
>>>
>>>  ASM_PFX(_ModuleEntryPoint):
>>>    // Do early platform specific actions
>>> @@ -40,12 +42,23 @@ _SetSVCMode:
>>>  // Check if we can install the stack at the top of the System Memory or if
>>> we need
>>>  // to install the stacks at the bottom of the Firmware Device (case the FD
>>> is located
>>>  // at the top of the DRAM)
>>> -_SetupStackPosition:
>>> -  // Compute Top of System Memory
>>> -  LoadConstantToReg (FixedPcdGet64 (PcdSystemMemoryBase), x1)
>>> -  LoadConstantToReg (FixedPcdGet64 (PcdSystemMemorySize), x2)
>>> +_SystemMemoryEndInit:^M
>>> +  ldr   x1, mSystemMemoryEnd^M
>>> +^M
>>> +  // Is mSystemMemoryEnd initialized?^M
>>> +  cmp   x1, #0^M
>>> +  bne   _SetupStackPosition^M
>>> +^M
>>> +  LoadConstantToReg (FixedPcdGet32(PcdSystemMemoryBase), x1)^M
>>> +  LoadConstantToReg (FixedPcdGet32(PcdSystemMemorySize), x2)^M
>>>    sub   x2, x2, #1
>>> -  add   x1, x1, x2      // x1 = SystemMemoryTop = PcdSystemMemoryBase +
>>> PcdSystemMemorySize
>>> +  add   x1, x1, x2^M
>>> +  // Update the global variable^M
>>> +  adr   x2, mSystemMemoryEnd^M
>>> +  str   x1, [x2]^M
>>>
>>> I think direct write to flash should be forbidden. This change may work well
>>> for platforms which use ATF and load PrePi into memory, but not for other
>>> platforms.
>>>
>>> Please let me know your comments about this.
>>>
>>
>> You are right. This should be removed. I think it was added for ATF on
>> Juno, but obviously, this is not the right way to do it, given that
>> SEC and PEIM modules may run from NOR.
>
> Does this work for you?
>
> --- a/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S
> +++ b/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S
> @@ -28,18 +28,6 @@ _SetSVCMode:
>  // Check if we can install the stack at the top of the System Memory
> or if we need
>  // to install the stacks at the bottom of the Firmware Device (case
> the FD is located
>  // at the top of the DRAM)
> -_SystemMemoryEndInit:
> -  ldr   x1, mSystemMemoryEnd

We need to keep this load

> -
> -  // Is mSystemMemoryEnd initialized?
> -  cmp   x1, #0
> -  bne   _SetupStackPosition
> -
> -  MOV64 (x1, FixedPcdGet64(PcdSystemMemoryBase) +
> FixedPcdGet64(PcdSystemMemorySize) - 1)
> -
> -  // Update the global variable
> -  adr   x2, mSystemMemoryEnd
> -  str   x1, [x2]
>
>  _SetupStackPosition:
>    // r1 = SystemMemoryTop
> @@ -130,4 +118,5 @@ _PrepareArguments:
>  _NeverReturn:
>    b _NeverReturn
>
> -ASM_PFX(mSystemMemoryEnd):    .8byte 0
> +ASM_PFX(mSystemMemoryEnd):
> +  .8byte FixedPcdGet64(PcdSystemMemoryBase) +
> FixedPcdGet64(PcdSystemMemorySize) - 1