csm: Sanitise alignment constraint in Legacy16GetTableAddress
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 <dwmw2@infradead.org>
This commit is contained in:
parent
85137fb5f2
commit
6e56ed129c
14
src/fw/csm.c
14
src/fw/csm.c
|
@ -258,11 +258,21 @@ handle_csm_0006(struct bregs *regs)
|
|||
u16 region = regs->bx; // (1 for F000 seg, 2 for E000 seg, 0 for either)
|
||||
void *chunk = NULL;
|
||||
|
||||
dprintf(3, "Legacy16GetTableAddress size %x align %x region %d\n",
|
||||
size, align, region);
|
||||
|
||||
if (!region)
|
||||
region = 3;
|
||||
|
||||
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);
|
||||
if (align < MALLOC_MIN_ALIGN)
|
||||
align = MALLOC_MIN_ALIGN;
|
||||
} else {
|
||||
align = MALLOC_MIN_ALIGN;
|
||||
}
|
||||
|
||||
if (region & 2)
|
||||
chunk = _malloc(&ZoneLow, size, align);
|
||||
|
|
Loading…
Reference in New Issue