REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1757
This patch fix two issues. 1. The previous code "NanoSecondDelay (MicroSeconds * 1000)" may cause data overflow. 2. Delete some code in /EmulatorPkg/ResetRuntimeDxe/Reset.c which may cause Tpl problems when invoked by watchdog. I think it is ok to delete these code, because it will be more like what NT32 does. Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Andrew Fish <af...@apple.com> Cc: Ray Ni <ray...@intel.com> --- EmulatorPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c | 14 +++++++++++++- EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c | 14 +++++++++++++- EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.c | 14 +++++++++++++- EmulatorPkg/ResetRuntimeDxe/Reset.c | 24 ------------------------ 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/EmulatorPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c b/EmulatorPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c index c331cbba9c..813963de7b 100644 --- a/EmulatorPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c +++ b/EmulatorPkg/Library/DxeCoreTimerLib/DxeCoreTimerLib.c @@ -33,7 +33,19 @@ MicroSecondDelay ( IN UINTN MicroSeconds ) { - return NanoSecondDelay (MicroSeconds * 1000); + UINTN Remainder; + UINTN Counter; + UINTN Index; + Counter = (UINTN) DivU64x32Remainder ( + MultU64x32 (MicroSeconds, 1000), + 0xffffffff, + &Remainder + ); + for (Index = 0; Index < Counter; Index++) { + NanoSecondDelay (0xffffffff); + } + NanoSecondDelay (Remainder); + return MicroSeconds; } diff --git a/EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c b/EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c index 14cae4214c..590ce55fae 100644 --- a/EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c +++ b/EmulatorPkg/Library/DxeTimerLib/DxeTimerLib.c @@ -64,7 +64,19 @@ MicroSecondDelay ( IN UINTN MicroSeconds ) { - return NanoSecondDelay (MicroSeconds * 1000); + UINTN Remainder; + UINTN Counter; + UINTN Index; + Counter = (UINTN) DivU64x32Remainder ( + MultU64x32 (MicroSeconds, 1000), + 0xffffffff, + &Remainder + ); + for (Index = 0; Index < Counter; Index++) { + NanoSecondDelay (0xffffffff); + } + NanoSecondDelay (Remainder); + return MicroSeconds; } diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.c b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.c index cce46fb366..dcac32a51f 100644 --- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.c +++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.c @@ -30,7 +30,19 @@ MicroSecondDelay ( IN UINTN MicroSeconds ) { - return NanoSecondDelay (MicroSeconds * 1000); + UINTN Remainder; + UINTN Counter; + UINTN Index; + Counter = (UINTN) DivU64x32Remainder ( + MultU64x32 (MicroSeconds, 1000), + 0xffffffff, + &Remainder + ); + for (Index = 0; Index < Counter; Index++) { + NanoSecondDelay (0xffffffff); + } + NanoSecondDelay (Remainder); + return MicroSeconds; } /** diff --git a/EmulatorPkg/ResetRuntimeDxe/Reset.c b/EmulatorPkg/ResetRuntimeDxe/Reset.c index 19504825c9..9439f9ccff 100644 --- a/EmulatorPkg/ResetRuntimeDxe/Reset.c +++ b/EmulatorPkg/ResetRuntimeDxe/Reset.c @@ -29,30 +29,6 @@ EmuResetSystem ( IN VOID *ResetData OPTIONAL ) { - EFI_STATUS Status; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN Index; - - // - // Disconnect all - // - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &HandleCount, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); - } - - gBS->FreePool (HandleBuffer); - } - - // // Discard ResetType, always return 0 as exit code // -- 2.21.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#41321): https://edk2.groups.io/g/devel/message/41321 Mute This Topic: https://groups.io/mt/31742582/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-