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: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH] pc-bios/s390-ccw: build s390 bios with -fno-zero-initialized-in-bss
Date: Mon, 20 Nov 2017 11:16:37 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0

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:


#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]