From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: zhiguang.liu@intel.com) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by groups.io with SMTP; Fri, 24 May 2019 01:18:05 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 May 2019 01:18:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,506,1549958400"; d="scan'208";a="177351861" Received: from fieedk002.ccr.corp.intel.com ([10.239.157.133]) by fmsmga002.fm.intel.com with ESMTP; 24 May 2019 01:18:03 -0700 From: "Zhiguang Liu" To: devel@edk2.groups.io Cc: Jordan Justen , Andrew Fish , Ray Ni Subject: [PATCH] EmulatorPkg: Fix bugs about MiscBootServices Date: Fri, 24 May 2019 16:17:43 +0800 Message-Id: <20190524081743.18780-1-zhiguang.liu@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Cc: Jordan Justen Cc: Andrew Fish Cc: Ray Ni --- 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