The DX register is supposed to contain the required alignment for the allocation. It was zero, and SeaBIOS doesn't (well, didn't) cope well with that. Set it appropriately.
Also set BX to indicate the regions it's OK to allocate in too. That wasn't being initialised and was just using whatever the previous user of the structure had left there. Finally, actually return an error if the allocation fails. Instead of going all the way through into the CSM and just letting it have a bogus pointer to the E820 data. Signed-off-by: David Woodhouse <dw...@infradead.org> Reviewed-by: Hao A Wu <hao.a...@intel.com> --- OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c b/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c index 211750c012..cd4cd24f42 100644 --- a/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c +++ b/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c @@ -928,7 +928,9 @@ GenericLegacyBoot ( if (CopySize > Private->Legacy16Table->E820Length) { ZeroMem (&Regs, sizeof (EFI_IA32_REGISTER_SET)); Regs.X.AX = Legacy16GetTableAddress; + Regs.X.BX = (UINT16) 0x0; // Any region Regs.X.CX = (UINT16) CopySize; + Regs.X.DX = (UINT16) 0x4; // Alignment Private->LegacyBios.FarCall86 ( &Private->LegacyBios, Private->Legacy16Table->Compatibility16CallSegment, @@ -942,6 +944,7 @@ GenericLegacyBoot ( Private->Legacy16Table->E820Length = (UINT32) CopySize; if (Regs.X.AX != 0) { DEBUG ((EFI_D_ERROR, "Legacy16 E820 length insufficient\n")); + return EFI_OUT_OF_RESOURCES; } else { CopyMem ( (VOID *)(UINTN) Private->Legacy16Table->E820Pointer, -- 2.21.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#42350): https://edk2.groups.io/g/devel/message/42350 Mute This Topic: https://groups.io/mt/32050165/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-