From nobody Sat Nov 23 23:46:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+94699+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94699+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1664891254; cv=none; d=zohomail.com; s=zohoarc; b=ABKLOCJr6xOhuL/csKhj/mOfMlJxLHcizIr82wfVVe7gpRminD6cbYLd6/B1D1l5oQw/ebd/hV0IRx10kiJ9WveExQrWgCK5kHsDRPGyoQ3b5h0CJcxiv6Un9N6MO96tG9y0SHXp2I/dciPVLqmerjvaGbXBYfmnEuv7xxWYhm0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1664891254; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=WYMiETpbeUpL1XoiFD/KZG80hRZiMMM2Rv0ey9OIQHQ=; b=lYJHLOwIWsNi/xKVUOUylSxGxDxdaPi/aKCJdFaEdH7m7YajYALOMc9WudLCDf2iMwJ2ey4/T2QSZr/b31sa7jMe6XLg33yZvcyAhjj4CdHyi0aCMh4UioVnFz1LApN+TwfGHuSZ8PMC4xIxRmmIzJOiEH1COfpdI5OqrainLMY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+94699+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1664891254383934.7830516930763; Tue, 4 Oct 2022 06:47:34 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 8NHBYY1788612xJgxtvl1afx; Tue, 04 Oct 2022 06:47:34 -0700 X-Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.groups.io with SMTP id smtpd.web08.10763.1664891252533102044 for ; Tue, 04 Oct 2022 06:47:33 -0700 X-Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-473-oHL16OmkNg-6Ey38EYLisg-1; Tue, 04 Oct 2022 09:47:30 -0400 X-MC-Unique: oHL16OmkNg-6Ey38EYLisg-1 X-Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DD7B8101A52A; Tue, 4 Oct 2022 13:47:29 +0000 (UTC) X-Received: from sirius.home.kraxel.org (unknown [10.39.193.173]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7B746477F55; Tue, 4 Oct 2022 13:47:29 +0000 (UTC) X-Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 10BBB1800848; Tue, 4 Oct 2022 15:47:28 +0200 (CEST) From: "Gerd Hoffmann" To: devel@edk2.groups.io Cc: Jordan Justen , Gerd Hoffmann , Pawel Polawski , Jiewen Yao , Oliver Steffen , Ard Biesheuvel Subject: [edk2-devel] [PATCH v2 1/4] OvmfPkg/PlatformInitLib: qemu cpuid physbits detection Date: Tue, 4 Oct 2022 15:47:25 +0200 Message-Id: <20221004134728.55499-2-kraxel@redhat.com> In-Reply-To: <20221004134728.55499-1-kraxel@redhat.com> References: <20221004134728.55499-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,kraxel@redhat.com X-Gm-Message-State: yHoYsIryOIXKDvN7kuBCmX2Px1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1664891254; bh=brE8We+E243brlk9FoaAlIBJYBURl/yZTXgsXxMrbQA=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=wpy7PcDQmiLlok4oWHRrfCmmChaxlVmqg+ABiEsNUPJPQITaV0uiTU4c/ANbkUdX+ua 6FYLVre/09FyPTCfABRfgUVyuFtarBDVRE90kmj7mwjt5QrSbhVWlYtNvrKdYKs+wCibH I04q15dbneA2Lz2dO3tqPKu5ViNBPzQL5Vk= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1664891254807100003 Content-Type: text/plain; charset="utf-8"; x-default="true" Add some qemu specific quirks to PlatformAddressWidthFromCpuid() to figure whenever the PhysBits value returned by CPUID is something real we can work with or not. See the source code comment for details on the logic. Also apply some limits to the address space we are going to use: * Place a hard cap at 47 PhysBits (128 TB) to avoid using addresses which require 5-level paging support. * Cap at 40 PhysBits (1 TB) in case the CPU has no support for gigabyte pages, to avoid excessive amounts of pages being used for page tables. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 102 ++++++++++++++++---- 1 file changed, 84 insertions(+), 18 deletions(-) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/= PlatformInitLib/MemDetect.c index d1a4f4b20791..143a01ceb01e 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -503,39 +503,105 @@ PlatformGetFirstNonAddress ( } =20 /* - * Use CPUID to figure physical address width. Does *not* work - * reliable on qemu. For historical reasons qemu returns phys-bits=3D40 - * even in case the host machine supports less than that. - * - * qemu has a cpu property (host-phys-bits=3D{on,off}) to change that - * and make sure guest phys-bits are not larger than host phys-bits., - * but it is off by default. Exception: microvm machine type - * hard-wires that property to on. + * Use CPUID to figure physical address width. + * + * Does *not* work reliable on qemu. For historical reasons qemu + * returns phys-bits=3D40 by default even in case the host machine + * supports less than that. + * + * So we apply the following rules (which can be enabled/disabled + * using the QemuQuirk parameter) to figure whenever we can work with + * the returned physical address width or not: + * + * (1) If it is 41 or higher consider it valid. + * (2) If it is 40 or lower consider it valid in case it matches a + * known-good value for the CPU vendor, which is: + * -> 36 or 39 for Intel + * -> 40 for AMD + * (3) Otherwise consider it invalid. + * + * Recommendation: Run qemu with host-phys-bits=3Don. That will make + * sure guest phys-bits is not larger than host phys-bits. Some + * distro builds do that by default. */ VOID EFIAPI PlatformAddressWidthFromCpuid ( - IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob + IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob, + IN BOOLEAN QemuQuirk ) { - UINT32 RegEax; + UINT32 RegEax, RegEbx, RegEcx, RegEdx, Max; + UINT8 PhysBits; + CHAR8 Signature[13] =3D { 0 }; + BOOLEAN Valid =3D FALSE; + BOOLEAN Page1GSupport =3D FALSE; =20 - AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL); - if (RegEax >=3D 0x80000008) { + AsmCpuid (0x80000000, &RegEax, &RegEbx, &RegEcx, &RegEdx); + *(UINT32 *)(Signature + 0) =3D RegEbx; + *(UINT32 *)(Signature + 4) =3D RegEdx; + *(UINT32 *)(Signature + 8) =3D RegEcx; + Max =3D RegEax; + + if (Max >=3D 0x80000001) { + AsmCpuid (0x80000001, NULL, NULL, NULL, &RegEdx); + if ((RegEdx & BIT26) !=3D 0) { + Page1GSupport =3D TRUE; + } + } + + if (Max >=3D 0x80000008) { AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL); - PlatformInfoHob->PhysMemAddressWidth =3D (UINT8)RegEax; + PhysBits =3D (UINT8)RegEax; } else { - PlatformInfoHob->PhysMemAddressWidth =3D 36; + PhysBits =3D 36; } =20 - PlatformInfoHob->FirstNonAddress =3D LShiftU64 (1, PlatformInfoHob->Phys= MemAddressWidth); + if (!QemuQuirk) { + Valid =3D TRUE; + } else if (PhysBits >=3D 41) { + Valid =3D TRUE; + } else if (AsciiStrCmp (Signature, "GenuineIntel") =3D=3D 0) { + if ((PhysBits =3D=3D 36) || (PhysBits =3D=3D 39)) { + Valid =3D TRUE; + } + } else if (AsciiStrCmp (Signature, "AuthenticAMD") =3D=3D 0) { + if (PhysBits =3D=3D 40) { + Valid =3D TRUE; + } + } =20 DEBUG (( DEBUG_INFO, - "%a: cpuid: phys-bits is %d\n", + "%a: Signature: '%a', PhysBits: %d, QemuQuirk: %a, Valid: %a\n", __FUNCTION__, - PlatformInfoHob->PhysMemAddressWidth + Signature, + PhysBits, + QemuQuirk ? "On" : "Off", + Valid ? "Yes" : "No" )); + + if (Valid) { + if (PhysBits > 47) { + /* + * Avoid 5-level paging altogether for now, which limits + * PhysBits to 48. Also avoid using address bit 48, due to sign + * extension we can't identity-map these addresses (and lots of + * places in edk2 assume we have everything identity-mapped). + * So the actual limit is 47. + */ + DEBUG ((DEBUG_INFO, "%a: limit PhysBits to 47 (avoid 5-level paging)= \n", __func__)); + PhysBits =3D 47; + } + + if (!Page1GSupport && (PhysBits > 40)) { + DEBUG ((DEBUG_INFO, "%a: limit PhysBits to 40 (no 1G pages available= )\n", __func__)); + PhysBits =3D 40; + } + + PlatformInfoHob->PhysMemAddressWidth =3D PhysBits; + PlatformInfoHob->FirstNonAddress =3D LShiftU64 (1, PlatformInfoHob= ->PhysMemAddressWidth); + } } =20 /** @@ -672,7 +738,7 @@ PlatformAddressWidthInitialization ( EFI_STATUS Status; =20 if (PlatformInfoHob->HostBridgeDevId =3D=3D 0xffff /* microvm */) { - PlatformAddressWidthFromCpuid (PlatformInfoHob); + PlatformAddressWidthFromCpuid (PlatformInfoHob, FALSE); return; } =20 --=20 2.37.3 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#94699): https://edk2.groups.io/g/devel/message/94699 Mute This Topic: https://groups.io/mt/94113625/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-