From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-002e3701.pphosted.com (mx0b-002e3701.pphosted.com [148.163.143.35]) by mx.groups.io with SMTP id smtpd.web11.4699.1580368356042628467 for ; Wed, 29 Jan 2020 23:12:36 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: hpe.com, ip: 148.163.143.35, mailfrom: prvs=0298110120=derek.lin2@hpe.com) Received: from pps.filterd (m0148664.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00U7BLM4017906; Thu, 30 Jan 2020 07:12:34 GMT Received: from g2t2354.austin.hpe.com (g2t2354.austin.hpe.com [15.233.44.27]) by mx0b-002e3701.pphosted.com with ESMTP id 2xu814r989-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 30 Jan 2020 07:12:34 +0000 Received: from g2t2360.austin.hpecorp.net (g2t2360.austin.hpecorp.net [16.196.225.135]) by g2t2354.austin.hpe.com (Postfix) with ESMTP id 7F3C4AE; Thu, 30 Jan 2020 07:12:33 +0000 (UTC) Received: from SZC0PA4FXD.asiapacific.hpqcorp.net (szc0pa4fxd.asiapacific.hpqcorp.net [10.43.42.135]) by g2t2360.austin.hpecorp.net (Postfix) with ESMTP id 395EF3B; Thu, 30 Jan 2020 07:12:30 +0000 (UTC) From: "Lin, Derek (HPS SW)" To: derek.lin2@hpe.com, devel@edk2.groups.io Cc: jordan.l.justen@intel.com, afish@apple.com, ray.ni@intel.com, Kitty Chen Subject: [PATCH] EmulatorPkg: TimerLib QueryPerformance functions Date: Thu, 30 Jan 2020 15:12:14 +0800 Message-Id: <20200130071214.16472-1-derek.lin2@hpe.com> X-Mailer: git-send-email 2.20.1.windows.1 MIME-Version: 1.0 X-HPE-SCL: -1 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-30_01:2020-01-28,2020-01-30 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1011 impostorscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 suspectscore=0 lowpriorityscore=0 mlxscore=0 priorityscore=1501 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1911200001 definitions=main-2001300047 Content-Transfer-Encoding: 8bit Implement QueryPerformanceCounter() and QueryPerformanceFrequency() for both Unix and Windows. This has been tested in both Unix and Windows in an application using TimerLib. Signed-off-by: Derek Lin Signed-off-by: Kitty Chen --- EmulatorPkg/Unix/Host/EmuThunk.c | 40 +++++++++++++++++++++----------- EmulatorPkg/Win/Host/WinThunk.c | 10 +++++--- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c b/EmulatorPkg/Unix/Host/EmuThunk.c index 1e9dc99187..92703d3088 100644 --- a/EmulatorPkg/Unix/Host/EmuThunk.c +++ b/EmulatorPkg/Unix/Host/EmuThunk.c @@ -11,6 +11,7 @@ Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
+(C) Copyright 2020 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -33,6 +34,7 @@ struct timeval settimer_timeval; UINTN settimer_callback = 0; BOOLEAN gEmulatorInterruptEnabled = FALSE; +UINT64 mPerformanceFrequency = 0; UINTN @@ -236,16 +238,6 @@ SecInterruptEanbled (void) return gEmulatorInterruptEnabled; } - -UINT64 -QueryPerformanceFrequency ( - VOID - ) -{ - // Hard code to nanoseconds - return 1000000000ULL; -} - UINT64 QueryPerformanceCounter ( VOID @@ -274,12 +266,34 @@ QueryPerformanceCounter ( return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom; #else - // Need to figure out what to do for Linux? - return 0; + int status; + struct timespec time; + status = clock_gettime(CLOCK_REALTIME, &time); + return MultU64x32 (time.tv_sec, 1000000000) + time.tv_nsec; + #endif } - +UINT64 +QueryPerformanceFrequency ( + VOID + ) +{ + UINT64 Counter1; + UINT64 Counter2; + if (mPerformanceFrequency) { + return mPerformanceFrequency; + } + // + // Don't know how to query performance frequency in Linux, + // so instead, sleep 0.1 second and calculate it. + // + Counter1 = QueryPerformanceCounter(); + SecSleep (100* 1000 * 1000); + Counter2 = QueryPerformanceCounter(); + mPerformanceFrequency = (Counter2-Counter1) * 10; + return mPerformanceFrequency; +} VOID SecSleep ( diff --git a/EmulatorPkg/Win/Host/WinThunk.c b/EmulatorPkg/Win/Host/WinThunk.c index a77be2a64b..41b5cffe18 100644 --- a/EmulatorPkg/Win/Host/WinThunk.c +++ b/EmulatorPkg/Win/Host/WinThunk.c @@ -1,6 +1,7 @@ /**@file Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+(C) Copyright 2020 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: @@ -438,8 +439,9 @@ SecQueryPerformanceFrequency ( VOID ) { - // Hard code to nanoseconds - return 1000000000ULL; + UINT64 Frequency; + QueryPerformanceFrequency ((LARGE_INTEGER *) &Frequency); + return Frequency; } UINT64 @@ -447,7 +449,9 @@ SecQueryPerformanceCounter ( VOID ) { - return 0; + UINT64 PerformanceCount; + QueryPerformanceCounter ((LARGE_INTEGER *) &PerformanceCount); + return PerformanceCount; } -- 2.17.0.windows.1