x86 setup: fix asm constraints in vesa_store_edid
Impact: fix potential miscompile (currently believed non-manifest) As the comment explains, the VBE DDC call can clobber any register. Tell the compiler about that fact. Signed-off-by: Andreas Schwab <schwab@suse.de> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
618b2c8db2
commit
7fc49f1981
@@ -269,9 +269,8 @@ void vesa_store_edid(void)
|
|||||||
we genuinely have to assume all registers are destroyed here. */
|
we genuinely have to assume all registers are destroyed here. */
|
||||||
|
|
||||||
asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
|
asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
|
||||||
: "+a" (ax), "+b" (bx)
|
: "+a" (ax), "+b" (bx), "+c" (cx), "+D" (di)
|
||||||
: "c" (cx), "D" (di)
|
: : "esi", "edx");
|
||||||
: "esi");
|
|
||||||
|
|
||||||
if (ax != 0x004f)
|
if (ax != 0x004f)
|
||||||
return; /* No EDID */
|
return; /* No EDID */
|
||||||
@@ -285,9 +284,9 @@ void vesa_store_edid(void)
|
|||||||
dx = 0; /* EDID block number */
|
dx = 0; /* EDID block number */
|
||||||
di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
|
di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
|
||||||
asm(INT10
|
asm(INT10
|
||||||
: "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
|
: "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info),
|
||||||
: "c" (cx), "D" (di)
|
"+c" (cx), "+D" (di)
|
||||||
: "esi");
|
: : "esi");
|
||||||
#endif /* CONFIG_FIRMWARE_EDID */
|
#endif /* CONFIG_FIRMWARE_EDID */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user