From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: redhat.com, ip: 209.132.183.28, mailfrom: lersek@redhat.com) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by groups.io with SMTP; Fri, 12 Apr 2019 02:33:29 -0700 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 429F1104D78; Fri, 12 Apr 2019 09:33:24 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-120-65.rdu2.redhat.com [10.10.120.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E69F5C223; Fri, 12 Apr 2019 09:33:20 +0000 (UTC) Subject: Re: [edk2-devel] [PATCH v2 21/31] OvmfPkg/XenPlatformPei: Get E820 table via hypercall ... To: devel@edk2.groups.io, anthony.perard@citrix.com Cc: Jordan Justen , Ard Biesheuvel , Julien Grall , xen-devel@lists.xenproject.org References: <20190409110844.14746-1-anthony.perard@citrix.com> <20190409110844.14746-22-anthony.perard@citrix.com> From: "Laszlo Ersek" Message-ID: Date: Fri, 12 Apr 2019 11:33:19 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20190409110844.14746-22-anthony.perard@citrix.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 12 Apr 2019 09:33:29 +0000 (UTC) Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit On 04/09/19 13:08, Anthony PERARD wrote: > .. 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 > --- > OvmfPkg/XenPlatformPei/Xen.c | 46 +++++++++++++++++++- > 1 file changed, 45 insertions(+), 1 deletion(-) (1) Please change the subject to OvmfPkg/XenPlatformPei: no hvmloader: get the E820 table via hypercall (70 characters); and pls write a self-contained commit message body. (2) s/haven't runned/hasn't run/ > > 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; (3) Please prefix both of these global variables with "m". (I'd also recommend STATIC.) > > /** > 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; > } > > /** > "xen_memory_map_t" and "set_xen_guest_handle" look really foreign in edk2, but I guess we'll have to live with them. With (1) through (3) updated: Acked-by: Laszlo Ersek Thanks Laszlo