[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [edk2-devel] [PATCH v2 21/31] OvmfPkg/XenPlatformPei: Get E820 table via hypercall ...
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 <anthony.perard@xxxxxxxxxx> > --- > 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 <Library/MtrrLib.h> > #include <IndustryStandard/Xen/arch-x86/hvm/start_info.h> > #include <Library/XenHypercallLib.h> > +#include <IndustryStandard/Xen/memory.h> > > #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 <lersek@xxxxxxxxxx> Thanks Laszlo _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |