qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] pc-bios/s390-ccw: build s390 bios with -fno-zer


From: Christian Borntraeger
Subject: Re: [Qemu-devel] [PATCH] pc-bios/s390-ccw: build s390 bios with -fno-zero-initialized-in-bss
Date: Mon, 20 Nov 2017 11:19:04 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0


On 11/20/2017 11:16 AM, Alexander Graf wrote:
> On 11/20/2017 11:02 AM, Christian Borntraeger wrote:
>>
>> On 11/20/2017 10:29 AM, Alexander Graf wrote:
>>> On 11/20/2017 10:27 AM, Christian Borntraeger wrote:
>>>> On 11/20/2017 10:19 AM, Alexander Graf wrote:
>>>>> On 11/20/2017 10:15 AM, Christian Borntraeger wrote:
>>>>>> The QEMU ELF loader does not initialize the bss segment. This has
>>>>>> triggered several bugs in the past, e.g. see commit 5d739a4787a5
>>>>>> ("s390-ccw.img: Fix sporadic errors with ccw boot image - initialize
>>>>>> css").
>>>>>>
>>>>>> Instead of fixing these things one-by-one we can build the BIOS
>>>>>> with -fno-zero-initialized-in-bss. This will move the zero variables
>>>>>> also into the data segment, which is then part of a LOAD section.
>>>>> Doesn't this bloat the firmware? Why don't we just manually clear bss in 
>>>>> the firmware itself? It's what all other firmwares do :)
>>>> Yes the proper fix is to initialize bss in the bios itself.
>>>> I was trying to come up with something for 2.11, but since the patch does 
>>>> not solve the original issues, lets drop it.
>>>
>>> Initializing bss is quite simple. You can probably even do it from C. Just 
>>> set two variables before and after .bss in the linker script and memset(0) 
>>> from start to end :).
>> Yes, I know but then we have to change the build process to use a linker 
>> script.(we rely on the default
>> linker script right now).
> 
> 
> I'm not sure how common generic linker scripts are, but in our default script 
> we have existing markers for bss and end. You can look at the default linker 
> script using gcc <c file> -Wl,-verbose. This simple source worked for me:

Are we sure that the range between __bss_start and _end does not include other 
elements (besides bss)?
> 
> 
> #include <stdio.h>
> 
> extern char __bss_start[];
> extern char _end[];
> 
> int main(void)
> {
>     printf("BSS size: %lx\n", (long)_end - (long)__bss_start);
>     return 0;
> }
> 
> 
> 
> Alex
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]