]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
bug/x86/arm: Align bug_frames sections.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Wed, 7 Sep 2016 15:57:05 +0000 (11:57 -0400)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 23 Sep 2016 16:39:46 +0000 (12:39 -0400)
Most of the WARN_ON or BUG_ON sections are properly aligned on
x86. However on ARM and on x86 assembler the macros don't include
any alignment information - hence they end up being the default
byte granularity.

On ARM32 it is paramount that the alignment is word-size (4)
otherwise if one tries to use (uint32_t*) access (such
as livepatch ELF relocations) we get a Data Abort.

Enforcing bug_frames to have the proper alignment across all
architectures and in both C and x86 makes them all the same.

Furthermore on x86 the bloat-o-meter detects that with this
change:

add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
function                                     old     new   delta

On ARM32:
add/remove: 1/0 grow/shrink: 0/1 up/down: 384/-288 (96)
function                                     old     new   delta
gnttab_unpopulate_status_frames                -     384    +384
do_grant_table_op                          10808   10520    -288

And ARM64:
add/remove: 1/2 grow/shrink: 0/1 up/down: 4164/-4236 (-72)
function                                     old     new   delta
gnttab_map_grant_ref                           -    4164   +4164
do_grant_table_op                           9892    9836     -56
grant_map_exists                             300       -    -300
__gnttab_map_grant_ref                      3880       -   -3880

Reviewed-by: Julien Grall <julien.grall@arm.com>
Acked-by: Jan Beulich <jbeulich@suse.com> [x86 parts]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
xen/arch/x86/xen.lds.S
xen/include/asm-arm/bug.h
xen/include/asm-x86/bug.h

index d903c31d9dfee02354bc663472e6b02a3bfcb888..7676de9c9e4f5e04fe867c703361a9471cd86f05 100644 (file)
@@ -79,7 +79,6 @@ SECTIONS
   .rodata : {
        _srodata = .;
        /* Bug frames table */
-       . = ALIGN(4);
        __start_bug_frames = .;
        *(.bug_frames.0)
        __stop_bug_frames_0 = .;
index 68353e1748b98703cad590411c179a2a83581e91..4704e2d85866c4b3afb83808c6818927d08ba612 100644 (file)
@@ -52,6 +52,7 @@ struct bug_frame {
          ".popsection\n"                                                    \
          ".pushsection .bug_frames." __stringify(type) ", \"a\", %progbits\n"\
          "4:\n"                                                             \
+         ".p2align 2\n"                                                     \
          ".long (1b - 4b)\n"                                                \
          ".long (2b - 4b)\n"                                                \
          ".long (3b - 4b)\n"                                                \
index c5d2d4c8325f847f01cb86d3ac58f1e371accd88..9bb4a194202f9f09ef9769a20525a574182122c6 100644 (file)
@@ -98,6 +98,7 @@ extern const struct bug_frame __start_bug_frames[],
     .popsection
 
     .pushsection .bug_frames.\type, "a", @progbits
+        .p2align 2
         .L\@bf:
         .long (.L\@ud - .L\@bf) + \
                ((\line >> BUG_LINE_LO_WIDTH) << BUG_DISP_WIDTH)