Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[librm] Ensure that inline code symbols are unique
Commit 6149e0a ("[librm] Provide symbols for inline code placed into
other sections") may cause build failures due to duplicate label names
if the compiler chooses to duplicate inline assembly code.

Fix by using the "%=" special format string to include a
guaranteed-unique number within the label name.

The "%=" will be expanded only if constraints exist for the inline
assembly.  This fix therefore requires that all REAL_CODE() fragments
use a (possibly empty) constraint list.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 21, 2018
1 parent 6149e0a commit bc85368
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/arch/x86/core/dumpregs.c
Expand Up @@ -7,7 +7,7 @@ void __asmcall _dump_regs ( struct i386_all_regs *ix86 ) {
TEXT16_CODE ( ".globl dump_regs\n\t"
"\ndump_regs:\n\t"
VIRT_CALL ( _dump_regs )
"ret\n\t" ) );
"ret\n\t" ) : );

printf ( "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
"ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
Expand Down
2 changes: 1 addition & 1 deletion src/arch/x86/include/librm.h
Expand Up @@ -255,7 +255,7 @@ extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
#endif

/* LINE_SYMBOL: declare a symbol for the current source code line */
#define LINE_SYMBOL _S2 ( OBJECT ) "__line_" _S2 ( __LINE__ ) ":"
#define LINE_SYMBOL _S2 ( OBJECT ) "__line_" _S2 ( __LINE__ ) "__%=:"

/* TEXT16_CODE: declare a fragment of code that resides in .text16 */
#define TEXT16_CODE( asm_code_str ) \
Expand Down
4 changes: 2 additions & 2 deletions src/arch/x86/interface/pcbios/bios_console.c
Expand Up @@ -521,12 +521,12 @@ static void bios_inject_startup ( void ) {
__asm__ __volatile__ (
TEXT16_CODE ( "\nint16_wrapper:\n\t"
"pushfw\n\t"
"cmpb $0, %cs:bios_inject_lock\n\t"
"cmpb $0, %%cs:bios_inject_lock\n\t"
"jnz 1f\n\t"
VIRT_CALL ( bios_inject )
"\n1:\n\t"
"popfw\n\t"
"ljmp *%cs:int16_vector\n\t" ) );
"ljmp *%%cs:int16_vector\n\t" ) : );

/* Hook INT 16 */
hook_bios_interrupt ( 0x16, ( ( intptr_t ) int16_wrapper ),
Expand Down
2 changes: 1 addition & 1 deletion src/arch/x86/interface/pcbios/bios_reboot.c
Expand Up @@ -48,7 +48,7 @@ static void bios_reboot ( int warm ) {
put_real ( flag, BDA_SEG, BDA_REBOOT );

/* Jump to system reset vector */
__asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) );
__asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) : );
}

/**
Expand Down
6 changes: 3 additions & 3 deletions src/arch/x86/interface/syslinux/comboot_call.c
Expand Up @@ -663,7 +663,7 @@ void hook_comboot_interrupts ( ) {
VIRT_CALL ( int20 )
"clc\n\t"
"call patch_cf\n\t"
"iret\n\t" ) );
"iret\n\t" ) : );

hook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper, &int20_vector );

Expand All @@ -672,7 +672,7 @@ void hook_comboot_interrupts ( ) {
VIRT_CALL ( int21 )
"clc\n\t"
"call patch_cf\n\t"
"iret\n\t" ) );
"iret\n\t" ) : );

hook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper, &int21_vector );

Expand All @@ -681,7 +681,7 @@ void hook_comboot_interrupts ( ) {
VIRT_CALL ( int22 )
"clc\n\t"
"call patch_cf\n\t"
"iret\n\t" ) );
"iret\n\t" ) : );

hook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper, &int22_vector );
}
Expand Down
2 changes: 1 addition & 1 deletion src/arch/x86/transitions/librm_test.c
Expand Up @@ -97,7 +97,7 @@ static void librm_test_exec ( void ) {
/* Profile complete real-mode call cycle */
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
profile_start ( &real_call_profiler );
__asm__ __volatile__ ( REAL_CODE ( "" ) );
__asm__ __volatile__ ( REAL_CODE ( "" ) : );
profile_stop ( &real_call_profiler );
}

Expand Down

0 comments on commit bc85368

Please sign in to comment.