Optimizations for purgatory

Matthew McClintock msm at freescale.com
Wed Sep 15 16:00:02 EDT 2010


On Sep 15, 2010, at 1:05 PM, Eric W. Biederman wrote:

> Matthew McClintock <msm at freescale.com> writes:
>> 1) Is there any reason we don't just use -O0 instead of -0s? This
>> would provide a consistent set of compiler optimization flags across
>> all versions of gcc and we don't have to worry about a flag being
>> added or removed across versions. Or perhaps explicitly list all
>> desired flags?
> 
> So -O0 should do no optimization.

Right, a consistent set of optimizations (none) =)

> Last I looked the trick with the
> purgatory code was to compile it cleanly enough that we had support of
> the different relocation types needed in order to relocate the code
> at link time.  Usually this winds up being a small subset of the
> linking types of what the architecture supports.

AFAICT, it's not the linking types themselves. On ppc kexec-tools will die() if it encounters an unknown relocation type. I have also confirmed this with objdump -r. However, I must admit my naivety on the subject so I could be missing something here.

> 
>> 2) Has anyone else experienced issue with purgatory code not being
>> generated correctly? Specifically looking at a disassebly it looks
>> like -freorder-blocks is changed how functions return. On ppc for
>> example it appears that the functions are not returning using the link
>> register and instead are just branching.
> 
> The only problem I have previously seen is having an unsupported
> relocation type.  Can you confirm that isn't happening.  Ultimately
> if your gcc isn't compiling the code correctly unless we understand
> exactly why that doesn't work we can't make a sensible judgement
> on a good work around.

I confirmed 'objdump -r purgatory/purgatory.ro' does not have any entries covered by machine_apply_elf_rel(). I took some time to look at the assembly itself too and I notice one thing in common with the code that does not work. Basically, some functions don't use the link register to return... see below for a quick snippet:

Bad broken purgatory (with -Os):

00000000 <verify_sha256_digest>:
       0:       94 21 ff 50     stwu    r1,-176(r1)
       4:       7c 08 02 a6     mflr    r0
       8:       90 01 00 b4     stw     r0,180(r1)
       c:       bf a1 00 a4     stmw    r29,164(r1)
...[snip]...
     11c:       48 00 00 01     bl      11c <verify_sha256_digest+0x11c>
     120:       48 00 00 00     b       120 <verify_sha256_digest+0x120>
     124:       39 61 00 b0     addi    r11,r1,176
     128:       48 00 00 00     b       128 <verify_sha256_digest+0x128>  <-- Not using the link register return...

Good working purgatory (with -O0):

00000000 <verify_sha256_digest>:
       0:       94 21 ff 50     stwu    r1,-176(r1)
       4:       7c 08 02 a6     mflr    r0
       8:       90 01 00 b4     stw     r0,180(r1)
       c:       93 e1 00 ac     stw     r31,172(r1)
...[snip]...
     1c8:       7c 08 03 a6     mtlr    r0
     1cc:       83 eb ff fc     lwz     r31,-4(r11)
     1d0:       7d 61 5b 78     mr      r1,r11
     1d4:       4e 80 00 20     blr


-M






More information about the kexec mailing list