• Ard Biesheuvel's avatar
    ARM: 8429/1: disable GCC SRA optimization · fa0fa9cf
    Ard Biesheuvel authored
    commit a077224f upstream.
    
    While working on the 32-bit ARM port of UEFI, I noticed a strange
    corruption in the kernel log. The following snprintf() statement
    (in drivers/firmware/efi/efi.c:efi_md_typeattr_format())
    
    	snprintf(pos, size, "|%3s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
    
    was producing the following output in the log:
    
    	|    |   |   |   |    |WB|WT|WC|UC]
    	|    |   |   |   |    |WB|WT|WC|UC]
    	|    |   |   |   |    |WB|WT|WC|UC]
    	|RUN|   |   |   |    |WB|WT|WC|UC]*
    	|RUN|   |   |   |    |WB|WT|WC|UC]*
    	|    |   |   |   |    |WB|WT|WC|UC]
    	|RUN|   |   |   |    |WB|WT|WC|UC]*
    	|    |   |   |   |    |WB|WT|WC|UC]
    	|RUN|   |   |   |    |   |   |   |UC]
    	|RUN|   |   |   |    |   |   |   |UC]
    
    As it turns out, this is caused by incorrect code being emitted for
    the string() function in lib/vsprintf.c. The following code
    
    	if (!(spec.flags & LEFT)) {
    		while (len < spec.field_width--) {
    			if (buf < end)
    				*buf = ' ';
    			++buf;
    		}
    	}
    	for (i = 0; i < len; ++i) {
    		if (buf < end)
    			*buf = *s;
    		++buf; ++s;
    	}
    	while (len < spec.field_width--) {
    		if (buf < end)
    			*buf = ' ';
    		++buf;
    	}
    
    when called with len == 0, triggers an issue in the GCC SRA optimization
    pass (Scalar Replacement of Aggregates), which handles promotion of signed
    struct members incorrectly. This is a known but as yet unresolved issue.
    (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65932). In this particular
    case, it is causing the second while loop to be executed erroneously a
    single time, causing the additional space characters to be printed.
    
    So disable the optimization by passing -fno-ipa-sra.
    Acked-by: default avatarNicolas Pitre <nico@linaro.org>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    [ luis: backported to 3.16: adjusted context ]
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    fa0fa9cf
Makefile 12.2 KB