From nobody Fri Feb 11 06:52:08 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id ABB9C19C8136; Fri, 11 Feb 2022 06:52:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Jw46c74Fcz4sDB; Fri, 11 Feb 2022 06:52:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644562329; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NzO4+q0BEmDHzPfIhCJbirE1CAIiwo73veJl5vClFjI=; b=Sg2GfgDrd7X2nJQRooxDYsOMI1mclTgIMHNlgHt6W2jYsqWeDm3on1okr6I1BWDCYVjXOr TANFR/vFTrIs4tmIa3Xiy9S2RWRwE5oLkbAJ70HOwA+aNNYzqJu1l8mC2XzFeYNHo1HGvd 0+q6k1AVATiHvpWSDlfcChKcXr5RouZNuRe/ObnhACzoo5J2ApGFslsPAXcZi14CYf6p18 xajmQar1lK5HsMzK750qs1RWxeglqrvD5cFMnv49/yqC6kFTuG/YzmKdo6VNGAWeCzNAOP FczeFE2ShOGwB4Xg6ufn19MIU3u+IgQcRzon9f1YT78xoddzbvjk1HSl1jpq1g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id BACF07A85; Fri, 11 Feb 2022 06:52:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 21B6q8bB031207; Fri, 11 Feb 2022 06:52:08 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21B6q8QN031206; Fri, 11 Feb 2022 06:52:08 GMT (envelope-from git) Date: Fri, 11 Feb 2022 06:52:08 GMT Message-Id: <202202110652.21B6q8QN031206@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Colin Percival Subject: git: 51e77b34e4bf - stable/13 - TSC: Use 0x40000010 CPUID leaf for all VM types List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cperciva X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 51e77b34e4bf76c8aa2c882f64ef923c2fbe6108 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644562329; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NzO4+q0BEmDHzPfIhCJbirE1CAIiwo73veJl5vClFjI=; b=kwjajHpARomr7KABoj0bbNRq7osZrJO/3uNSwO/2YpjNs3JoXk1nAbJwJeSaFpLiPmzIUJ qRZbZXNAvYkz+WN8FxZQW231/g6RruiXt3qrWAztR6T4N6aOTemQ82/+I1TRKS+TL8WHQA 7TJeIyA8LrsUD1GdkyzroYTVq8cCLAoRg6lI4wdruZ5cKerB3XEMxDkRQqh4dRLJP8ccdF SnZqbl8mGr1qESUMWrlYNaGfhLk6HYndjzypMStEXi2QGcSTpeSrbEH63ofBEgTqqOMq0i 4YHUTgyrq1uj5QP1GzSIC1kIDobzo2r2WrGLbSBovsBMz1L0BrCDYK5ElB5lMA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1644562329; a=rsa-sha256; cv=none; b=V2EXK+lq1D7/3OZm67yz6XzBMQ0grx4yn7whihVX7+tPNIYi4Xq2UgCTHztm0mYNqsDhP7 Lp2/WJp8hiusfU/A1iuPLaGXlLDad3N/yxufvxtqa5T0FpX7OQLFl4tANUcMLjawhz+UDL 2K3CWV0q7ALIaVjkdkTE84QcsXTF1DzaNu9UwPPsX8ilCtWP90Q7IVcJl0WZxxUg3vTVrY wgt1yIFHQpBitIBw31RgynD4N8/QmH5596QnqtJ8EveGj0AIL1nQs7xzEpTAEyRVCN7y9s DVvNlYPSDdfqRIvZ+7rS8FykrS5Nzs9HZ+fo2+dpnmdxTpJAPkncaKTd8ouoMQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by cperciva: URL: https://cgit.FreeBSD.org/src/commit/?id=51e77b34e4bf76c8aa2c882f64ef923c2fbe6108 commit 51e77b34e4bf76c8aa2c882f64ef923c2fbe6108 Author: Colin Percival AuthorDate: 2022-01-04 07:28:36 +0000 Commit: Colin Percival CommitDate: 2022-02-11 06:52:00 +0000 TSC: Use 0x40000010 CPUID leaf for all VM types While this CPUID leaf was originally only used by VMWare, other hypervisors now also use it to announce the TSC frequency to guests. This speeds up the boot process by 100 ms in EC2 and other systems, by allowing the early calibration DELAY to be skipped. Reviewed by: markj Sponsored by: https://www.patreon.com/cperciva (cherry picked from commit 4a432614f68cf35879dbb4ebef089f5b8db95334) --- sys/x86/x86/tsc.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index 1b6c8282e44e..e0c23767573e 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -121,19 +121,29 @@ static struct timecounter tsc_timecounter = { #endif }; +static int +tsc_freq_cpuid_vm(void) +{ + u_int regs[4]; + + if (vm_guest == VM_GUEST_NO) + return (false); + if (hv_high < 0x40000010) + return (false); + do_cpuid(0x40000010, regs); + tsc_freq = (uint64_t)(regs[0]) * 1000; + tsc_early_calib_exact = 1; + return (true); +} + static void tsc_freq_vmware(void) { u_int regs[4]; - if (hv_high >= 0x40000010) { - do_cpuid(0x40000010, regs); - tsc_freq = regs[0] * 1000; - } else { - vmware_hvcall(VMW_HVCMD_GETHZ, regs); - if (regs[1] != UINT_MAX) - tsc_freq = regs[0] | ((uint64_t)regs[1] << 32); - } + vmware_hvcall(VMW_HVCMD_GETHZ, regs); + if (regs[1] != UINT_MAX) + tsc_freq = regs[0] | ((uint64_t)regs[1] << 32); tsc_early_calib_exact = 1; } @@ -305,6 +315,9 @@ probe_tsc_freq(void) break; } + if (tsc_freq_cpuid_vm()) + return; + if (vm_guest == VM_GUEST_VMWARE) { tsc_freq_vmware(); return;