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(-)
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.liu@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Andrew Fish <afish@apple.com>
Cc: Ray Ni <ray.ni@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/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Zhiguang, For the first issue, where does the fix come from? Or you did the implementation yourself? I ask this because I want to make sure the code is from an existing tested implementation. Thanks, Ray > -----Original Message----- > From: Liu, Zhiguang > Sent: Friday, May 24, 2019 4:18 PM > To: devel@edk2.groups.io > Cc: Justen, Jordan L <jordan.l.justen@intel.com>; Andrew Fish > <afish@apple.com>; Ni, Ray <ray.ni@intel.com> > Subject: [PATCH] EmulatorPkg: Fix bugs about MiscBootServices > > 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.liu@intel.com> > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Andrew Fish <afish@apple.com> > Cc: Ray Ni <ray.ni@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 (#41323): https://edk2.groups.io/g/devel/message/41323 Mute This Topic: https://groups.io/mt/31742582/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
Hello, Ray I did the implementation myself. I just found there did be the same function in \Omap35xxPkg\Library\Omap35xxTimerLib\TimerLib.c In old version. Should I use the existing code like following \Omap35xxPkg\Library\Omap35xxTimerLib\TimerLib.c UINTN EFIAPI MicroSecondDelay ( IN UINTN MicroSeconds ) { UINT64 NanoSeconds; NanoSeconds = MultU64x32(MicroSeconds, 1000); while (NanoSeconds > (UINTN)-1) { NanoSecondDelay((UINTN)-1); NanoSeconds -= (UINTN)-1; } NanoSecondDelay(NanoSeconds); return MicroSeconds; } Best Regards, Zhiguang Liu >-----Original Message----- >From: Ni, Ray >Sent: Friday, May 24, 2019 5:08 PM >To: Liu, Zhiguang <zhiguang.liu@intel.com>; devel@edk2.groups.io >Cc: Justen, Jordan L <jordan.l.justen@intel.com>; Andrew Fish ><afish@apple.com> >Subject: RE: [PATCH] EmulatorPkg: Fix bugs about MiscBootServices > >Zhiguang, >For the first issue, where does the fix come from? >Or you did the implementation yourself? > >I ask this because I want to make sure the code is from an existing tested >implementation. > >Thanks, >Ray > >> -----Original Message----- >> From: Liu, Zhiguang >> Sent: Friday, May 24, 2019 4:18 PM >> To: devel@edk2.groups.io >> Cc: Justen, Jordan L <jordan.l.justen@intel.com>; Andrew Fish >> <afish@apple.com>; Ni, Ray <ray.ni@intel.com> >> Subject: [PATCH] EmulatorPkg: Fix bugs about MiscBootServices >> >> 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.liu@intel.com> >> Cc: Jordan Justen <jordan.l.justen@intel.com> >> Cc: Andrew Fish <afish@apple.com> >> Cc: Ray Ni <ray.ni@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 (#41375): https://edk2.groups.io/g/devel/message/41375 Mute This Topic: https://groups.io/mt/31742582/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.