* [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3
@ 2019-06-05 5:49 Ni, Ray
2019-06-05 5:49 ` [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig Ni, Ray
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Ni, Ray @ 2019-06-05 5:49 UTC (permalink / raw)
To: devel
v2:
Answer Laszlo's comments:
1. Add 1/2 patch to change IA32 waking up vector assembly code to increase
NumApsExecuting only for ApInitConfig.
2. Change 2/2 patch to remove the unnecessary debug messages.
Ray Ni (2):
UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig
UefiCpuPkg/MpInitLib: Decrease NumApsExecuting only for ApInitConfig
UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 14 +++++++-------
UefiCpuPkg/Library/MpInitLib/MpLib.c | 5 +++--
2 files changed, 10 insertions(+), 9 deletions(-)
--
2.21.0.windows.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig
2019-06-05 5:49 [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Ni, Ray
@ 2019-06-05 5:49 ` Ni, Ray
2019-06-10 2:37 ` Dong, Eric
2019-06-05 5:49 ` [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease " Ni, Ray
2019-06-05 11:25 ` [edk2-devel] [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Laszlo Ersek
2 siblings, 1 reply; 6+ messages in thread
From: Ni, Ray @ 2019-06-05 5:49 UTC (permalink / raw)
To: devel; +Cc: Laszlo Ersek, Eric Dong
NumApsExecuting is only used when InitFlag == ApInitConfig for
counting the processor count.
The patch changes Ia32 version of waking up vector assembly code
to align to x64 version of waking up vector assembly code.
After the change both versions of waking up vector increase
NumApsExecuting when InitFlag == ApInitConfig.
Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Eric Dong <eric.dong@intel.com>
---
UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
index 34b8705adb..b74046b76a 100644
--- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
@@ -1,5 +1,5 @@
;------------------------------------------------------------------------------ ;
-; Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
+; Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
; Module Name:
@@ -81,12 +81,6 @@ Flat32Start: ; protected mode entry point
mov esi, ebx
- ; Increment the number of APs executing here as early as possible
- ; This is decremented in C code when AP is finished executing
- mov edi, esi
- add edi, NumApsExecutingLocation
- lock inc dword [edi]
-
mov edi, esi
add edi, EnableExecuteDisableLocation
cmp byte [edi], 0
@@ -120,6 +114,12 @@ SkipEnableExecuteDisable:
cmp dword [edi], 1 ; 1 == ApInitConfig
jnz GetApicId
+ ; Increment the number of APs executing here as early as possible
+ ; This is decremented in C code when AP is finished executing
+ mov edi, esi
+ add edi, NumApsExecutingLocation
+ lock inc dword [edi]
+
; AP init
mov edi, esi
add edi, LockLocation
--
2.21.0.windows.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease NumApsExecuting only for ApInitConfig
2019-06-05 5:49 [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Ni, Ray
2019-06-05 5:49 ` [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig Ni, Ray
@ 2019-06-05 5:49 ` Ni, Ray
2019-06-10 2:38 ` Dong, Eric
2019-06-05 11:25 ` [edk2-devel] [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Laszlo Ersek
2 siblings, 1 reply; 6+ messages in thread
From: Ni, Ray @ 2019-06-05 5:49 UTC (permalink / raw)
To: devel; +Cc: Eric Dong, Nandagopal Sathyanarayanan
The patch fixes the bug that the memory under 1MB is modified by
firmware in S3 boot.
Root cause is a racing condition in MpInitLib:
1. BSP: WakeUpByInitSipiSipi is set by NotifyOnS3SmmInitDonePpi()
2. BSP: WakeUpAP() wakes all APs to run certain procedure.
2.1. AllocateResetVector() uses <1MB memory for wake up vector.
2.1. FillExchangeInfoData() resets NumApsExecuting to 0.
2.2. WaitApWakeup() waits AP to clear WAKEUP_AP_SIGNAL.
3. AP: ApWakeupFunction() clears WAKEUP_AP_SIGNAL to inform BSP.
5. BSP: FreeResetVector() restores the <1MB memory
4. AP: ApWakeupFunction() calls the certain procedure.
4.1. NumApsExecuting is decreased.
#4.1 happens after the 1MB memory is restored so the result is
memory below 1MB is changed by #4.1
It happens only when the AP executes procedure a bit longer.
AP returns back to ApWakeupFunction() from procedure after
BSP restores the <1MB memory.
Since NumApsExecuting is only used when InitFlag == ApInitConfig
for counting the processor count.
The patch moves the NumApsExecuting decrease to the path when
InitFlag == ApInitConfig.
Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Nandagopal Sathyanarayanan <nandagopal.sathyanarayanan@intel.com>
---
UefiCpuPkg/Library/MpInitLib/MpLib.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 3337488892..6f51bc4ebf 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -1,7 +1,7 @@
/** @file
CPU MP Initialize Library common functions.
- Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -619,6 +619,8 @@ ApWakeupFunction (
RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters, FALSE);
InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack);
ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal;
+
+ InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
} else {
//
// Execute AP function if AP is ready
@@ -698,7 +700,6 @@ ApWakeupFunction (
// AP finished executing C code
//
InterlockedIncrement ((UINT32 *) &CpuMpData->FinishedCount);
- InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
//
// Place AP is specified loop mode
--
2.21.0.windows.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3
2019-06-05 5:49 [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Ni, Ray
2019-06-05 5:49 ` [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig Ni, Ray
2019-06-05 5:49 ` [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease " Ni, Ray
@ 2019-06-05 11:25 ` Laszlo Ersek
2 siblings, 0 replies; 6+ messages in thread
From: Laszlo Ersek @ 2019-06-05 11:25 UTC (permalink / raw)
To: devel, ray.ni
On 06/05/19 07:49, Ni, Ray wrote:
> v2:
> Answer Laszlo's comments:
> 1. Add 1/2 patch to change IA32 waking up vector assembly code to increase
> NumApsExecuting only for ApInitConfig.
> 2. Change 2/2 patch to remove the unnecessary debug messages.
>
> Ray Ni (2):
> UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig
> UefiCpuPkg/MpInitLib: Decrease NumApsExecuting only for ApInitConfig
>
> UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 14 +++++++-------
> UefiCpuPkg/Library/MpInitLib/MpLib.c | 5 +++--
> 2 files changed, 10 insertions(+), 9 deletions(-)
>
For the series:
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Thanks,
Laszlo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig
2019-06-05 5:49 ` [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig Ni, Ray
@ 2019-06-10 2:37 ` Dong, Eric
0 siblings, 0 replies; 6+ messages in thread
From: Dong, Eric @ 2019-06-10 2:37 UTC (permalink / raw)
To: Ni, Ray, devel@edk2.groups.io; +Cc: Laszlo Ersek
Reviewed-by: Eric Dong <eric.dong@intel.com>
> -----Original Message-----
> From: Ni, Ray
> Sent: Wednesday, June 5, 2019 1:49 PM
> To: devel@edk2.groups.io
> Cc: Laszlo Ersek <lersek@redhat.com>; Dong, Eric <eric.dong@intel.com>
> Subject: [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting
> only for ApInitConfig
>
> NumApsExecuting is only used when InitFlag == ApInitConfig for counting the
> processor count.
>
> The patch changes Ia32 version of waking up vector assembly code to align to
> x64 version of waking up vector assembly code.
> After the change both versions of waking up vector increase
> NumApsExecuting when InitFlag == ApInitConfig.
>
> Signed-off-by: Ray Ni <ray.ni@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Eric Dong <eric.dong@intel.com>
> ---
> UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> index 34b8705adb..b74046b76a 100644
> --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
> @@ -1,5 +1,5 @@
> ;------------------------------------------------------------------------------ ; -;
> Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
> +; Copyright (c) 2015 - 2019, Intel Corporation. All rights
> +reserved.<BR>
> ; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Module Name:
> @@ -81,12 +81,6 @@ Flat32Start: ; protected mode entry
> point
>
> mov esi, ebx
>
> - ; Increment the number of APs executing here as early as possible
> - ; This is decremented in C code when AP is finished executing
> - mov edi, esi
> - add edi, NumApsExecutingLocation
> - lock inc dword [edi]
> -
> mov edi, esi
> add edi, EnableExecuteDisableLocation
> cmp byte [edi], 0
> @@ -120,6 +114,12 @@ SkipEnableExecuteDisable:
> cmp dword [edi], 1 ; 1 == ApInitConfig
> jnz GetApicId
>
> + ; Increment the number of APs executing here as early as possible
> + ; This is decremented in C code when AP is finished executing
> + mov edi, esi
> + add edi, NumApsExecutingLocation
> + lock inc dword [edi]
> +
> ; AP init
> mov edi, esi
> add edi, LockLocation
> --
> 2.21.0.windows.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease NumApsExecuting only for ApInitConfig
2019-06-05 5:49 ` [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease " Ni, Ray
@ 2019-06-10 2:38 ` Dong, Eric
0 siblings, 0 replies; 6+ messages in thread
From: Dong, Eric @ 2019-06-10 2:38 UTC (permalink / raw)
To: Ni, Ray, devel@edk2.groups.io; +Cc: Sathyanarayanan, Nandagopal
Reviewed-by: Eric Dong <eric.dong@intel.com>
> -----Original Message-----
> From: Ni, Ray
> Sent: Wednesday, June 5, 2019 1:49 PM
> To: devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Sathyanarayanan, Nandagopal
> <nandagopal.sathyanarayanan@intel.com>
> Subject: [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease NumApsExecuting
> only for ApInitConfig
>
> The patch fixes the bug that the memory under 1MB is modified by firmware
> in S3 boot.
>
> Root cause is a racing condition in MpInitLib:
> 1. BSP: WakeUpByInitSipiSipi is set by NotifyOnS3SmmInitDonePpi() 2. BSP:
> WakeUpAP() wakes all APs to run certain procedure.
> 2.1. AllocateResetVector() uses <1MB memory for wake up vector.
> 2.1. FillExchangeInfoData() resets NumApsExecuting to 0.
> 2.2. WaitApWakeup() waits AP to clear WAKEUP_AP_SIGNAL.
> 3. AP: ApWakeupFunction() clears WAKEUP_AP_SIGNAL to inform BSP.
> 5. BSP: FreeResetVector() restores the <1MB memory 4. AP:
> ApWakeupFunction() calls the certain procedure.
> 4.1. NumApsExecuting is decreased.
>
> #4.1 happens after the 1MB memory is restored so the result is memory
> below 1MB is changed by #4.1 It happens only when the AP executes
> procedure a bit longer.
> AP returns back to ApWakeupFunction() from procedure after BSP restores
> the <1MB memory.
>
> Since NumApsExecuting is only used when InitFlag == ApInitConfig for
> counting the processor count.
> The patch moves the NumApsExecuting decrease to the path when InitFlag
> == ApInitConfig.
>
> Signed-off-by: Ray Ni <ray.ni@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Nandagopal Sathyanarayanan <nandagopal.sathyanarayanan@intel.com>
> ---
> UefiCpuPkg/Library/MpInitLib/MpLib.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 3337488892..6f51bc4ebf 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -1,7 +1,7 @@
> /** @file
> CPU MP Initialize Library common functions.
>
> - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016 - 2019, Intel Corporation. All rights
> + reserved.<BR>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
> @@ -619,6 +619,8 @@ ApWakeupFunction (
> RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters,
> FALSE);
> InitializeApData (CpuMpData, ProcessorNumber, BistData,
> ApTopOfStack);
> ApStartupSignalBuffer = CpuMpData-
> >CpuData[ProcessorNumber].StartupApSignal;
> +
> + InterlockedDecrement ((UINT32 *)
> + &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
> } else {
> //
> // Execute AP function if AP is ready @@ -698,7 +700,6 @@
> ApWakeupFunction (
> // AP finished executing C code
> //
> InterlockedIncrement ((UINT32 *) &CpuMpData->FinishedCount);
> - InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo-
> >NumApsExecuting);
>
> //
> // Place AP is specified loop mode
> --
> 2.21.0.windows.1
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-06-10 2:38 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-05 5:49 [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Ni, Ray
2019-06-05 5:49 ` [PATCH v2 1/2] UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig Ni, Ray
2019-06-10 2:37 ` Dong, Eric
2019-06-05 5:49 ` [PATCH v2 2/2] UefiCpuPkg/MpInitLib: Decrease " Ni, Ray
2019-06-10 2:38 ` Dong, Eric
2019-06-05 11:25 ` [edk2-devel] [PATCH v2 0/2] Fix the issue that OS complains memory < 1MB changes across S3 Laszlo Ersek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox