92199222 | 11-Oct-2023 |
Thomas Weißschuh <linux@weissschuh.net> |
tools/nolibc: mark start_c as weak
Otherwise the different instances of _start_c from each compilation unit will lead to linker errors:
/usr/bin/ld: /tmp/ccSNvRqs.o: in function `_start_c': nolibc-
tools/nolibc: mark start_c as weak
Otherwise the different instances of _start_c from each compilation unit will lead to linker errors:
/usr/bin/ld: /tmp/ccSNvRqs.o: in function `_start_c': nolibc-test-foo.c:(.text.nolibc_memset+0x9): multiple definition of `_start_c'; /tmp/ccG25101.o:nolibc-test.c:(.text+0x1ea3): first defined here
Fixes: 17336755150b ("tools/nolibc: add new crt.h with _start_c") Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/lkml/20231012-nolibc-start_c-multiple-v1-1-fbfc73e0283f@weissschuh.net/ Link: https://lore.kernel.org/lkml/20231012-nolibc-linkage-test-v1-1-315e682768b4@weissschuh.net/ Acked-by: Willy Tarreau <w@1wt.eu>
show more ...
|
556fb713 | 15-Aug-2023 |
Willy Tarreau <w@1wt.eu> |
tools/nolibc: avoid undesired casts in the __sysret() macro
Having __sysret() as an inline function has the unfortunate effect of adding casts and large constants comparisons after the syscall retur
tools/nolibc: avoid undesired casts in the __sysret() macro
Having __sysret() as an inline function has the unfortunate effect of adding casts and large constants comparisons after the syscall returns that significantly inflate some light code that's otherwise syscall- heavy. Even nolibc-test grew by ~1%.
Let's switch back to a macro for this, and use it only with signed arguments. Note that it is also possible to design a slightly more complex macro covering unsigned and pointers but we only have 3 such syscalls so it is pointless, and these were just addressed not to use this macro anymore. Now for the argument (the local variable containing the syscall return value), any negative value is an error, that results in -1 being returned and errno to be assigned the opposite value.
This may be revisited again in the future if really needed but for now let's get back to something sane.
Fixes: 428905da6ec4 ("tools/nolibc: sys.h: add a syscall return helper") Link: https://lore.kernel.org/lkml/20230806095846.GB10627@1wt.eu/ Link: https://lore.kernel.org/lkml/ZNKOJY+g66nkIyvv@1wt.eu/ Cc: Zhangjin Wu <falcon@tinylab.org> Cc: David Laight <David.Laight@ACULAB.COM> Cc: Thomas Weißschuh <thomas@t-8ch.de> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
fb01ff63 | 15-Aug-2023 |
Willy Tarreau <w@1wt.eu> |
tools/nolibc: keep brk(), sbrk(), mmap() away from __sysret()
The __sysret() function causes some undesirable casts so we'll revert it. In order to keep it simple it will now only support integer re
tools/nolibc: keep brk(), sbrk(), mmap() away from __sysret()
The __sysret() function causes some undesirable casts so we'll revert it. In order to keep it simple it will now only support integer return values like in the past, so we must basically revert the changes that were made to these 3 syscalls which return a pointer so that they simply rely on their own test and the SET_ERRNO() macro.
Fixes: 4201cfce15fe ("tools/nolibc: clean up sbrk() routine") Fixes: 924e9539aeaa ("tools/nolibc: clean up mmap() routine") Fixes: d27447bc2e0a ("tools/nolibc: sys.h: apply __sysret() helper") Link: https://lore.kernel.org/lkml/20230806095846.GB10627@1wt.eu/ Link: https://lore.kernel.org/lkml/ZNKOJY+g66nkIyvv@1wt.eu/ Cc: Zhangjin Wu <falcon@tinylab.org> Cc: David Laight <David.Laight@ACULAB.COM> Cc: Thomas Weißschuh <thomas@t-8ch.de> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
872dbfa0 | 07-Aug-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: silence ppc64 compile warnings
Silence the following warnings reported by the new -Wall -Wextra options with pure assembly code.
In file included from sysroot/powerpc/include/stdi
tools/nolibc: silence ppc64 compile warnings
Silence the following warnings reported by the new -Wall -Wextra options with pure assembly code.
In file included from sysroot/powerpc/include/stdio.h:13, from nolibc-test.c:13: sysroot/powerpc/include/arch.h: In function '_start': sysroot/powerpc/include/arch.h:192:32: warning: unused variable 'r2' [-Wunused-variable] 192 | register volatile long r2 __asm__ ("r2") = (void *)&TOC - (void *)_start; | ^~ sysroot/powerpc/include/arch.h:187:97: warning: optimization may eliminate reads and/or writes to register variables [-Wvolatile-register-var] 187 | void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) | ^~~~~~
Since only elfv2 ABI requires to save the TOC/GOT pointer to r2 register, when using elfv1 ABI, the old C code is simply ignored by the compiler, but the compiler can not ignore the inline assembly code and will introduce build failure or running segfaults. So, let's further only add the new assembly code for elfv2 ABI with the checking of _CALL_ELF == 2.
Link: https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.pdf Link: https://www.llvm.org/devmtg/2014-04/PDFs/Talks/Euro-LLVM-2014-Weigand.pdf Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
dcb677c3 | 05-Aug-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: stackprotector.h: make __stack_chk_init static
This allows to generate smaller text/data/dec size.
As the _start_c() function added by crt.h, __stack_chk_init() is called from _start_
tools/nolibc: stackprotector.h: make __stack_chk_init static
This allows to generate smaller text/data/dec size.
As the _start_c() function added by crt.h, __stack_chk_init() is called from _start_c() instead of the assembly _start. So, it is able to mark it with static now.
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
e45ce88e | 05-Aug-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: add support for powerpc64
This follows the 64-bit PowerPC ABI [1], refers to the slides: "A new ABI for little-endian PowerPC64 Design & Implementation" [2] and the musl code in arch/p
tools/nolibc: add support for powerpc64
This follows the 64-bit PowerPC ABI [1], refers to the slides: "A new ABI for little-endian PowerPC64 Design & Implementation" [2] and the musl code in arch/powerpc64/crt_arch.h.
First, stdu and clrrdi are used instead of stwu and clrrwi for powerpc64.
Second, the stack frame size is increased to 32 bytes for powerpc64, 32 bytes is the minimal stack frame size supported described in [2].
Besides, the TOC pointer (GOT pointer) must be saved to r2.
This works on both little endian and big endian 64-bit PowerPC.
[1]: https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.pdf [2]: https://www.llvm.org/devmtg/2014-04/PDFs/Talks/Euro-LLVM-2014-Weigand.pdf
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
0cb0675e | 05-Aug-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: add support for powerpc
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
tools/nolibc: add support for powerpc
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.html
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
202a0bd1 | 03-Aug-2023 |
Thomas Weißschuh <linux@weissschuh.net> |
tools/nolibc: stdint: use __SIZE_TYPE__ for size_t
Otherwise both gcc and clang may generate warnings about type mismatches:
sysroot/mips/include/string.h:12:14: warning: mismatch in argument 1 typ
tools/nolibc: stdint: use __SIZE_TYPE__ for size_t
Otherwise both gcc and clang may generate warnings about type mismatches:
sysroot/mips/include/string.h:12:14: warning: mismatch in argument 1 type of built-in function 'malloc'; expected 'unsigned int' [-Wbuiltin-declaration-mismatch] 12 | static void *malloc(size_t len); | ^~~~~~
The compiler provides __SIZE_TYPE__ as the type that corresponds to size_t (typically "long unsigned int" or "unsigned int"). It was verified to be available at least since gcc-3.4 and clang-3.8, so from now on we'll use this definition for size_t.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/lkml/20230805161929.GA15284@1wt.eu/ Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
04694658 | 03-Aug-2023 |
Thomas Weißschuh <linux@weissschuh.net> |
tools/nolibc: sys: avoid implicit sign cast
getauxval() returns an unsigned long but the overall type of the ternary operator needs to be signed.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.n
tools/nolibc: sys: avoid implicit sign cast
getauxval() returns an unsigned long but the overall type of the ternary operator needs to be signed.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
809145f8 | 03-Aug-2023 |
Thomas Weißschuh <linux@weissschuh.net> |
tools/nolibc: setvbuf: avoid unused parameter warnings
This warning will be enabled later so avoid triggering it.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau
tools/nolibc: setvbuf: avoid unused parameter warnings
This warning will be enabled later so avoid triggering it.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
64077502 | 03-Aug-2023 |
Thomas Weißschuh <linux@weissschuh.net> |
tools/nolibc: fix return type of getpagesize()
It's documented as returning int which is also implemented by glibc and musl, so adopt that return type.
Signed-off-by: Thomas Weißschuh <linux@weisss
tools/nolibc: fix return type of getpagesize()
It's documented as returning int which is also implemented by glibc and musl, so adopt that return type.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
3ec38af6 | 01-Aug-2023 |
Yuan Tan <tanyuan@tinylab.org> |
tools/nolibc: add pipe() and pipe2() support
According to manual page [1], posix spec [2] and source code like arch/mips/kernel/syscall.c, for historic reasons, the sys_pipe() syscall on some archit
tools/nolibc: add pipe() and pipe2() support
According to manual page [1], posix spec [2] and source code like arch/mips/kernel/syscall.c, for historic reasons, the sys_pipe() syscall on some architectures has an unusual calling convention. It returns results in two registers which means there is no need for it to do verify the validity of a userspace pointer argument. Historically that used to be expensive in Linux. These days the performance advantage is negligible.
Nolibc doesn't support the unusual calling convention above, luckily Linux provides a generic sys_pipe2() with an additional flags argument from 2.6.27. If flags is 0, then pipe2() is the same as pipe(). So here we use sys_pipe2() to implement the pipe().
pipe2() is also provided to allow users to use flags argument on demand.
[1]: https://man7.org/linux/man-pages/man2/pipe.2.html [2]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html
Suggested-by: Zhangjin Wu <falcon@tinylab.org> Link: https://lore.kernel.org/all/20230729100401.GA4577@1wt.eu/ Signed-off-by: Yuan Tan <tanyuan@tinylab.org> Reviewed-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
4893c22e | 26-Jul-2023 |
Ryan Roberts <ryan.roberts@arm.com> |
tools/nolibc/stdio: add setvbuf() to set buffering mode
Add a minimal implementation of setvbuf(), which error checks the mode argument (as required by spec) and returns. Since nolibc never buffers
tools/nolibc/stdio: add setvbuf() to set buffering mode
Add a minimal implementation of setvbuf(), which error checks the mode argument (as required by spec) and returns. Since nolibc never buffers output, nothing needs to be done.
The kselftest framework recently added a call to setvbuf(). As a result, any tests that use the kselftest framework and nolibc cause a compiler error due to missing function. This provides an urgent fix for the problem which is preventing arm64 testing on linux-next.
Example:
clang --target=aarch64-linux-gnu -fintegrated-as -Werror=unknown-warning-option -Werror=ignored-optimization-argument -Werror=option-ignored -Werror=unused-command-line-argument --target=aarch64-linux-gnu -fintegrated-as -fno-asynchronous-unwind-tables -fno-ident -s -Os -nostdlib \ -include ../../../../include/nolibc/nolibc.h -I../..\ -static -ffreestanding -Wall za-fork.c build/kselftest/arm64/fp/za-fork-asm.o -o build/kselftest/arm64/fp/za-fork In file included from <built-in>:1: In file included from ./../../../../include/nolibc/nolibc.h:97: In file included from ./../../../../include/nolibc/arch.h:25: ./../../../../include/nolibc/arch-aarch64.h:178:35: warning: unknown attribute 'optimize' ignored [-Wunknown-attributes] void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from za-fork.c:12: ../../kselftest.h:123:2: error: call to undeclared function 'setvbuf'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] setvbuf(stdout, NULL, _IOLBF, 0); ^ ../../kselftest.h:123:24: error: use of undeclared identifier '_IOLBF' setvbuf(stdout, NULL, _IOLBF, 0); ^ 1 warning and 2 errors generated.
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> Reported-by: Linux Kernel Functional Testing <lkft@linaro.org> Link: https://lore.kernel.org/linux-kselftest/CA+G9fYus3Z8r2cg3zLv8uH8MRrzLFVWdnor02SNr=rCz+_WGVg@mail.gmail.com/ Reviewed-by: Mark Brown <broonie@kernel.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
c48d8af2 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: s390: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-o
tools/nolibc: s390: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
eea70cda | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: riscv: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-
tools/nolibc: riscv: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
61bd4621 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: loongarch: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Sig
tools/nolibc: loongarch: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
431b806b | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: mips: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Also clean up the instructions in delayed slots.
Signed
tools/nolibc: mips: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Also clean up the instructions in delayed slots.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
539287d7 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: x86_64: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed
tools/nolibc: x86_64: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
2ab44633 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: i386: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-o
tools/nolibc: i386: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
ded8af47 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: aarch64: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signe
tools/nolibc: aarch64: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
61f98807 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: arm: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-of
tools/nolibc: arm: shrink _start with _start_c
move most of the _start operations to _start_c(), include the stackprotector initialization.
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
06f2a62c | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: crt.h: initialize stack protector
As suggested by Thomas, It is able to move the stackprotector initialization from the assembly _start to the beginning of the new _start_c(). Let's ca
tools/nolibc: crt.h: initialize stack protector
As suggested by Thomas, It is able to move the stackprotector initialization from the assembly _start to the beginning of the new _start_c(). Let's call __stack_chk_init() in _start_c() as a preparation.
Suggested-by: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/lkml/a00284a6-54b1-498c-92aa-44997fa78403@t-8ch.de/ Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|
d7f16723 | 15-Jul-2023 |
Zhangjin Wu <falcon@tinylab.org> |
tools/nolibc: stackprotector.h: add empty __stack_chk_init for !_NOLIBC_STACKPROTECTOR
Let's define an empty __stack_chk_init for the !_NOLIBC_STACKPROTECTOR branch.
This allows to remove #ifdef ar
tools/nolibc: stackprotector.h: add empty __stack_chk_init for !_NOLIBC_STACKPROTECTOR
Let's define an empty __stack_chk_init for the !_NOLIBC_STACKPROTECTOR branch.
This allows to remove #ifdef around every call of __stack_chk_init().
Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
show more ...
|