[PATCH] Xen: fix EFI stub wchar_t size warning of arm32 building

Wei Chen posted 1 patch 1 year, 9 months ago
Test gitlab-ci failed
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20220701101358.954527-1-wei.chen@arm.com
There is a newer version of this series
xen/arch/arm/efi/Makefile | 4 ++++
1 file changed, 4 insertions(+)
[PATCH] Xen: fix EFI stub wchar_t size warning of arm32 building
Posted by Wei Chen 1 year, 9 months ago
Xen uses "-fshort-wchar" in CFLAGS for EFI common code. Arm32
is using stub.c of EFI common code for EFI stub functions. But
"-fshort-wchar" CFLAG will cause a warning when build stub.c
for Arm32:
"arm-linux-gnueabihf-ld: warning: arch/arm/efi/built_in.o uses
2-byte wchar_t yet the output is to use 4-byte wchar_t; use of
wchar_t values across objects may fail"

This is because the "-fshort-wchar" flag causes GCC to generate
code that is not binary compatible with code generated without
that flag. Why this warning hasn't been triggered in Arm64 is
because Arm64 does not use wchar type directly in any code for
parameters, variables and return values. And in EFI code, wchar
has been replaced by CHAR16 (the UEFI "abstraction" of wchar_t).
CHAR16 has been specified as unsigned short type in typedef, the
"-fshort-wchar" flag will not affect CHAR16. So Arm64 object
files are exactly the same with "-fshort-wchar" and without
"-fshort-wchar".

We are also not using wchar in Arm32 codes, but Arm32 will embed
ABI information in ".ARM.attributes" section. This section stores
some object file attributes, like ABI version, CPU arch and etc.
And wchar size is described in this section by "Tag_ABI_PCS_wchar_t"
too. Tag_ABI_PCS_wchar_t is 2 for object files with "-fshort-wchar",
but for object files without "-fshort-wchar" is 4. Arm32 GCC
ld will check this tag, and throw above warning when it finds
the object files have different Tag_ABI_PCS_wchar_t values.

As gnu-efi-3.0 use the GCC option "-fshort-wchar" to force wchar
to use short integers (2 bytes) instead of integers (4 bytes).
So keep "-fshort-wchar" for Xen EFI code is reasonable. So in
this patch, we add "-fno-short-wchar" to override "-fshort-wchar"
for Arm32 to remove above warning.

Reported-and-Suggested-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Wei Chen <wei.chen@arm.com>
---
 xen/arch/arm/efi/Makefile | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/xen/arch/arm/efi/Makefile b/xen/arch/arm/efi/Makefile
index dffe72e589..b06fb96c1f 100644
--- a/xen/arch/arm/efi/Makefile
+++ b/xen/arch/arm/efi/Makefile
@@ -1,5 +1,9 @@
 include $(srctree)/common/efi/efi-common.mk
 
+ifeq ($(CONFIG_ARM_32),y)
+CFLAGS-y += -fno-short-wchar
+endif
+
 ifeq ($(CONFIG_ARM_EFI),y)
 obj-y += $(EFIOBJ-y)
 obj-$(CONFIG_ACPI) +=  efi-dom0.init.o
-- 
2.25.1
Re: [PATCH] Xen: fix EFI stub wchar_t size warning of arm32 building
Posted by Jan Beulich 1 year, 9 months ago
On 01.07.2022 12:13, Wei Chen wrote:
> Xen uses "-fshort-wchar" in CFLAGS for EFI common code. Arm32
> is using stub.c of EFI common code for EFI stub functions. But
> "-fshort-wchar" CFLAG will cause a warning when build stub.c
> for Arm32:
> "arm-linux-gnueabihf-ld: warning: arch/arm/efi/built_in.o uses
> 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of
> wchar_t values across objects may fail"
> 
> This is because the "-fshort-wchar" flag causes GCC to generate
> code that is not binary compatible with code generated without
> that flag. Why this warning hasn't been triggered in Arm64 is
> because Arm64 does not use wchar type directly in any code for
> parameters, variables and return values. And in EFI code, wchar
> has been replaced by CHAR16 (the UEFI "abstraction" of wchar_t).
> CHAR16 has been specified as unsigned short type in typedef, the
> "-fshort-wchar" flag will not affect CHAR16. So Arm64 object
> files are exactly the same with "-fshort-wchar" and without
> "-fshort-wchar".
> 
> We are also not using wchar in Arm32 codes, but Arm32 will embed
> ABI information in ".ARM.attributes" section. This section stores
> some object file attributes, like ABI version, CPU arch and etc.
> And wchar size is described in this section by "Tag_ABI_PCS_wchar_t"
> too. Tag_ABI_PCS_wchar_t is 2 for object files with "-fshort-wchar",
> but for object files without "-fshort-wchar" is 4. Arm32 GCC
> ld will check this tag, and throw above warning when it finds
> the object files have different Tag_ABI_PCS_wchar_t values.
> 
> As gnu-efi-3.0 use the GCC option "-fshort-wchar" to force wchar
> to use short integers (2 bytes) instead of integers (4 bytes).
> So keep "-fshort-wchar" for Xen EFI code is reasonable. So in
> this patch, we add "-fno-short-wchar" to override "-fshort-wchar"
> for Arm32 to remove above warning.
> 
> Reported-and-Suggested-by: Jan Beulich <jbeulich@suse.com>

Interesting new tag (but why not).

> Signed-off-by: Wei Chen <wei.chen@arm.com>
> ---
>  xen/arch/arm/efi/Makefile | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/xen/arch/arm/efi/Makefile b/xen/arch/arm/efi/Makefile
> index dffe72e589..b06fb96c1f 100644
> --- a/xen/arch/arm/efi/Makefile
> +++ b/xen/arch/arm/efi/Makefile
> @@ -1,5 +1,9 @@
>  include $(srctree)/common/efi/efi-common.mk
>  
> +ifeq ($(CONFIG_ARM_32),y)
> +CFLAGS-y += -fno-short-wchar
> +endif

Simply

CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar

? But, as suggested, perhaps further

$(obj)/stub.o: CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar

to make sure we'd notice any other uses / issues here. After all it
is - at least in theory - possible that Arm32 would also gain EFI
support, and then it would be a problem if the other ("real") files
were compiled that way (albeit I think the issue would be easily
noticeable, as I don't think things would build that way).

Jan
Re: [PATCH] Xen: fix EFI stub wchar_t size warning of arm32 building
Posted by Julien Grall 1 year, 9 months ago

On 01/07/2022 11:34, Jan Beulich wrote:
>> Signed-off-by: Wei Chen <wei.chen@arm.com>
>> ---
>>   xen/arch/arm/efi/Makefile | 4 ++++
>>   1 file changed, 4 insertions(+)
>>
>> diff --git a/xen/arch/arm/efi/Makefile b/xen/arch/arm/efi/Makefile
>> index dffe72e589..b06fb96c1f 100644
>> --- a/xen/arch/arm/efi/Makefile
>> +++ b/xen/arch/arm/efi/Makefile
>> @@ -1,5 +1,9 @@
>>   include $(srctree)/common/efi/efi-common.mk
>>   
>> +ifeq ($(CONFIG_ARM_32),y)
>> +CFLAGS-y += -fno-short-wchar
>> +endif
> 
> Simply
> 
> CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar
> 
> ? But, as suggested, perhaps further
> 
> $(obj)/stub.o: CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar
> 
> to make sure we'd notice any other uses / issues here. After all it
> is - at least in theory - possible that Arm32 would also gain EFI
> support, and then it would be a problem if the other ("real") files
> were compiled that way (albeit I think the issue would be easily
> noticeable, as I don't think things would build that way).

Instead of CONFIG_ARM_32, I would use CONFIG_ARM_EFI. So this would also 
work if we want to disable EFI on arm64 or enable on arm32.

Cheers,

-- 
Julien Grall
RE: [PATCH] Xen: fix EFI stub wchar_t size warning of arm32 building
Posted by Wei Chen 1 year, 9 months ago
Hi Julien,

> -----Original Message-----
> From: Julien Grall <julien@xen.org>
> Sent: 2022年7月1日 20:58
> To: Jan Beulich <jbeulich@suse.com>; Wei Chen <Wei.Chen@arm.com>
> Cc: Stefano Stabellini <sstabellini@kernel.org>; Bertrand Marquis
> <Bertrand.Marquis@arm.com>; Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>;
> xen-devel@lists.xenproject.org
> Subject: Re: [PATCH] Xen: fix EFI stub wchar_t size warning of arm32
> building
> 
> 
> 
> On 01/07/2022 11:34, Jan Beulich wrote:
> >> Signed-off-by: Wei Chen <wei.chen@arm.com>
> >> ---
> >>   xen/arch/arm/efi/Makefile | 4 ++++
> >>   1 file changed, 4 insertions(+)
> >>
> >> diff --git a/xen/arch/arm/efi/Makefile b/xen/arch/arm/efi/Makefile
> >> index dffe72e589..b06fb96c1f 100644
> >> --- a/xen/arch/arm/efi/Makefile
> >> +++ b/xen/arch/arm/efi/Makefile
> >> @@ -1,5 +1,9 @@
> >>   include $(srctree)/common/efi/efi-common.mk
> >>
> >> +ifeq ($(CONFIG_ARM_32),y)
> >> +CFLAGS-y += -fno-short-wchar
> >> +endif
> >
> > Simply
> >
> > CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar
> >
> > ? But, as suggested, perhaps further
> >
> > $(obj)/stub.o: CFLAGS-$(CONFIG_ARM_32) += -fno-short-wchar
> >
> > to make sure we'd notice any other uses / issues here. After all it
> > is - at least in theory - possible that Arm32 would also gain EFI
> > support, and then it would be a problem if the other ("real") files
> > were compiled that way (albeit I think the issue would be easily
> > noticeable, as I don't think things would build that way).
> 
> Instead of CONFIG_ARM_32, I would use CONFIG_ARM_EFI. So this would also
> work if we want to disable EFI on arm64 or enable on arm32.
> 

We have already used CONFIG_ARM_EFI to distinguish EFI objects and
stub objects for Arm, so maybe we just need to add
"$(obj)/stub.o: CFLAGS-y += -fno-short-wchar" to:

ifeq ($(CONFIG_ARM_EFI),y)
..
else
...
$(obj)/stub.o: CFLAGS-y += -fno-short-wchar
obj-y += stub.o
endif

Thanks,
Wei Chen

> Cheers,
> 
> --
> Julien Grall