On 2023-07-19 05:10:48+0800, Zhangjin Wu wrote:
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 easier 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:
/* 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
The later one is smaller, here applies it.
arch/powerpc/include/asm/vdso/gettimeofday.h file uses the smaller method for do_syscall_2() too.
Signed-off-by: Zhangjin Wu falcon@tinylab.org
tools/include/nolibc/arch-powerpc.h | 156 ++++++++++++++++++++++++++++
This also should be added to nolibc/arch.h.
1 file changed, 156 insertions(+) create mode 100644 tools/include/nolibc/arch-powerpc.h
diff --git a/tools/include/nolibc/arch-powerpc.h b/tools/include/nolibc/arch-powerpc.h new file mode 100644 index 000000000000..100ec0f412dc --- /dev/null +++ b/tools/include/nolibc/arch-powerpc.h @@ -0,0 +1,156 @@ +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */ +/*
- PowerPC specific definitions for NOLIBC
- Copyright (C) 2023 Zhangjin Wu falcon@tinylab.org
If it is taken from musl, shouldn't there also be a musl copyright?
[..]