mirror of https://github.com/ipxe/ipxe.git
[librm] Use explicit operand size when pushing a label address
We currently use "push $1f" within inline assembly to push the address of the real-mode code fragment, relying on the assembler to treat this as "pushl" for 32-bit code or "pushq" for 64-bit code. As of binutils commit 5cc0077 ("x86: further adjust extend-to-32bit- address conditions"), first included in binutils-2.41, this implicit operand size is no longer calculated as expected and 64-bit builds will fail with Error: operand size mismatch for `push' Fix by adding an explicit operand size to the "push" instruction. Originally-fixed-by: Justin Cano <jstncno@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1036/head
parent
9e99a55b31
commit
0aa2e4ec96
|
@ -250,8 +250,10 @@ extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
|
||||||
/* CODE_DEFAULT: restore default .code32/.code64 directive */
|
/* CODE_DEFAULT: restore default .code32/.code64 directive */
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
#define CODE_DEFAULT ".code64"
|
#define CODE_DEFAULT ".code64"
|
||||||
|
#define STACK_DEFAULT "q"
|
||||||
#else
|
#else
|
||||||
#define CODE_DEFAULT ".code32"
|
#define CODE_DEFAULT ".code32"
|
||||||
|
#define STACK_DEFAULT "l"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* LINE_SYMBOL: declare a symbol for the current source code line */
|
/* LINE_SYMBOL: declare a symbol for the current source code line */
|
||||||
|
@ -268,7 +270,7 @@ extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
|
||||||
|
|
||||||
/* REAL_CODE: declare a fragment of code that executes in real mode */
|
/* REAL_CODE: declare a fragment of code that executes in real mode */
|
||||||
#define REAL_CODE( asm_code_str ) \
|
#define REAL_CODE( asm_code_str ) \
|
||||||
"push $1f\n\t" \
|
"push" STACK_DEFAULT " $1f\n\t" \
|
||||||
"call real_call\n\t" \
|
"call real_call\n\t" \
|
||||||
TEXT16_CODE ( "\n1:\n\t" \
|
TEXT16_CODE ( "\n1:\n\t" \
|
||||||
asm_code_str \
|
asm_code_str \
|
||||||
|
@ -277,7 +279,7 @@ extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
|
||||||
|
|
||||||
/* PHYS_CODE: declare a fragment of code that executes in flat physical mode */
|
/* PHYS_CODE: declare a fragment of code that executes in flat physical mode */
|
||||||
#define PHYS_CODE( asm_code_str ) \
|
#define PHYS_CODE( asm_code_str ) \
|
||||||
"push $1f\n\t" \
|
"push" STACK_DEFAULT " $1f\n\t" \
|
||||||
"call phys_call\n\t" \
|
"call phys_call\n\t" \
|
||||||
".section \".text.phys\", \"ax\", @progbits\n\t"\
|
".section \".text.phys\", \"ax\", @progbits\n\t"\
|
||||||
"\n" LINE_SYMBOL "\n\t" \
|
"\n" LINE_SYMBOL "\n\t" \
|
||||||
|
|
Loading…
Reference in New Issue