mirror of
https://github.com/ipxe/ipxe
synced 2025-12-15 09:04:37 +03:00
[build] Constrain PHYS_CODE() and REAL_CODE() to use i386 registers
Inline assembly using PHYS_CODE() or REAL_CODE() must use the "R" constraint rather than the "r" constraint to ensure that the compiler chooses registers that will be valid for the 32-bit or 16-bit assembly code fragment. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -114,13 +114,13 @@ static int com32_exec_loop ( struct image *image ) {
|
|||||||
/* Restore registers */
|
/* Restore registers */
|
||||||
"popal\n\t" )
|
"popal\n\t" )
|
||||||
:
|
:
|
||||||
: "r" ( avail_mem_top ),
|
: "R" ( avail_mem_top ),
|
||||||
"r" ( virt_to_phys ( com32_cfarcall_wrapper ) ),
|
"R" ( virt_to_phys ( com32_cfarcall_wrapper ) ),
|
||||||
"r" ( virt_to_phys ( com32_farcall_wrapper ) ),
|
"R" ( virt_to_phys ( com32_farcall_wrapper ) ),
|
||||||
"r" ( get_fbms() * 1024 - ( COM32_BOUNCE_SEG << 4 ) ),
|
"R" ( get_fbms() * 1024 - ( COM32_BOUNCE_SEG << 4 ) ),
|
||||||
"i" ( COM32_BOUNCE_SEG << 4 ),
|
"i" ( COM32_BOUNCE_SEG << 4 ),
|
||||||
"r" ( virt_to_phys ( com32_intcall_wrapper ) ),
|
"R" ( virt_to_phys ( com32_intcall_wrapper ) ),
|
||||||
"r" ( virt_to_phys ( image->cmdline ?
|
"R" ( virt_to_phys ( image->cmdline ?
|
||||||
image->cmdline : "" ) ),
|
image->cmdline : "" ) ),
|
||||||
"i" ( COM32_START_PHYS )
|
"i" ( COM32_START_PHYS )
|
||||||
: "memory" );
|
: "memory" );
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ static int comboot_exec_loop ( struct image *image ) {
|
|||||||
"xorw %%di, %%di\n\t"
|
"xorw %%di, %%di\n\t"
|
||||||
"xorw %%bp, %%bp\n\t"
|
"xorw %%bp, %%bp\n\t"
|
||||||
"lret\n\t" )
|
"lret\n\t" )
|
||||||
: : "r" ( COMBOOT_PSP_SEG ) : "eax" );
|
: : "R" ( COMBOOT_PSP_SEG ) : "eax" );
|
||||||
DBGC ( image, "COMBOOT %p: returned\n", image );
|
DBGC ( image, "COMBOOT %p: returned\n", image );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -92,9 +92,9 @@ static void bios_mp_exec_boot ( mp_func_t func, void *opaque ) {
|
|||||||
"pushl %k1\n\t"
|
"pushl %k1\n\t"
|
||||||
"call *%k0\n\t"
|
"call *%k0\n\t"
|
||||||
"addl $8, %%esp\n\t" )
|
"addl $8, %%esp\n\t" )
|
||||||
: : "r" ( mp_address ( mp_call ) ),
|
: : "R" ( mp_address ( mp_call ) ),
|
||||||
"r" ( mp_address ( func ) ),
|
"R" ( mp_address ( func ) ),
|
||||||
"r" ( mp_address ( opaque ) ) );
|
"R" ( mp_address ( opaque ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -514,8 +514,8 @@ static __asmcall __used void int22 ( struct i386_all_regs *ix86 ) {
|
|||||||
"lret\n\t"
|
"lret\n\t"
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
: "r" ( ix86->segs.ds ),
|
: "R" ( ix86->segs.ds ),
|
||||||
"r" ( ix86->regs.ebp ),
|
"R" ( ix86->regs.ebp ),
|
||||||
"d" ( ix86->regs.ebx ),
|
"d" ( ix86->regs.ebx ),
|
||||||
"S" ( ix86->regs.esi ) );
|
"S" ( ix86->regs.esi ) );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user