From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1FDCC433EF for ; Thu, 24 Mar 2022 07:30:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348593AbiCXHc2 (ORCPT ); Thu, 24 Mar 2022 03:32:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348342AbiCXHcY (ORCPT ); Thu, 24 Mar 2022 03:32:24 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A54298F7C for ; Thu, 24 Mar 2022 00:30:53 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id C8F6F7E708; Thu, 24 Mar 2022 07:30:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107052; bh=SlIgbgQas7sKmDCm8jaOP2BZyesVvPCtxtzSSweS7C8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=p4kfnUE2HS9CRK3tbFOXyhQKltpoElJep3guWxmbgLW7Dvz0j0KR9QW8VZkGLiImT L68NS1H7Gp1vZUaiW9jUxEswwAslrZrrz0UT//4SVdl3ifV/83BAPVWKaGoryqadQ4 bG9p6BFtnutCGj4p+fXb0n6+9QVoD7zT1P3PwCIfc7zRCPGG3GZK0dVjg/ZPYKfwXk M2c9e57Klp5SeIVdAs7f8cTdvAtQMgvcWVFqBkiMBaiSlAmgeNqrgzSqzbzn4QNNbr fICC7XT6OrvwYm1c3ysIfTLhzAWmoJRQG3ztWjnOVqo5fHACw6uJBLxQlivjNBMC3N 6uaIlANRFEXgw== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 01/11] tools/nolibc: x86-64: Update System V ABI document link Date: Thu, 24 Mar 2022 14:30:29 +0700 Message-Id: <20220324073039.140946-2-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The old link no longer works, update it. Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/lkml/20220322102115.186179-2-ammarf= aizi2@gnuweeb.org/ RFC v2 -> v1: * No changes * Link RFC v1: https://lore.kernel.org/lkml/20220320093750.159991-2-ammarf= aizi2@gnuweeb.org RFC v1 -> RFC v2: * No changes * --- tools/include/nolibc/arch-x86_64.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch= -x86_64.h index fe517c16cd4d..a7b70ea51b68 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -61,7 +61,7 @@ struct sys_stat_struct { * - see also x86-64 ABI section A.2 AMD64 Linux Kernel Conventions, A.2= .1 * Calling Conventions. * - * Link x86-64 ABI: https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/x86-6= 4-psABI + * Link x86-64 ABI: https://gitlab.com/x86-psABIs/x86-64-ABI/-/wikis/home * */ =20 --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92465C433EF for ; Thu, 24 Mar 2022 07:31:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348603AbiCXHcb (ORCPT ); Thu, 24 Mar 2022 03:32:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348592AbiCXHc2 (ORCPT ); Thu, 24 Mar 2022 03:32:28 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0C2889968C for ; Thu, 24 Mar 2022 00:30:57 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 188617E34D; Thu, 24 Mar 2022 07:30:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107056; bh=a+O1drB15t84OmkUYg4z9+zSx3IJSCUKgljXpPaqSZc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bulhIg/uFYat7Try1jIFooNAj4bXgrRqhNagzDCKi4HF6fPG2hIHzt7noGWV2XGkJ 9ZS8NIYLfvLQnv6ReDZjC7iX8qCYQAaq5fGRoTCC085kIaeXF5ppd4Bq1c+siNHx0o rzLHilzy6OdVyjAbJpCSoqnaYYi5ZXUZzON9Shm+FACVEdVED2cQEIHxCt0fG4ueaT kNpuV3FX83Czf3TwWsIysqqdERoTPB7Bi8Hi6DLOzA2XA9WNXj45/gK8PNTG5liKw4 8u2K7s92+sZuxd9a0p19dlMx0eOvMyu23TRiSDxMLRFJtVQ3m2KfXOn9Jr/2VUlbnJ IfK7+xka9E6yQ== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi , llvm@lists.linux.dev, Nick Desaulniers Subject: [PATCH v1 02/11] tools/nolibc: Remove .global _start from the entry point code Date: Thu, 24 Mar 2022 14:30:30 +0700 Message-Id: <20220324073039.140946-3-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Building with clang yields the following error: ``` :3:1: error: _start changed binding to STB_GLOBAL .global _start ^ 1 error generated. ``` Make sure only specify one between `.global _start` and `.weak _start`. Remove `.global _start`. Cc: llvm@lists.linux.dev Reviewed-by: Nick Desaulniers Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/llvm/20220322102115.186179-3-ammarf= aizi2@gnuweeb.org RFC v2 -> v1: - Append Reviewed-by tag from Nick. - s/Removing/remove/ Link RFC v1: https://lore.kernel.org/llvm/20220320093750.159991-3-ammarf= aizi2@gnuweeb.org RFC v1 -> RFC v2: - Remove all `.global _start` for all build (GCC and Clang) instead of removing all `.weak _start` for clang build (Comment from Willy). --- tools/include/nolibc/arch-aarch64.h | 1 - tools/include/nolibc/arch-arm.h | 1 - tools/include/nolibc/arch-i386.h | 1 - tools/include/nolibc/arch-mips.h | 1 - tools/include/nolibc/arch-riscv.h | 1 - tools/include/nolibc/arch-x86_64.h | 1 - 6 files changed, 6 deletions(-) diff --git a/tools/include/nolibc/arch-aarch64.h b/tools/include/nolibc/arc= h-aarch64.h index 87d9e434820c..2dbd80d633cb 100644 --- a/tools/include/nolibc/arch-aarch64.h +++ b/tools/include/nolibc/arch-aarch64.h @@ -184,7 +184,6 @@ struct sys_stat_struct { /* startup code */ asm(".section .text\n" ".weak _start\n" - ".global _start\n" "_start:\n" "ldr x0, [sp]\n" // argc (x0) was in the stack "add x1, sp, 8\n" // argv (x1) =3D sp diff --git a/tools/include/nolibc/arch-arm.h b/tools/include/nolibc/arch-ar= m.h index 001a3c8c9ad5..1191395b5acd 100644 --- a/tools/include/nolibc/arch-arm.h +++ b/tools/include/nolibc/arch-arm.h @@ -177,7 +177,6 @@ struct sys_stat_struct { /* startup code */ asm(".section .text\n" ".weak _start\n" - ".global _start\n" "_start:\n" #if defined(__THUMBEB__) || defined(__THUMBEL__) /* We enter here in 32-bit mode but if some previous functions were in diff --git a/tools/include/nolibc/arch-i386.h b/tools/include/nolibc/arch-i= 386.h index d7e4d53325a3..125a691fc631 100644 --- a/tools/include/nolibc/arch-i386.h +++ b/tools/include/nolibc/arch-i386.h @@ -176,7 +176,6 @@ struct sys_stat_struct { */ asm(".section .text\n" ".weak _start\n" - ".global _start\n" "_start:\n" "pop %eax\n" // argc (first arg, %eax) "mov %esp, %ebx\n" // argv[] (second arg, %ebx) diff --git a/tools/include/nolibc/arch-mips.h b/tools/include/nolibc/arch-m= ips.h index c9a6aac87c6d..1a124790c99f 100644 --- a/tools/include/nolibc/arch-mips.h +++ b/tools/include/nolibc/arch-mips.h @@ -192,7 +192,6 @@ struct sys_stat_struct { asm(".section .text\n" ".weak __start\n" ".set nomips16\n" - ".global __start\n" ".set noreorder\n" ".option pic0\n" ".ent __start\n" diff --git a/tools/include/nolibc/arch-riscv.h b/tools/include/nolibc/arch-= riscv.h index bc10b7b5706d..511d67fc534e 100644 --- a/tools/include/nolibc/arch-riscv.h +++ b/tools/include/nolibc/arch-riscv.h @@ -185,7 +185,6 @@ struct sys_stat_struct { /* startup code */ asm(".section .text\n" ".weak _start\n" - ".global _start\n" "_start:\n" ".option push\n" ".option norelax\n" diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch= -x86_64.h index a7b70ea51b68..84c174181425 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -199,7 +199,6 @@ struct sys_stat_struct { */ asm(".section .text\n" ".weak _start\n" - ".global _start\n" "_start:\n" "pop %rdi\n" // argc (first arg, %rdi) "mov %rsp, %rsi\n" // argv[] (second arg, %rsi) --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B0E9C433EF for ; Thu, 24 Mar 2022 07:31:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346478AbiCXHcj (ORCPT ); Thu, 24 Mar 2022 03:32:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345962AbiCXHcc (ORCPT ); Thu, 24 Mar 2022 03:32:32 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48E7F98F7E for ; Thu, 24 Mar 2022 00:31:00 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id CF2EC7E70E; Thu, 24 Mar 2022 07:30:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107060; bh=9Y4BF60b+K5tZ061HB4ZZEZJAlIbgKRx7wjz7Yn5BQc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RzI9NZikD6qowaipBowXN0j+aqxJXPwotzpj7HqST5YQeLGrQhzgscyqpRRIhK1zm XimvqFARj/rjk1zn4HD2g9Jal7yBLDB5DMKfCy2cVCWVBlmlcy3yYhpSYYccMMJNYQ 7kw2pITXvXb20QomVbosKN2NLYtXdztVMo+tdxl5SnFcdDd1qu2LiPU6oxqTDE8JIx lWI1VvVcYP4OX1S1I/ra3GJXCG+/4/j/fDP84LwjNLqYvpiRms8+A+s/rNUjttZWc2 yTrDQhcxUuyODu+F5hzqexMoItcPP+wm36EDVXbC7AG27EWkt968QhGEBWOSkEsMm6 1xbF59qm1B3dQ== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 03/11] tools/nolibc: Replace `asm` with `__asm__` Date: Thu, 24 Mar 2022 14:30:31 +0700 Message-Id: <20220324073039.140946-4-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Replace `asm` with `__asm__` to support compilation with -std flag. Using `asm` with -std flag makes GCC think `asm()` is a function call instead of an inline assembly. GCC doc says: For the C language, the `asm` keyword is a GNU extension. When writing C code that can be compiled with `-ansi` and the `-std` options that select C dialects without GNU extensions, use `__asm__` instead of `asm`. Link: https://gcc.gnu.org/onlinedocs/gcc/Basic-Asm.html Reported-by: Alviro Iskandar Setiawan Signed-off-by: Ammar Faizi --- In private conversation with Alviro, we found that using -std flag hits the following errors: ``` In file included from arch.h:21, from nolibc.h:97, from test.c:2: arch-i386.h:177:5: error: expected declaration specifiers or =E2=80=98...= =E2=80=99 before string constant 177 | asm(".section .text\n" | ^~~~~~~~~~~~~~~~~~ sys.h: In function =E2=80=98sys_brk=E2=80=99: arch-i386.h:83:28: error: expected =E2=80=98=3D=E2=80=99, =E2=80=98,=E2= =80=99, =E2=80=98;=E2=80=99, =E2=80=98asm=E2=80=99 or =E2=80=98__attribute_= _=E2=80=99 before =E2=80=98asm=E2=80=99 83 | register long _num asm("eax") =3D (num); = \ | ^~~ sys.h:57:24: note: in expansion of macro =E2=80=98my_syscall1=E2=80=99 57 | return (void *)my_syscall1(__NR_brk, addr); | ^~~~~~~~~~~ arch-i386.h:83:28: warning: implicit declaration of function =E2=80=98asm= =E2=80=99 [-Wimplicit-function-declaration] 83 | register long _num asm("eax") =3D (num); = \ | ^~~ sys.h:57:24: note: in expansion of macro =E2=80=98my_syscall1=E2=80=99 57 | return (void *)my_syscall1(__NR_brk, addr); | ^~~~~~~~~~~ arch-i386.h:83:39: error: lvalue required as left operand of assignment 83 | register long _num asm("eax") =3D (num); = \ | ^ sys.h:57:24: note: in expansion of macro =E2=80=98my_syscall1=E2=80=99 57 | return (void *)my_syscall1(__NR_brk, addr); | ^~~~~~~~~~~ arch-i386.h:84:29: error: expected =E2=80=98=3D=E2=80=99, =E2=80=98,=E2= =80=99, =E2=80=98;=E2=80=99, =E2=80=98asm=E2=80=99 or =E2=80=98__attribute_= _=E2=80=99 before =E2=80=98asm=E2=80=99 84 | register long _arg1 asm("ebx") =3D (long)(arg1); = \ ``` It is because inline ASM is a GNU extension. So GCC thinks asm() is a function call. To make it always available for any kind of compilation, use `__asm__` instead of `asm`. --- tools/include/nolibc/arch-aarch64.h | 72 ++++++++++++++-------------- tools/include/nolibc/arch-arm.h | 58 +++++++++++----------- tools/include/nolibc/arch-i386.h | 56 +++++++++++----------- tools/include/nolibc/arch-mips.h | 62 ++++++++++++------------ tools/include/nolibc/arch-riscv.h | 74 ++++++++++++++--------------- tools/include/nolibc/arch-x86_64.h | 72 ++++++++++++++-------------- 6 files changed, 197 insertions(+), 197 deletions(-) diff --git a/tools/include/nolibc/arch-aarch64.h b/tools/include/nolibc/arc= h-aarch64.h index 2dbd80d633cb..d7f4fcf46d51 100644 --- a/tools/include/nolibc/arch-aarch64.h +++ b/tools/include/nolibc/arch-aarch64.h @@ -64,10 +64,10 @@ struct sys_stat_struct { =20 #define my_syscall0(num) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0"); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_num) \ @@ -78,10 +78,10 @@ struct sys_stat_struct { =20 #define my_syscall1(num, arg1) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), \ @@ -93,11 +93,11 @@ struct sys_stat_struct { =20 #define my_syscall2(num, arg1, arg2) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ - register long _arg2 asm("x1") =3D (long)(arg2); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ + register long _arg2 __asm__("x1") =3D (long)(arg2); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), \ @@ -109,12 +109,12 @@ struct sys_stat_struct { =20 #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ - register long _arg2 asm("x1") =3D (long)(arg2); \ - register long _arg3 asm("x2") =3D (long)(arg3); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ + register long _arg2 __asm__("x1") =3D (long)(arg2); \ + register long _arg3 __asm__("x2") =3D (long)(arg3); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ @@ -126,13 +126,13 @@ struct sys_stat_struct { =20 #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ - register long _arg2 asm("x1") =3D (long)(arg2); \ - register long _arg3 asm("x2") =3D (long)(arg3); \ - register long _arg4 asm("x3") =3D (long)(arg4); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ + register long _arg2 __asm__("x1") =3D (long)(arg2); \ + register long _arg3 __asm__("x2") =3D (long)(arg3); \ + register long _arg4 __asm__("x3") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ @@ -144,14 +144,14 @@ struct sys_stat_struct { =20 #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ - register long _arg2 asm("x1") =3D (long)(arg2); \ - register long _arg3 asm("x2") =3D (long)(arg3); \ - register long _arg4 asm("x3") =3D (long)(arg4); \ - register long _arg5 asm("x4") =3D (long)(arg5); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ + register long _arg2 __asm__("x1") =3D (long)(arg2); \ + register long _arg3 __asm__("x2") =3D (long)(arg3); \ + register long _arg4 __asm__("x3") =3D (long)(arg4); \ + register long _arg5 __asm__("x4") =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr" (_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -163,15 +163,15 @@ struct sys_stat_struct { =20 #define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) = \ ({ = \ - register long _num asm("x8") =3D (num); \ - register long _arg1 asm("x0") =3D (long)(arg1); \ - register long _arg2 asm("x1") =3D (long)(arg2); \ - register long _arg3 asm("x2") =3D (long)(arg3); \ - register long _arg4 asm("x3") =3D (long)(arg4); \ - register long _arg5 asm("x4") =3D (long)(arg5); \ - register long _arg6 asm("x5") =3D (long)(arg6); \ + register long _num __asm__("x8") =3D (num); \ + register long _arg1 __asm__("x0") =3D (long)(arg1); \ + register long _arg2 __asm__("x1") =3D (long)(arg2); \ + register long _arg3 __asm__("x2") =3D (long)(arg3); \ + register long _arg4 __asm__("x3") =3D (long)(arg4); \ + register long _arg5 __asm__("x4") =3D (long)(arg5); \ + register long _arg6 __asm__("x5") =3D (long)(arg6); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr" (_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ diff --git a/tools/include/nolibc/arch-arm.h b/tools/include/nolibc/arch-ar= m.h index 1191395b5acd..0e88cbe42588 100644 --- a/tools/include/nolibc/arch-arm.h +++ b/tools/include/nolibc/arch-arm.h @@ -77,10 +77,10 @@ struct sys_stat_struct { =20 #define my_syscall0(num) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0"); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_num) \ @@ -91,10 +91,10 @@ struct sys_stat_struct { =20 #define my_syscall1(num, arg1) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0") =3D (long)(arg1); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0") =3D (long)(arg1); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), \ @@ -106,11 +106,11 @@ struct sys_stat_struct { =20 #define my_syscall2(num, arg1, arg2) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0") =3D (long)(arg1); \ - register long _arg2 asm("r1") =3D (long)(arg2); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0") =3D (long)(arg1); \ + register long _arg2 __asm__("r1") =3D (long)(arg2); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), \ @@ -122,12 +122,12 @@ struct sys_stat_struct { =20 #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0") =3D (long)(arg1); \ - register long _arg2 asm("r1") =3D (long)(arg2); \ - register long _arg3 asm("r2") =3D (long)(arg3); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0") =3D (long)(arg1); \ + register long _arg2 __asm__("r1") =3D (long)(arg2); \ + register long _arg3 __asm__("r2") =3D (long)(arg3); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ @@ -139,13 +139,13 @@ struct sys_stat_struct { =20 #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0") =3D (long)(arg1); \ - register long _arg2 asm("r1") =3D (long)(arg2); \ - register long _arg3 asm("r2") =3D (long)(arg3); \ - register long _arg4 asm("r3") =3D (long)(arg4); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0") =3D (long)(arg1); \ + register long _arg2 __asm__("r1") =3D (long)(arg2); \ + register long _arg3 __asm__("r2") =3D (long)(arg3); \ + register long _arg4 __asm__("r3") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr"(_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ @@ -157,14 +157,14 @@ struct sys_stat_struct { =20 #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ - register long _num asm("r7") =3D (num); \ - register long _arg1 asm("r0") =3D (long)(arg1); \ - register long _arg2 asm("r1") =3D (long)(arg2); \ - register long _arg3 asm("r2") =3D (long)(arg3); \ - register long _arg4 asm("r3") =3D (long)(arg4); \ - register long _arg5 asm("r4") =3D (long)(arg5); \ + register long _num __asm__("r7") =3D (num); \ + register long _arg1 __asm__("r0") =3D (long)(arg1); \ + register long _arg2 __asm__("r1") =3D (long)(arg2); \ + register long _arg3 __asm__("r2") =3D (long)(arg3); \ + register long _arg4 __asm__("r3") =3D (long)(arg4); \ + register long _arg5 __asm__("r4") =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "svc #0\n" \ : "=3Dr" (_arg1) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -175,7 +175,7 @@ struct sys_stat_struct { }) =20 /* startup code */ -asm(".section .text\n" +__asm__(".section .text\n" ".weak _start\n" "_start:\n" #if defined(__THUMBEB__) || defined(__THUMBEL__) diff --git a/tools/include/nolibc/arch-i386.h b/tools/include/nolibc/arch-i= 386.h index 125a691fc631..ff2e6bb453cf 100644 --- a/tools/include/nolibc/arch-i386.h +++ b/tools/include/nolibc/arch-i386.h @@ -66,9 +66,9 @@ struct sys_stat_struct { #define my_syscall0(num) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ + register long _num __asm__("eax") =3D (num); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "0"(_num) \ @@ -80,10 +80,10 @@ struct sys_stat_struct { #define my_syscall1(num, arg1) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ - register long _arg1 asm("ebx") =3D (long)(arg1); \ + register long _num __asm__("eax") =3D (num); \ + register long _arg1 __asm__("ebx") =3D (long)(arg1); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "r"(_arg1), \ @@ -96,11 +96,11 @@ struct sys_stat_struct { #define my_syscall2(num, arg1, arg2) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ - register long _arg1 asm("ebx") =3D (long)(arg1); \ - register long _arg2 asm("ecx") =3D (long)(arg2); \ + register long _num __asm__("eax") =3D (num); \ + register long _arg1 __asm__("ebx") =3D (long)(arg1); \ + register long _arg2 __asm__("ecx") =3D (long)(arg2); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "r"(_arg1), "r"(_arg2), \ @@ -113,12 +113,12 @@ struct sys_stat_struct { #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ - register long _arg1 asm("ebx") =3D (long)(arg1); \ - register long _arg2 asm("ecx") =3D (long)(arg2); \ - register long _arg3 asm("edx") =3D (long)(arg3); \ + register long _num __asm__("eax") =3D (num); \ + register long _arg1 __asm__("ebx") =3D (long)(arg1); \ + register long _arg2 __asm__("ecx") =3D (long)(arg2); \ + register long _arg3 __asm__("edx") =3D (long)(arg3); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ @@ -131,13 +131,13 @@ struct sys_stat_struct { #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ - register long _arg1 asm("ebx") =3D (long)(arg1); \ - register long _arg2 asm("ecx") =3D (long)(arg2); \ - register long _arg3 asm("edx") =3D (long)(arg3); \ - register long _arg4 asm("esi") =3D (long)(arg4); \ + register long _num __asm__("eax") =3D (num); \ + register long _arg1 __asm__("ebx") =3D (long)(arg1); \ + register long _arg2 __asm__("ecx") =3D (long)(arg2); \ + register long _arg3 __asm__("edx") =3D (long)(arg3); \ + register long _arg4 __asm__("esi") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ @@ -150,14 +150,14 @@ struct sys_stat_struct { #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ long _ret; \ - register long _num asm("eax") =3D (num); \ - register long _arg1 asm("ebx") =3D (long)(arg1); \ - register long _arg2 asm("ecx") =3D (long)(arg2); \ - register long _arg3 asm("edx") =3D (long)(arg3); \ - register long _arg4 asm("esi") =3D (long)(arg4); \ - register long _arg5 asm("edi") =3D (long)(arg5); \ + register long _num __asm__("eax") =3D (num); \ + register long _arg1 __asm__("ebx") =3D (long)(arg1); \ + register long _arg2 __asm__("ecx") =3D (long)(arg2); \ + register long _arg3 __asm__("edx") =3D (long)(arg3); \ + register long _arg4 __asm__("esi") =3D (long)(arg4); \ + register long _arg5 __asm__("edi") =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "int $0x80\n" \ : "=3Da" (_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -174,7 +174,7 @@ struct sys_stat_struct { * 2) The deepest stack frame should be set to zero * */ -asm(".section .text\n" +__asm__(".section .text\n" ".weak _start\n" "_start:\n" "pop %eax\n" // argc (first arg, %eax) diff --git a/tools/include/nolibc/arch-mips.h b/tools/include/nolibc/arch-m= ips.h index 1a124790c99f..b43da77fde0e 100644 --- a/tools/include/nolibc/arch-mips.h +++ b/tools/include/nolibc/arch-mips.h @@ -69,10 +69,10 @@ struct sys_stat_struct { =20 #define my_syscall0(num) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg4 asm("a3"); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg4 __asm__("a3"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "syscall\n" \ "addiu $sp, $sp, 32\n" \ @@ -86,11 +86,11 @@ struct sys_stat_struct { =20 #define my_syscall1(num, arg1) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg4 asm("a3"); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg4 __asm__("a3"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "syscall\n" \ "addiu $sp, $sp, 32\n" \ @@ -105,12 +105,12 @@ struct sys_stat_struct { =20 #define my_syscall2(num, arg1, arg2) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg4 asm("a3"); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg4 __asm__("a3"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "syscall\n" \ "addiu $sp, $sp, 32\n" \ @@ -125,13 +125,13 @@ struct sys_stat_struct { =20 #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3"); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "syscall\n" \ "addiu $sp, $sp, 32\n" \ @@ -146,13 +146,13 @@ struct sys_stat_struct { =20 #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3") =3D (long)(arg4); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "syscall\n" \ "addiu $sp, $sp, 32\n" \ @@ -167,14 +167,14 @@ struct sys_stat_struct { =20 #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ - register long _num asm("v0") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3") =3D (long)(arg4); \ + register long _num __asm__("v0") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3") =3D (long)(arg4); \ register long _arg5 =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "addiu $sp, $sp, -32\n" \ "sw %7, 16($sp)\n" \ "syscall\n " \ @@ -189,7 +189,7 @@ struct sys_stat_struct { }) =20 /* startup code, note that it's called __start on MIPS */ -asm(".section .text\n" +__asm__(".section .text\n" ".weak __start\n" ".set nomips16\n" ".set noreorder\n" diff --git a/tools/include/nolibc/arch-riscv.h b/tools/include/nolibc/arch-= riscv.h index 511d67fc534e..100bc71da344 100644 --- a/tools/include/nolibc/arch-riscv.h +++ b/tools/include/nolibc/arch-riscv.h @@ -66,10 +66,10 @@ struct sys_stat_struct { =20 #define my_syscall0(num) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0"); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0"); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n\t" \ : "=3Dr"(_arg1) \ : "r"(_num) \ @@ -80,10 +80,10 @@ struct sys_stat_struct { =20 #define my_syscall1(num, arg1) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n" \ : "+r"(_arg1) \ : "r"(_num) \ @@ -94,11 +94,11 @@ struct sys_stat_struct { =20 #define my_syscall2(num, arg1, arg2) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n" \ : "+r"(_arg1) \ : "r"(_arg2), \ @@ -110,12 +110,12 @@ struct sys_stat_struct { =20 #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n\t" \ : "+r"(_arg1) \ : "r"(_arg2), "r"(_arg3), \ @@ -127,13 +127,13 @@ struct sys_stat_struct { =20 #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3") =3D (long)(arg4); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n" \ : "+r"(_arg1) \ : "r"(_arg2), "r"(_arg3), "r"(_arg4), \ @@ -145,14 +145,14 @@ struct sys_stat_struct { =20 #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3") =3D (long)(arg4); \ - register long _arg5 asm("a4") =3D (long)(arg5); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3") =3D (long)(arg4); \ + register long _arg5 __asm__("a4") =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n" \ : "+r"(_arg1) \ : "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -164,15 +164,15 @@ struct sys_stat_struct { =20 #define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) = \ ({ = \ - register long _num asm("a7") =3D (num); \ - register long _arg1 asm("a0") =3D (long)(arg1); \ - register long _arg2 asm("a1") =3D (long)(arg2); \ - register long _arg3 asm("a2") =3D (long)(arg3); \ - register long _arg4 asm("a3") =3D (long)(arg4); \ - register long _arg5 asm("a4") =3D (long)(arg5); \ - register long _arg6 asm("a5") =3D (long)(arg6); \ + register long _num __asm__("a7") =3D (num); \ + register long _arg1 __asm__("a0") =3D (long)(arg1); \ + register long _arg2 __asm__("a1") =3D (long)(arg2); \ + register long _arg3 __asm__("a2") =3D (long)(arg3); \ + register long _arg4 __asm__("a3") =3D (long)(arg4); \ + register long _arg5 __asm__("a4") =3D (long)(arg5); \ + register long _arg6 __asm__("a5") =3D (long)(arg6); \ \ - asm volatile ( \ + __asm__ volatile ( \ "ecall\n" \ : "+r"(_arg1) \ : "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), "r"(_arg6), \ @@ -183,7 +183,7 @@ struct sys_stat_struct { }) =20 /* startup code */ -asm(".section .text\n" +__asm__(".section .text\n" ".weak _start\n" "_start:\n" ".option push\n" diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch= -x86_64.h index 84c174181425..afc50f84a036 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -68,9 +68,9 @@ struct sys_stat_struct { #define my_syscall0(num) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ + register long _num __asm__("rax") =3D (num); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "0"(_num) \ @@ -82,10 +82,10 @@ struct sys_stat_struct { #define my_syscall1(num, arg1) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), \ @@ -98,11 +98,11 @@ struct sys_stat_struct { #define my_syscall2(num, arg1, arg2) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ - register long _arg2 asm("rsi") =3D (long)(arg2); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ + register long _arg2 __asm__("rsi") =3D (long)(arg2); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), "r"(_arg2), \ @@ -115,12 +115,12 @@ struct sys_stat_struct { #define my_syscall3(num, arg1, arg2, arg3) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ - register long _arg2 asm("rsi") =3D (long)(arg2); \ - register long _arg3 asm("rdx") =3D (long)(arg3); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ + register long _arg2 __asm__("rsi") =3D (long)(arg2); \ + register long _arg3 __asm__("rdx") =3D (long)(arg3); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ @@ -133,13 +133,13 @@ struct sys_stat_struct { #define my_syscall4(num, arg1, arg2, arg3, arg4) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ - register long _arg2 asm("rsi") =3D (long)(arg2); \ - register long _arg3 asm("rdx") =3D (long)(arg3); \ - register long _arg4 asm("r10") =3D (long)(arg4); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ + register long _arg2 __asm__("rsi") =3D (long)(arg2); \ + register long _arg3 __asm__("rdx") =3D (long)(arg3); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ @@ -152,14 +152,14 @@ struct sys_stat_struct { #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ - register long _arg2 asm("rsi") =3D (long)(arg2); \ - register long _arg3 asm("rdx") =3D (long)(arg3); \ - register long _arg4 asm("r10") =3D (long)(arg4); \ - register long _arg5 asm("r8") =3D (long)(arg5); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ + register long _arg2 __asm__("rsi") =3D (long)(arg2); \ + register long _arg3 __asm__("rdx") =3D (long)(arg3); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ + register long _arg5 __asm__("r8") =3D (long)(arg5); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -172,15 +172,15 @@ struct sys_stat_struct { #define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) = \ ({ = \ long _ret; \ - register long _num asm("rax") =3D (num); \ - register long _arg1 asm("rdi") =3D (long)(arg1); \ - register long _arg2 asm("rsi") =3D (long)(arg2); \ - register long _arg3 asm("rdx") =3D (long)(arg3); \ - register long _arg4 asm("r10") =3D (long)(arg4); \ - register long _arg5 asm("r8") =3D (long)(arg5); \ - register long _arg6 asm("r9") =3D (long)(arg6); \ + register long _num __asm__("rax") =3D (num); \ + register long _arg1 __asm__("rdi") =3D (long)(arg1); \ + register long _arg2 __asm__("rsi") =3D (long)(arg2); \ + register long _arg3 __asm__("rdx") =3D (long)(arg3); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ + register long _arg5 __asm__("r8") =3D (long)(arg5); \ + register long _arg6 __asm__("r9") =3D (long)(arg6); \ \ - asm volatile ( \ + __asm__ volatile ( \ "syscall\n" \ : "=3Da"(_ret) \ : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ @@ -197,7 +197,7 @@ struct sys_stat_struct { * 2) The deepest stack frame should be zero (the %rbp). * */ -asm(".section .text\n" +__asm__(".section .text\n" ".weak _start\n" "_start:\n" "pop %rdi\n" // argc (first arg, %rdi) --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4056EC433FE for ; Thu, 24 Mar 2022 07:32:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348619AbiCXHda (ORCPT ); Thu, 24 Mar 2022 03:33:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57768 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348615AbiCXHch (ORCPT ); Thu, 24 Mar 2022 03:32:37 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B27B2996AC for ; Thu, 24 Mar 2022 00:31:04 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 908C77E710; Thu, 24 Mar 2022 07:31:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107063; bh=XnHIMtKCHpfViYs+NxhkaGxPrB2QEF9blnFlAgHfvkI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F92q9FjqXDVM9H1BYBGp8Wfp2b6LxgegpwJdJda/NuQWnG+3dbYM+Quy4CLRDNysC tdhKWMp4QFB17yfx4pwPmS1MQA8Lt/3C9DFlxOVT/ZIuN0DlyBfB3Ok9WyIy+YL5QS FPu9x2vXgZCzQMTMTLicEB7j0jzuw3uG4G6+4lTe8R5cUrIORtvjGTm8YNUiEUFtpk NlVh2lk2BbvCRfQsmg/D8oiVxcLmWU8w2utTO7GTQ9PAV25jc/VCG6KRP3UEsBS9te oPyt8tOksHFXOODMaI/auE8NgAfYpQ6aM4nnZsWht0WP4RF16T+wDOAHFOANiyy/rr 2sUzIjkK4Fqkg== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi , David Laight Subject: [PATCH v1 04/11] tools/nolibc: x86-64: Use appropriate register constraints if exist Date: Thu, 24 Mar 2022 14:30:32 +0700 Message-Id: <20220324073039.140946-5-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Use appropriate register constraints if exist. Don't use register variables for all inputs. Register variables with "r" constraint should be used when we need to pass data through a specific register to extended inline assembly that doesn't have a specific register constraint associated with it (anything outside %rax, %rbx, %rcx, %rdx, %rsi, %rdi). It also simplifies the macro definition. Link: https://lore.kernel.org/lkml/3d2cfdeecddc45dc8e4beada305b5948@AcuMS.a= culab.com Suggested-by: David Laight Signed-off-by: Ammar Faizi --- tools/include/nolibc/arch-x86_64.h | 202 +++++++++++++---------------- 1 file changed, 91 insertions(+), 111 deletions(-) diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch= -x86_64.h index afc50f84a036..3067f553c03c 100644 --- a/tools/include/nolibc/arch-x86_64.h +++ b/tools/include/nolibc/arch-x86_64.h @@ -65,129 +65,109 @@ struct sys_stat_struct { * */ =20 -#define my_syscall0(num) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall0(num) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall1(num, arg1) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), \ - "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall1(num, arg1) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1) /* %rdi */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall2(num, arg1, arg2) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - register long _arg2 __asm__("rsi") =3D (long)(arg2); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), "r"(_arg2), \ - "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall2(num, arg1, arg2) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1), /* %rdi */ \ + "S"(arg2) /* %rsi */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall3(num, arg1, arg2, arg3) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - register long _arg2 __asm__("rsi") =3D (long)(arg2); \ - register long _arg3 __asm__("rdx") =3D (long)(arg3); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ - "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall3(num, arg1, arg2, arg3) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1), /* %rdi */ \ + "S"(arg2), /* %rsi */ \ + "d"(arg3) /* %rdx */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall4(num, arg1, arg2, arg3, arg4) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - register long _arg2 __asm__("rsi") =3D (long)(arg2); \ - register long _arg3 __asm__("rdx") =3D (long)(arg3); \ - register long _arg4 __asm__("r10") =3D (long)(arg4); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ - "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall4(num, arg1, arg2, arg3, arg4) \ +({ \ + long _ret =3D (num); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1), /* %rdi */ \ + "S"(arg2), /* %rsi */ \ + "d"(arg3), /* %rdx */ \ + "r"(_arg4) /* %r10 */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - register long _arg2 __asm__("rsi") =3D (long)(arg2); \ - register long _arg3 __asm__("rdx") =3D (long)(arg3); \ - register long _arg4 __asm__("r10") =3D (long)(arg4); \ - register long _arg5 __asm__("r8") =3D (long)(arg5); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ - "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \ +({ \ + long _ret =3D (num); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ + register long _arg5 __asm__("r8") =3D (long)(arg5); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1), /* %rdi */ \ + "S"(arg2), /* %rsi */ \ + "d"(arg3), /* %rdx */ \ + "r"(_arg4), /* %r10 */ \ + "r"(_arg5) /* %r8 */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) = \ -({ = \ - long _ret; \ - register long _num __asm__("rax") =3D (num); \ - register long _arg1 __asm__("rdi") =3D (long)(arg1); \ - register long _arg2 __asm__("rsi") =3D (long)(arg2); \ - register long _arg3 __asm__("rdx") =3D (long)(arg3); \ - register long _arg4 __asm__("r10") =3D (long)(arg4); \ - register long _arg5 __asm__("r8") =3D (long)(arg5); \ - register long _arg6 __asm__("r9") =3D (long)(arg6); \ - \ - __asm__ volatile ( \ - "syscall\n" \ - : "=3Da"(_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ - "r"(_arg6), "0"(_num) \ - : "rcx", "r11", "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \ +({ \ + long _ret =3D (num); \ + register long _arg4 __asm__("r10") =3D (long)(arg4); \ + register long _arg5 __asm__("r8") =3D (long)(arg5); \ + register long _arg6 __asm__("r9") =3D (long)(arg6); \ + __asm__ volatile ( \ + "syscall\n" \ + : "+a"(_ret) /* %rax */ \ + : "D"(arg1), /* %rdi */ \ + "S"(arg2), /* %rsi */ \ + "d"(arg3), /* %rdx */ \ + "r"(_arg4), /* %r10 */ \ + "r"(_arg5), /* %r8 */ \ + "r"(_arg6) /* %r9 */ \ + : "rcx", "r11", "memory", "cc" \ + ); \ + _ret; \ }) =20 /* startup code */ --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E7FB6C433F5 for ; Thu, 24 Mar 2022 07:32:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348708AbiCXHeI (ORCPT ); Thu, 24 Mar 2022 03:34:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57764 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348651AbiCXHcs (ORCPT ); Thu, 24 Mar 2022 03:32:48 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8CC6A996BA for ; Thu, 24 Mar 2022 00:31:08 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 9B2BE7E712; Thu, 24 Mar 2022 07:31:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107067; bh=waHrXoHOW/pPU9BrI5hKUWTpbkCQhESmBtk6btYk9uw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D1dwyjBP51HYddOWHyVExRSy2yUV84oMLstAlS37ZkQfV9ZYBnCvqsEzOQ6HoTsYT AOmW6z04EnOc5KSEz3E3mTXKEvrgWIrBuiS7u8IQPllVS1PUNInB2rmuTcy0FMufq3 hZ5aGwQ5LqIGL17HYYTpgxirIUocCxPdSMh7VlPyuL3hvEnj+wpyBxptkSMc0taLaZ lysSrIH7IvSTYaU8J6CFhdnzBrCfTlagqllMQnTOauCuYJdYrJAHmXXjrPkE+iM2OR deDbA23BnqZ9aDM7hpJw0Rpcf/4gI10USOQp4D5O9OsKYFNV5BgdZ71heippfdzuZi 5V9agKtsLezXQ== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi , David Laight Subject: [PATCH v1 05/11] tools/nolibc: i386: Use appropriate register constraints if exist Date: Thu, 24 Mar 2022 14:30:33 +0700 Message-Id: <20220324073039.140946-6-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Use appropriate register constraints if exist. Don't use register variables for all inputs. Register variables with "r" constraint should be used when we need to pass data through a specific register to extended inline assembly that doesn't have a specific register constraint associated with it (anything outside %eax, %ebx, %ecx, %edx, %esi, %edi). It also simplifies the macro definition. Link: https://lore.kernel.org/lkml/3d2cfdeecddc45dc8e4beada305b5948@AcuMS.a= culab.com Suggested-by: David Laight Signed-off-by: Ammar Faizi --- tools/include/nolibc/arch-i386.h | 162 +++++++++++++------------------ 1 file changed, 70 insertions(+), 92 deletions(-) diff --git a/tools/include/nolibc/arch-i386.h b/tools/include/nolibc/arch-i= 386.h index ff2e6bb453cf..6eb96ee8c4f7 100644 --- a/tools/include/nolibc/arch-i386.h +++ b/tools/include/nolibc/arch-i386.h @@ -63,108 +63,86 @@ struct sys_stat_struct { */ #define __ARCH_WANT_SYS_OLD_SELECT =20 -#define my_syscall0(num) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall0(num) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall1(num, arg1) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - register long _arg1 __asm__("ebx") =3D (long)(arg1); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "r"(_arg1), \ - "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall1(num, arg1) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : "b"(arg1) /* %ebx */ \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall2(num, arg1, arg2) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - register long _arg1 __asm__("ebx") =3D (long)(arg1); \ - register long _arg2 __asm__("ecx") =3D (long)(arg2); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "r"(_arg1), "r"(_arg2), \ - "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall2(num, arg1, arg2) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : "b"(arg1), /* %ebx */ \ + "c"(arg2) /* %ecx */ \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall3(num, arg1, arg2, arg3) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - register long _arg1 __asm__("ebx") =3D (long)(arg1); \ - register long _arg2 __asm__("ecx") =3D (long)(arg2); \ - register long _arg3 __asm__("edx") =3D (long)(arg3); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), \ - "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall3(num, arg1, arg2, arg3) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : "b"(arg1), /* %ebx */ \ + "c"(arg2), /* %ecx */ \ + "d"(arg3) /* %edx */ \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall4(num, arg1, arg2, arg3, arg4) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - register long _arg1 __asm__("ebx") =3D (long)(arg1); \ - register long _arg2 __asm__("ecx") =3D (long)(arg2); \ - register long _arg3 __asm__("edx") =3D (long)(arg3); \ - register long _arg4 __asm__("esi") =3D (long)(arg4); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \ - "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall4(num, arg1, arg2, arg3, arg4) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : "b"(arg1), /* %ebx */ \ + "c"(arg2), /* %ecx */ \ + "d"(arg3), /* %edx */ \ + "S"(arg4) /* %esi */ \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 -#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) = \ -({ = \ - long _ret; \ - register long _num __asm__("eax") =3D (num); \ - register long _arg1 __asm__("ebx") =3D (long)(arg1); \ - register long _arg2 __asm__("ecx") =3D (long)(arg2); \ - register long _arg3 __asm__("edx") =3D (long)(arg3); \ - register long _arg4 __asm__("esi") =3D (long)(arg4); \ - register long _arg5 __asm__("edi") =3D (long)(arg5); \ - \ - __asm__ volatile ( \ - "int $0x80\n" \ - : "=3Da" (_ret) \ - : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ - "0"(_num) \ - : "memory", "cc" \ - ); \ - _ret; \ +#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \ +({ \ + long _ret =3D (num); \ + __asm__ volatile ( \ + "int $0x80\n" \ + : "+a"(_ret) /* %eax */ \ + : "b"(arg1), /* %ebx */ \ + "c"(arg2), /* %ecx */ \ + "d"(arg3), /* %edx */ \ + "S"(arg4), /* %esi */ \ + "D"(arg5) /* %edi */ \ + : "memory", "cc" \ + ); \ + _ret; \ }) =20 /* startup code */ --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D26EFC433EF for ; Thu, 24 Mar 2022 07:32:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348645AbiCXHde (ORCPT ); Thu, 24 Mar 2022 03:33:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348673AbiCXHcs (ORCPT ); Thu, 24 Mar 2022 03:32:48 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9DE9399EDD for ; Thu, 24 Mar 2022 00:31:12 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 7F7B67E70D; Thu, 24 Mar 2022 07:31:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107072; bh=7Qv9rqJeI71GjuDbibmCUuv1gIB+xsY2a5HJtFAGzSs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c2wjHqCEEFZBwwM/AnDUHRZ7THc3ZYWMO2IQGdjSZlJUx9OKGqCMGa6hRY7rhHZKy NuAfEBuK6szkDs8V1AEHY/homXOqmjWqmDamMyxjFw/ewWOFZlk9g7kUwy7MK+u4+D b/kTypmIgEiV6G1yMaSGgUZztnYeKXAQ0hTlhGfp/ghO8JwjROlYQnXA6E3OGB4JNi O2FSemAgJDeDmAFhhuIHG21kEYS4Tk6MHLri2c6OHb5kIbZ7eXKLiFGr0lcasmx9Iq hlysp6THpzOVv9HlUZo0qIsC5unxIbeiLav0Sjet7Gi7Ye5Mf7dmSsDANk5CrQ+hWt POnW7ZKIC2XFg== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi , x86@kernel.org, llvm@lists.linux.dev, David Laight Subject: [PATCH v1 06/11] tools/nolibc: i386: Implement syscall with 6 arguments Date: Thu, 24 Mar 2022 14:30:34 +0700 Message-Id: <20220324073039.140946-7-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" On i386, the 6th argument of syscall goes in %ebp. However, both Clang and GCC cannot use %ebp in the clobber list and in the "r" constraint without using -fomit-frame-pointer. To make it always available for any kind of compilation, the below workaround is implemented. 1) Push the 6-th argument. 2) Push %ebp. 3) Load the 6-th argument from 4(%esp) to %ebp. 4) Do the syscall (int $0x80). 5) Pop %ebp (restore the old value of %ebp). 6) Add %esp by 4 (undo the stack pointer). Cc: x86@kernel.org Cc: llvm@lists.linux.dev Link: https://lore.kernel.org/lkml/2e335ac54db44f1d8496583d97f9dab0@AcuMS.a= culab.com Suggested-by: David Laight Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/lkml/20220322102115.186179-4-ammarf= aizi2@gnuweeb.org RFC v2 -> v1: - Use the same pattern for syscall6, regardless using GCC or Clang (comment from David). - Use appropriate constraints for syscall6 instead of always using register variables (comment from David). Link RFC v1: https://lore.kernel.org/llvm/20220320093750.159991-4-ammarf= aizi2@gnuweeb.org RFC v1 -> RFC v2: - Fix %ebp saving method. Don't use redzone, i386 doesn't have a redzone (comment from David and Alviro). --- tools/include/nolibc/arch-i386.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/include/nolibc/arch-i386.h b/tools/include/nolibc/arch-i= 386.h index 6eb96ee8c4f7..cdffd99664ae 100644 --- a/tools/include/nolibc/arch-i386.h +++ b/tools/include/nolibc/arch-i386.h @@ -145,6 +145,29 @@ struct sys_stat_struct { _ret; \ }) =20 +#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \ +({ \ + long _eax =3D (long)(num); \ + long _arg6 =3D (long)(arg6); /* Always in memory */ \ + __asm__ volatile ( \ + "pushl %[_arg6]\n\t" \ + "pushl %%ebp\n\t" \ + "movl 4(%%esp),%%ebp\n\t" \ + "int $0x80\n\t" \ + "popl %%ebp\n\t" \ + "addl $4,%%esp\n\t" \ + : "+a"(_eax) /* %eax */ \ + : "b"(arg1), /* %ebx */ \ + "c"(arg2), /* %ecx */ \ + "d"(arg3), /* %edx */ \ + "S"(arg4), /* %esi */ \ + "D"(arg5), /* %edi */ \ + [_arg6]"m"(_arg6) /* memory */ \ + : "memory", "cc" \ + ); \ + _eax; \ +}) + /* startup code */ /* * i386 System V ABI mandates: --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7137C433EF for ; Thu, 24 Mar 2022 07:32:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348672AbiCXHdi (ORCPT ); Thu, 24 Mar 2022 03:33:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348712AbiCXHcx (ORCPT ); Thu, 24 Mar 2022 03:32:53 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 042E699EFD for ; Thu, 24 Mar 2022 00:31:16 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id DEBB87E34E; Thu, 24 Mar 2022 07:31:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107075; bh=n1uXDvjcl8JGbEVeQRf7yF5iEJHjVnBKBezNqt4ZXAM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hIxr8JnzqLUkq2BYexOsKxWZV6x1+UhlTMGuWpSTrX52jTZrz7KlFZq6kloo/x1p2 FRoUWXlAl72a1m1CgYvZuOo72n/qai6Lt0C/3riuosu0rVemSvHXYdd0Cq1shIrlgL xwwMx12rbt6frNTadVJBU0DSfOGejtE+SE6GKcbI+TTyZCB0FIptkpyyKNTwmGQVdr yTmg49TSeCX9evjsaJaQkH/RpWrR0opGoTu7dP53A6VmKr/FsLBdlmfgfNcgCfTgXB 8Hm1mBE0ZJL+XLlunSgDA2pNDCRwxNPufBnSL2XJLTxjbRSVfnUfdAIIzOYd+FeY4a vwrGs1Hx8sXrg== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 07/11] tools/nolibc/sys: Implement `mmap()` and `munmap()` Date: Thu, 24 Mar 2022 14:30:35 +0700 Message-Id: <20220324073039.140946-8-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Implement mmap() and munmap(). Currently, they are only available for architecures that have my_syscall6 macro. For architectures that don't have, this function will return -1 with errno set to ENOSYS (Function not implemented). This has been tested on x86 and i386. Notes for i386: 1) The common mmap() syscall implementation uses __NR_mmap2 instead of __NR_mmap. 2) The offset must be shifted-right by 12-bit. Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/lkml/20220322102115.186179-5-ammarf= aizi2@gnuweeb.org/ RFC v2 -> v1: * No changes * Link RFC v1: https://lore.kernel.org/lkml/20220320093750.159991-5-ammarf= aizi2@gnuweeb.org/ RFC v1 -> RFC v2: * No changes * --- tools/include/nolibc/sys.h | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index 4d4308d5d111..08491070387b 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -14,6 +14,7 @@ #include #include // for SIGCHLD #include +#include #include #include #include @@ -675,6 +676,67 @@ int mknod(const char *path, mode_t mode, dev_t dev) return ret; } =20 +#ifndef MAP_SHARED +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ +#define MAP_SHARED_VALIDATE 0x03 /* share + validate extension flags */ +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + +static __attribute__((unused)) +void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd, + off_t offset) +{ +#ifndef my_syscall6 + /* Function not implemented. */ + return -ENOSYS; +#else + + int n; + +#if defined(__i386__) + n =3D __NR_mmap2; + offset >>=3D 12; +#else + n =3D __NR_mmap; +#endif + + return (void *)my_syscall6(n, addr, length, prot, flags, fd, offset); +#endif +} + +static __attribute__((unused)) +void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t o= ffset) +{ + void *ret =3D sys_mmap(addr, length, prot, flags, fd, offset); + + if ((unsigned long)ret >=3D -4095UL) { + SET_ERRNO(-(long)ret); + ret =3D MAP_FAILED; + } + return ret; +} + +static __attribute__((unused)) +int sys_munmap(void *addr, size_t length) +{ + return my_syscall2(__NR_munmap, addr, length); +} + +static __attribute__((unused)) +int munmap(void *addr, size_t length) +{ + int ret =3D sys_munmap(addr, length); + + if (ret < 0) { + SET_ERRNO(-ret); + ret =3D -1; + } + return ret; +} =20 /* * int mount(const char *source, const char *target, --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C636C433EF for ; Thu, 24 Mar 2022 07:32:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346801AbiCXHeK (ORCPT ); Thu, 24 Mar 2022 03:34:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59000 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348740AbiCXHcz (ORCPT ); Thu, 24 Mar 2022 03:32:55 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BF79C99684 for ; Thu, 24 Mar 2022 00:31:19 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 5677E7E704; Thu, 24 Mar 2022 07:31:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107078; bh=fJcSLnuw44NoUHae7y/oNQpDDIPqjE4FIFL9l+7MB1w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=A9XBai20pypo06J+WL0KH2qpSL+/EkzbhFNKWNqQHvt3OfWQjjFPEHrJyUXR2VGrZ JEx0z5vAija+MJwAWzQSZPEP5tlU9lb8DNEzZ/BrVXD7KwHUglbUM8DXzWC8d0m8wA FVLTvGOdPycQFeZRDNXxezzaZpyiOZdCDseZF0rmus6Cla/68k45UK/Epi1XR8JcHp rtPm+849fdAY102mZlNB0RUGpLUEbxbOkn3KEGkj2aN6KyH4xL+NJYubnHFxswL6VG Kh0h2LEuEfApGAJ24Vp1eyxxqj2nLXtCjXYhU6F6TtquUp3cnTlVZRFg97/iH0NBqD 39ZncWjSwuK7g== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 08/11] tools/nolibc/types: Implement `offsetof()` and `container_of()` macro Date: Thu, 24 Mar 2022 14:30:36 +0700 Message-Id: <20220324073039.140946-9-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Implement `offsetof()` and `container_of()` macro. The first use case of these macros is for `malloc()`, `realloc()` and `free()`. Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/lkml/20220322102115.186179-6-ammarf= aizi2@gnuweeb.org/ RFC v2 -> v1: * No changes * --- tools/include/nolibc/types.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h index 357e60ad38a8..959997034e55 100644 --- a/tools/include/nolibc/types.h +++ b/tools/include/nolibc/types.h @@ -191,4 +191,15 @@ struct stat { #define major(dev) ((unsigned int)(((dev) >> 8) & 0xfff)) #define minor(dev) ((unsigned int)(((dev) & 0xff)) =20 +#ifndef offsetof +#define offsetof(TYPE, FIELD) ((size_t) &((TYPE *)0)->FIELD) +#endif + +#ifndef container_of +#define container_of(PTR, TYPE, FIELD) ({ \ + __typeof__(((TYPE *)0)->FIELD) *__FIELD_PTR =3D (PTR); \ + (TYPE *)((char *) __FIELD_PTR - offsetof(TYPE, FIELD)); \ +}) +#endif + #endif /* _NOLIBC_TYPES_H */ --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98B70C433EF for ; Thu, 24 Mar 2022 07:32:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348725AbiCXHdl (ORCPT ); Thu, 24 Mar 2022 03:33:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59000 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348748AbiCXHc4 (ORCPT ); Thu, 24 Mar 2022 03:32:56 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 464F599696 for ; Thu, 24 Mar 2022 00:31:23 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 811F37E6FF; Thu, 24 Mar 2022 07:31:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107082; bh=nX8gQEHPE2HZrOlOH0fhLRfzTgkX6D8Tda6qZf1VSfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z5zMQ9aH+Y+v2CKFvc3MdNUzN4Op4TiQrBZm+vFMkV3KiGPv7DamU9NzeR46vOXLc dq6r4SNeTyztv0Tw1GnKIbH5R2hz0WsSknSbQMJfAwWDhe1XJ1OsKKUv/EApbJLrlW p1LYV+d4ZfjRtaqlCvlfNlJwEX3b5PsgigAQuZQTrxChN3krFXBsBWBXRsgsJP6kRj HKsd4HJnsjhJZtlUs5Z71vTdOgsg8Oy7ldWFt/oAhsuodgawKZpJyrkcUO8MFZAer2 cWExTAYSrjX3xBstuJbuo+n2rQ9uEJNljD2sR32zJai03ihBQkf3Kk8xhZSVJ9hF8f GqA0eA7Jp6rGg== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi , David Laight Subject: [PATCH v1 09/11] tools/nolibc/stdlib: Implement `malloc()`, `calloc()`, `realloc()` and `free()` Date: Thu, 24 Mar 2022 14:30:37 +0700 Message-Id: <20220324073039.140946-10-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Implement basic dynamic allocator functions. These functions are currently only available on architectures that have nolibc mmap() syscall implemented. These are not a super-fast memory allocator, but at least they can satisfy basic needs for having heap without libc. Cc: David Laight Signed-off-by: Ammar Faizi --- @@ Changelog: Link v2: https://lore.kernel.org/lkml/20220322102115.186179-7-ammarfaizi= 2@gnuweeb.org/ RFC v2 -> v1: - Round up the malloc() allocation to 4096 (comment from David). - Don't realloc() if we still have enough memory to contain the requested new size (comment from David). - Fix conflict with getenv() fix (after rebase). Link v1: https://lore.kernel.org/lkml/20220320093750.159991-6-ammarfaizi= 2@gnuweeb.org RFC v1 -> RFC v2: - Move container_of() and offsetof() macro to types.h with a separate patch (comment from Willy). --- tools/include/nolibc/stdlib.h | 81 +++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/tools/include/nolibc/stdlib.h b/tools/include/nolibc/stdlib.h index 8a07e263f0d0..8fd32eaf8037 100644 --- a/tools/include/nolibc/stdlib.h +++ b/tools/include/nolibc/stdlib.h @@ -11,7 +11,12 @@ #include "arch.h" #include "types.h" #include "sys.h" +#include "string.h" =20 +struct nolibc_heap { + size_t len; + char user_p[] __attribute__((__aligned__)); +}; =20 /* Buffer used to store int-to-ASCII conversions. Will only be implemented= if * any of the related functions is implemented. The area is large enough to @@ -60,6 +65,18 @@ int atoi(const char *s) return atol(s); } =20 +static __attribute__((unused)) +void free(void *ptr) +{ + struct nolibc_heap *heap; + + if (!ptr) + return; + + heap =3D container_of(ptr, struct nolibc_heap, user_p); + munmap(heap, heap->len); +} + /* getenv() tries to find the environment variable named in the * environment array pointed to by global variable "environ" which must be * declared as a char **, and must be terminated by a NULL (it is recommen= ded @@ -91,6 +108,70 @@ char *getenv(const char *name) return _getenv(name, environ); } =20 +static __attribute__((unused)) +void *malloc(size_t len) +{ + struct nolibc_heap *heap; + + /* Always allocate memory with size multiple of 4096. */ + len =3D sizeof(*heap) + len; + len =3D (len + 4095UL) & -4096UL; + heap =3D mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, + -1, 0); + if (__builtin_expect(heap =3D=3D MAP_FAILED, 0)) + return NULL; + + heap->len =3D len; + return heap->user_p; +} + +static __attribute__((unused)) +void *calloc(size_t size, size_t nmemb) +{ + void *orig; + size_t res =3D 0; + + if (__builtin_expect(__builtin_mul_overflow(nmemb, size, &res), 0)) { + SET_ERRNO(ENOMEM); + return NULL; + } + + /* + * No need to zero the heap, the MAP_ANONYMOUS in malloc() + * already does it. + */ + return malloc(res); +} + +static __attribute__((unused)) +void *realloc(void *old_ptr, size_t new_size) +{ + struct nolibc_heap *heap; + size_t user_p_len; + void *ret; + + if (!old_ptr) + return malloc(new_size); + + heap =3D container_of(old_ptr, struct nolibc_heap, user_p); + user_p_len =3D heap->len - sizeof(*heap); + /* + * Don't realloc() if @user_p_len >=3D @new_size, this block of + * memory is still enough to handle the @new_size. Just return + * the same pointer. + */ + if (user_p_len >=3D new_size) + return old_ptr; + + ret =3D malloc(new_size); + if (__builtin_expect(!ret, 0)) + return NULL; + + memcpy(ret, heap->user_p, heap->len); + munmap(heap, heap->len); + return ret; +} + /* Converts the unsigned long integer to its hex representation into * buffer , which must be long enough to store the number and the * trailing zero (17 bytes for "ffffffffffffffff" or 9 for "ffffffff"). The --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A0DDC4332F for ; Thu, 24 Mar 2022 07:32:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346293AbiCXHdr (ORCPT ); Thu, 24 Mar 2022 03:33:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58974 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348757AbiCXHc5 (ORCPT ); Thu, 24 Mar 2022 03:32:57 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3DB9898F7C for ; Thu, 24 Mar 2022 00:31:26 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 085E67E713; Thu, 24 Mar 2022 07:31:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107085; bh=v3/gvQsbdB6gVOFXY4Hp+dHuM9qN2h7z2eGiF+eRI6k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BC/nROz59xu6KERhODQ7gvkBIhQ8sVd/U06p7f859dOyJZcUhxER7YARMCf9eEfuL K8zQulNlAZW8XelSktxdeZBteYY/GZeghtq+C1yDTIErF/VcVQDAfo7WDV+I/IrmPC 1bGLVnfXfJOwQvRAUUaXANooMEbQ4BtCgbOhq3Lfu65pHuVRbqfroerO2bzzovbwVg oKX34wzFrFYxbQBLb2EjgGe2HNoYlpRBGXsdx0rYgrZLy7u8CrEu8ygBn305arJ2JE MntlKJUNfuxG50JAUBH2zebFd3tDsbLmZZn7zG+dhj3uQ/SLbbLOAND0CFaLet8F0L BoIdRkfZmcncQ== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 10/11] tools/nolibc/string: Implement `strnlen()` Date: Thu, 24 Mar 2022 14:30:38 +0700 Message-Id: <20220324073039.140946-11-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" size_t strnlen(const char *str, size_t maxlen); The strnlen() function returns the number of bytes in the string pointed to by sstr, excluding the terminating null byte ('\0'), but at most maxlen. In doing this, strnlen() looks only at the first maxlen characters in the string pointed to by str and never beyond str[maxlen-1]. The first use case of this function is for determining the memory allocation size in the strndup() function. Link: https://lore.kernel.org/lkml/CAOG64qMpEMh+EkOfjNdAoueC+uQyT2Uv3689_sO= r37-JxdJf4g@mail.gmail.com Suggested-by: Alviro Iskandar Setiawan Signed-off-by: Ammar Faizi --- @@ Changelog: Link v2: https://lore.kernel.org/lkml/20220322102115.186179-8-ammarfaizi= 2@gnuweeb.org/ RFC v2 -> v1: * No changes * --- tools/include/nolibc/string.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h index 75a453870498..f43d52a44d09 100644 --- a/tools/include/nolibc/string.h +++ b/tools/include/nolibc/string.h @@ -147,6 +147,15 @@ size_t nolibc_strlen(const char *str) #define strlen(str) nolibc_strlen((str)) #endif =20 +static __attribute__((unused)) +size_t strnlen(const char *str, size_t maxlen) +{ + size_t len; + + for (len =3D 0; (len < maxlen) && str[len]; len++); + return len; +} + static __attribute__((unused)) size_t strlcat(char *dst, const char *src, size_t size) { --=20 Ammar Faizi From nobody Sat Jun 20 01:53:14 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 200D1C433F5 for ; Thu, 24 Mar 2022 07:32:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348648AbiCXHdv (ORCPT ); Thu, 24 Mar 2022 03:33:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59418 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348769AbiCXHdA (ORCPT ); Thu, 24 Mar 2022 03:33:00 -0400 Received: from gnuweeb.org (gnuweeb.org [51.81.211.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7DBA799686 for ; Thu, 24 Mar 2022 00:31:29 -0700 (PDT) Received: from integral2.. (unknown [182.2.71.236]) by gnuweeb.org (Postfix) with ESMTPSA id 7BFB97E714; Thu, 24 Mar 2022 07:31:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1648107089; bh=PD8pLr7A85iII21QaBO68Pb6e6bGmBeN0QNU1aruB6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R72WQfG/Ih8sBMAoKTsXCsRP8bJGHyRhUkTzyT1ugZuOw4ifSlrpseddB1nSYVjYw /jNHSFe2sj+fRex7kgMO0K7WTxXZOz7raFjEDIO8KaAUoBPotx2gli11oz3eFUXnWi Yv71wv5hanE9vJtENPVziJEEYmicGQdc5gGCHegy0vx2CPIYSGtB9SOGMT0Fn4Cs+Z SLy9iAN4U5//GFQvSAvIorqjq3bJwaPbh7F/hLSt40oHWZy/UqhJc9MX0MkL1h0rSz nZJx4kXlSh/f9/WQZvwfwnLoGfVIqF/up1wEuElVRJzn0BhEiyIcRBebiheC8PXfTH I4bEg95n+Qf+w== From: Ammar Faizi To: Willy Tarreau Cc: "Paul E. McKenney" , Alviro Iskandar Setiawan , Nugraha , Linux Kernel Mailing List , GNU/Weeb Mailing List , Ammar Faizi Subject: [PATCH v1 11/11] tools/include/string: Implement `strdup()` and `strndup()` Date: Thu, 24 Mar 2022 14:30:39 +0700 Message-Id: <20220324073039.140946-12-ammarfaizi2@gnuweeb.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> References: <20220324073039.140946-1-ammarfaizi2@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" These functions are currently only available on architectures that have my_syscall6() macro implemented. Since these functions use malloc(), malloc() uses mmap(), mmap() depends on my_syscall6() macro. On architectures that don't support my_syscall6(), these function will always return NULL with errno set to ENOSYS. Signed-off-by: Ammar Faizi --- @@ Changelog: Link RFC v2: https://lore.kernel.org/lkml/20220322102115.186179-9-ammarf= aizi2@gnuweeb.org/ RFC v2 -> v1: * No changes * Link RFC v1: https://lore.kernel.org/lkml/20220320093750.159991-7-ammarf= aizi2@gnuweeb.org/ RFC v1 -> RFC v2: - Update strdup and strndup implementation, use strlen and strnlen to g= et the string length first (comment from Willy and Alviro). - Fix the subject line prefix, it was "tools/include/string: ", it shou= ld be "tools/nolibc/string: ". - Update the commit message. --- tools/include/nolibc/string.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h index f43d52a44d09..bef35bee9c44 100644 --- a/tools/include/nolibc/string.h +++ b/tools/include/nolibc/string.h @@ -9,6 +9,8 @@ =20 #include "std.h" =20 +static void *malloc(size_t len); + /* * As much as possible, please keep functions alphabetically sorted. */ @@ -156,6 +158,36 @@ size_t strnlen(const char *str, size_t maxlen) return len; } =20 +static __attribute__((unused)) +char *strdup(const char *str) +{ + size_t len; + char *ret; + + len =3D strlen(str); + ret =3D malloc(len + 1); + if (__builtin_expect(ret !=3D NULL, 1)) + memcpy(ret, str, len + 1); + + return ret; +} + +static __attribute__((unused)) +char *strndup(const char *str, size_t maxlen) +{ + size_t len; + char *ret; + + len =3D strnlen(str, maxlen); + ret =3D malloc(len + 1); + if (__builtin_expect(ret !=3D NULL, 1)) { + memcpy(ret, str, len); + ret[len] =3D '\0'; + } + + return ret; +} + static __attribute__((unused)) size_t strlcat(char *dst, const char *src, size_t size) { --=20 Ammar Faizi