• Zhangjin Wu's avatar
    tools/nolibc: add support for powerpc · 0cb0675e
    Zhangjin Wu authored
    Both syscall declarations and _start code definition are added for
    powerpc to nolibc.
    
    Like mips, powerpc uses a register (exactly, the summary overflow bit)
    to record the error occurred, and uses another register to return the
    value [1]. So, the return value of every syscall declaration must be
    normalized to match the __sysret() helper, return -value when there is
    an error, otheriwse, return value directly.
    
    Glibc and musl use different methods to check the summary overflow bit,
    glibc (sysdeps/unix/sysv/linux/powerpc/sysdep.h) saves the cr register
    to r0 at first, and then check the summary overflow bit in cr0:
    
        mfcr r0
        r0 & (1 << 28) ? -r3 : r3
    
        -->
    
        10003c14:       7c 00 00 26     mfcr    r0
        10003c18:       74 09 10 00     andis.  r9,r0,4096
        10003c1c:       41 82 00 08     beq     0x10003c24
        10003c20:       7c 63 00 d0     neg     r3,r3
    
    Musl (arch/powerpc/syscall_arch.h) directly checks the summary overflow
    bit with the 'bns' instruction, it is smaller:
    
        /* no summary overflow bit means no error, return value directly */
        bns+ 1f
        /* otherwise, return negated value */
        neg r3, r3
        1:
    
        -->
    
        10000418:       40 a3 00 08     bns     0x10000420
        1000041c:       7c 63 00 d0     neg     r3,r3
    
    Like musl, Linux (arch/powerpc/include/asm/vdso/gettimeofday.h) uses the
    same method for do_syscall_2() too.
    
    Here applies the second method to get smaller size.
    
    [1]: https://man7.org/linux/man-pages/man2/syscall.2.htmlReviewed-by: default avatarThomas Weißschuh <linux@weissschuh.net>
    Signed-off-by: default avatarZhangjin Wu <falcon@tinylab.org>
    Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
    0cb0675e
arch.h 1.23 KB