[PATCH v4] powerpc64[le]: Fix CFI and LR save address for asm syscalls [BZ #28532]

Matheus Castanho msc@linux.ibm.com
Tue Nov 30 18:22:09 GMT 2021


Paul E Murphy <murphyp@linux.ibm.com> writes:

> On 11/29/21 1:42 PM, Matheus Castanho wrote:
>> Changes on v4:
>>   - Use cfi_rel_offset for LR
>> Changes on v3:
>>   - Use cfi_rel_offset for R31
>> Changes on v2:
>>   - Save LR in the caller's frame
>> -- 8< --
>> Syscalls based on the assembly templates are missing CFI for r31, which gets
>> clobbered when scv is used, and info for LR is inaccurate, placed in the wrong
>> LOC and not using the proper offset. LR was also being saved to the callee's
>> frame, while the ABI mandates it to be saved to the caller's frame. These are
>> fixed by this commit.
>> After this change:
>> $ readelf -wF libc.so.6 | grep 0004b9d4.. -A 7 && objdump --disassemble=kill
>> libc.so.6
>> 00004a48 0000000000000020 00004a4c FDE cie=00000000 pc=000000000004b9d4..000000000004ba3c
>>     LOC           CFA      r31   ra
>> 000000000004b9d4 r1+0     u     u
>> 000000000004b9e4 r1+48    u     u
>> 000000000004b9e8 r1+48    c-16  u
>> 000000000004b9fc r1+48    c-16  c+16
>> 000000000004ba08 r1+48    c-16
>> 000000000004ba18 r1+48    u
>> 000000000004ba1c r1+0     u
>> libc.so.6:     file format elf64-powerpcle
>> Disassembly of section .text:
>> 000000000004b9d4 <kill>:
>>     4b9d4:       1f 00 4c 3c     addis   r2,r12,31
>>     4b9d8:       2c c3 42 38     addi    r2,r2,-15572
>>     4b9dc:       25 00 00 38     li      r0,37
>>     4b9e0:       d1 ff 21 f8     stdu    r1,-48(r1)
>>     4b9e4:       20 00 e1 fb     std     r31,32(r1)
>>     4b9e8:       98 8f ed eb     ld      r31,-28776(r13)
>>     4b9ec:       10 00 ff 77     andis.  r31,r31,16
>>     4b9f0:       1c 00 82 41     beq     4ba0c <kill+0x38>
>>     4b9f4:       a6 02 28 7d     mflr    r9
>>     4b9f8:       40 00 21 f9     std     r9,64(r1)
>>     4b9fc:       01 00 00 44     scv     0
>>     4ba00:       40 00 21 e9     ld      r9,64(r1)
>>     4ba04:       a6 03 28 7d     mtlr    r9
>>     4ba08:       08 00 00 48     b       4ba10 <kill+0x3c>
>>     4ba0c:       02 00 00 44     sc
>>     4ba10:       00 00 bf 2e     cmpdi   cr5,r31,0
>>     4ba14:       20 00 e1 eb     ld      r31,32(r1)
>>     4ba18:       30 00 21 38     addi    r1,r1,48
>>     4ba1c:       18 00 96 41     beq     cr5,4ba34 <kill+0x60>
>>     4ba20:       01 f0 20 39     li      r9,-4095
>>     4ba24:       40 48 23 7c     cmpld   r3,r9
>>     4ba28:       20 00 e0 4d     bltlr+
>>     4ba2c:       d0 00 63 7c     neg     r3,r3
>>     4ba30:       08 00 00 48     b       4ba38 <kill+0x64>
>>     4ba34:       20 00 e3 4c     bnslr+
>>     4ba38:       c8 32 fe 4b     b       2ed00 <__syscall_error>
>>          ...
>>     4ba44:       40 20 0c 00     .long 0xc2040
>>     4ba48:       68 00 00 00     .long 0x68
>>     4ba4c:       06 00 5f 5f     rlwnm   r31,r26,r0,0,3
>>     4ba50:       6b 69 6c 6c     xoris   r12,r3,26987
>> ---
>
>
> Thanks, LGTM.

Pushed as d120fb9941be1fb1934f0b50c6ad64e4c5e404fb

Thanks,
Matheus Castanho


More information about the Libc-alpha mailing list