The alignment constraint is defined in the CSM specifications as
"Bit mapped.  First non-zero bit from the right is the alignment."

Use __fls() to sanitise the alignment given that definition, since
passing a non-power-of-two alignment to _malloc() isn't going to work
well. And cope with being passed zero, which was happening for the
E820 table allocation from EDK2.

Signed-off-by: David Woodhouse <dw...@infradead.org>
---
 src/fw/csm.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/fw/csm.c b/src/fw/csm.c
index 03b4bb8..bf7b8f5 100644
--- a/src/fw/csm.c
+++ b/src/fw/csm.c
@@ -264,6 +264,13 @@ handle_csm_0006(struct bregs *regs)
     dprintf(3, "Legacy16GetTableAddress size %x align %x region %d\n",
         size, align, region);
 
+    // DX = Required address alignment. Bit mapped.
+    // First non-zero bit from the right is the alignment.*/
+    if (align)
+           align = 1 << __ffs(align);
+    else
+           align = 1;
+
     if (region & 2)
         chunk = _malloc(&ZoneLow, size, align);
     if (!chunk && (region & 1))

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to