From patchwork Tue Apr 9 11:08:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony PERARD X-Patchwork-Id: 10891067 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 97CF717E6 for ; Tue, 9 Apr 2019 11:29:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 845542837E for ; Tue, 9 Apr 2019 11:29:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 78E29283BB; Tue, 9 Apr 2019 11:29:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 246722837E for ; Tue, 9 Apr 2019 11:29:55 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hDov8-0000cU-S3; Tue, 09 Apr 2019 11:28:06 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hDov6-0000aO-TZ for xen-devel@lists.xenproject.org; Tue, 09 Apr 2019 11:28:04 +0000 X-Inumbo-ID: 88d34e3c-5aba-11e9-af3d-bf0f088d2d4c Received: from SMTP03.CITRIX.COM (unknown [162.221.156.55]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 88d34e3c-5aba-11e9-af3d-bf0f088d2d4c; Tue, 09 Apr 2019 11:28:02 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.60,329,1549929600"; d="scan'208";a="83096434" From: Anthony PERARD To: Date: Tue, 9 Apr 2019 12:08:34 +0100 Message-ID: <20190409110844.14746-22-anthony.perard@citrix.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190409110844.14746-1-anthony.perard@citrix.com> References: <20190409110844.14746-1-anthony.perard@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v2 21/31] OvmfPkg/XenPlatformPei: Get E820 table via hypercall ... X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Ard Biesheuvel , Jordan Justen , Julien Grall , Anthony PERARD , xen-devel@lists.xenproject.org, Laszlo Ersek Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP .. when hvmloader haven't runned before OVMF. The only way left to get an E820 table is to ask Xen via an hypercall, the call can only be made once so keep the result cached for later. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Anthony PERARD Acked-by: Laszlo Ersek --- OvmfPkg/XenPlatformPei/Xen.c | 46 +++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c index 23ff3102b5..f8cee671d8 100644 --- a/OvmfPkg/XenPlatformPei/Xen.c +++ b/OvmfPkg/XenPlatformPei/Xen.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "Platform.h" #include "Xen.h" @@ -46,6 +47,8 @@ EFI_XEN_INFO mXenInfo; // Only the E820 table is used by OVMF. // EFI_XEN_OVMF_INFO *mXenHvmloaderInfo; +EFI_E820_ENTRY64 E820Entries[128]; +UINT32 E820EntriesCount; /** Returns E820 map provided by Xen @@ -61,6 +64,12 @@ XenGetE820Map ( UINT32 *Count ) { + INTN ReturnCode; + xen_memory_map_t Parameters; + UINTN LoopIndex; + UINTN Index; + EFI_E820_ENTRY64 TmpEntry; + // // Get E820 produced by hvmloader // @@ -72,7 +81,42 @@ XenGetE820Map ( return EFI_SUCCESS; } - return EFI_NOT_FOUND; + // + // Otherwise, get the E820 table from the Xen hypervisor + // + + if (E820EntriesCount > 0) { + *Entries = E820Entries; + *Count = E820EntriesCount; + return EFI_SUCCESS; + } + + Parameters.nr_entries = 128; + set_xen_guest_handle (Parameters.buffer, E820Entries); + + // Returns a errno + ReturnCode = XenHypercallMemoryOp (XENMEM_memory_map, &Parameters); + ASSERT (ReturnCode == 0); + + E820EntriesCount = Parameters.nr_entries; + + // + // Sort E820 entries + // + for (LoopIndex = 1; LoopIndex < E820EntriesCount; LoopIndex++) { + for (Index = LoopIndex; Index < E820EntriesCount; Index++) { + if (E820Entries[Index - 1].BaseAddr > E820Entries[Index].BaseAddr) { + TmpEntry = E820Entries[Index]; + E820Entries[Index] = E820Entries[Index - 1]; + E820Entries[Index - 1] = TmpEntry; + } + } + } + + *Count = E820EntriesCount; + *Entries = E820Entries; + + return EFI_SUCCESS; } /**