summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2019-06-13 16:40:05 +0800
committerHao A Wu <hao.a.wu@intel.com>2019-06-14 13:05:49 +0800
commitb0663641c977f97bef785c86978603c3a31a3d1c (patch)
tree6691407c45c94113f4dfa3171edb4555c99e3756
parent3207a872a405ea60417853cfcdb73b4fa06b795f (diff)
downloadedk2-b0663641c977f97bef785c86978603c3a31a3d1c.zip
edk2-b0663641c977f97bef785c86978603c3a31a3d1c.tar.gz
edk2-b0663641c977f97bef785c86978603c3a31a3d1c.tar.bz2
OvmfPkg/Csm/LegacyBiosDxe: Fix Legacy16GetTableAddress call for E820 data
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 <dwmw2@infradead.org> Reviewed-by: Hao A Wu <hao.a.wu@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com>
-rw-r--r--OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c b/OvmfPkg/Csm/LegacyBiosDxe/LegacyBootSupport.c
index 211750c..cd4cd24 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,