[PATCH] x86: Drop _X86EMU_env definition when CONFIG_BIOSEMU is used

With x86 we can execute an option ROM either natively or using the x86 emulator (if enabled with CONFIG_BIOSEMU). Both of these share the _X86EMU_env variable, with the native code using it to hold register state during interrupt processing.
At present, in 32-bit U-Boot, the variable is declared twice, once in common code and once in code only compiled with CONFIG_BIOSEMU.
With GCC 11 this causes a 'multiple definitions' error on boards with CONFIG_BIOSEMU.
Drop the emulator definition when CONFIG_BIOSEMU is used.
Signed-off-by: Bin Meng bmeng.cn@gmail.com ---
arch/x86/lib/bios.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/x86/lib/bios.c b/arch/x86/lib/bios.c index fbdc3b04e3..98cc05de2e 100644 --- a/arch/x86/lib/bios.c +++ b/arch/x86/lib/bios.c @@ -23,7 +23,9 @@ static int (*int_handler[256])(void);
/* to have a common register file for interrupt handlers */ +#ifndef CONFIG_BIOSEMU X86EMU_sysEnv _X86EMU_env; +#endif
asmlinkage void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx, u32 esi, u32 edi);

On Wed, Jul 07, 2021 at 03:36:26PM +0800, Bin Meng wrote:
With x86 we can execute an option ROM either natively or using the x86 emulator (if enabled with CONFIG_BIOSEMU). Both of these share the _X86EMU_env variable, with the native code using it to hold register state during interrupt processing.
At present, in 32-bit U-Boot, the variable is declared twice, once in common code and once in code only compiled with CONFIG_BIOSEMU.
With GCC 11 this causes a 'multiple definitions' error on boards with CONFIG_BIOSEMU.
Drop the emulator definition when CONFIG_BIOSEMU is used.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Applied to u-boot/master, thanks!

Hi Bin,
On Wed, 7 Jul 2021 at 01:36, Bin Meng bmeng.cn@gmail.com wrote:
With x86 we can execute an option ROM either natively or using the x86 emulator (if enabled with CONFIG_BIOSEMU). Both of these share the _X86EMU_env variable, with the native code using it to hold register state during interrupt processing.
At present, in 32-bit U-Boot, the variable is declared twice, once in common code and once in code only compiled with CONFIG_BIOSEMU.
With GCC 11 this causes a 'multiple definitions' error on boards with CONFIG_BIOSEMU.
Drop the emulator definition when CONFIG_BIOSEMU is used.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/lib/bios.c | 2 ++ 1 file changed, 2 insertions(+)
This seems a bit hacky. Should we define a new Kconfig that both use, then put this declaration in a common file?
diff --git a/arch/x86/lib/bios.c b/arch/x86/lib/bios.c index fbdc3b04e3..98cc05de2e 100644 --- a/arch/x86/lib/bios.c +++ b/arch/x86/lib/bios.c @@ -23,7 +23,9 @@ static int (*int_handler[256])(void);
/* to have a common register file for interrupt handlers */ +#ifndef CONFIG_BIOSEMU X86EMU_sysEnv _X86EMU_env; +#endif
asmlinkage void (*realmode_call)(u32 addr, u32 eax, u32 ebx, u32 ecx, u32 edx, u32 esi, u32 edi); -- 2.25.1
Regards, Simon

Hi Simon,
On Thu, Jul 8, 2021 at 1:35 AM Simon Glass sjg@chromium.org wrote:
Hi Bin,
On Wed, 7 Jul 2021 at 01:36, Bin Meng bmeng.cn@gmail.com wrote:
With x86 we can execute an option ROM either natively or using the x86 emulator (if enabled with CONFIG_BIOSEMU). Both of these share the _X86EMU_env variable, with the native code using it to hold register state during interrupt processing.
At present, in 32-bit U-Boot, the variable is declared twice, once in common code and once in code only compiled with CONFIG_BIOSEMU.
With GCC 11 this causes a 'multiple definitions' error on boards with CONFIG_BIOSEMU.
Drop the emulator definition when CONFIG_BIOSEMU is used.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/lib/bios.c | 2 ++ 1 file changed, 2 insertions(+)
This seems a bit hacky. Should we define a new Kconfig that both use, then put this declaration in a common file?
Yes, that's what I thought so. We can do this later. Currently this is to unblock the GCC 11 CI testing.
Regards, Bin
participants (3)
-
Bin Meng
-
Simon Glass
-
Tom Rini