lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 24 Mar 2022 14:30:32 +0700
From:   Ammar Faizi <ammarfaizi2@...weeb.org>
To:     Willy Tarreau <w@....eu>
Cc:     "Paul E. McKenney" <paulmck@...nel.org>,
        Alviro Iskandar Setiawan <alviro.iskandar@...weeb.org>,
        Nugraha <richiisei@...il.com>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        GNU/Weeb Mailing List <gwml@...r.gnuweeb.org>,
        Ammar Faizi <ammarfaizi2@...weeb.org>,
        David Laight <David.Laight@...LAB.COM>
Subject: [PATCH v1 04/11] tools/nolibc: x86-64: Use appropriate register constraints if exist

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.aculab.com
Suggested-by: David Laight <David.Laight@...LAB.COM>
Signed-off-by: Ammar Faizi <ammarfaizi2@...weeb.org>
---
 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 {
  *
  */
 
-#define my_syscall0(num)                                                      \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_ret)                                                  \
-		: "0"(_num)                                                   \
-		: "rcx", "r11", "memory", "cc"                                \
-	);                                                                    \
-	_ret;                                                                 \
+#define my_syscall0(num)					\
+({								\
+	long _ret = (num);					\
+	__asm__ volatile (					\
+		"syscall\n"					\
+		: "+a"(_ret)	/* %rax */			\
+		:						\
+		: "rcx", "r11", "memory", "cc"			\
+	);							\
+	_ret;							\
 })
 
-#define my_syscall1(num, arg1)                                                \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_ret)                                                  \
-		: "r"(_arg1),                                                 \
-		  "0"(_num)                                                   \
-		: "rcx", "r11", "memory", "cc"                                \
-	);                                                                    \
-	_ret;                                                                 \
+#define my_syscall1(num, arg1)					\
+({								\
+	long _ret = (num);					\
+	__asm__ volatile (					\
+		"syscall\n"					\
+		: "+a"(_ret)	/* %rax */			\
+		: "D"(arg1)	/* %rdi */			\
+		: "rcx", "r11", "memory", "cc"			\
+	);							\
+	_ret;							\
 })
 
-#define my_syscall2(num, arg1, arg2)                                          \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	register long _arg2 __asm__("rsi") = (long)(arg2);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_ret)                                                  \
-		: "r"(_arg1), "r"(_arg2),                                     \
-		  "0"(_num)                                                   \
-		: "rcx", "r11", "memory", "cc"                                \
-	);                                                                    \
-	_ret;                                                                 \
+#define my_syscall2(num, arg1, arg2)				\
+({								\
+	long _ret = (num);					\
+	__asm__ volatile (					\
+		"syscall\n"					\
+		: "+a"(_ret)	/* %rax */			\
+		: "D"(arg1),	/* %rdi */			\
+		  "S"(arg2)	/* %rsi */			\
+		: "rcx", "r11", "memory", "cc"			\
+	);							\
+	_ret;							\
 })
 
-#define my_syscall3(num, arg1, arg2, arg3)                                    \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	register long _arg2 __asm__("rsi") = (long)(arg2);                    \
-	register long _arg3 __asm__("rdx") = (long)(arg3);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_ret)                                                  \
-		: "r"(_arg1), "r"(_arg2), "r"(_arg3),                         \
-		  "0"(_num)                                                   \
-		: "rcx", "r11", "memory", "cc"                                \
-	);                                                                    \
-	_ret;                                                                 \
+#define my_syscall3(num, arg1, arg2, arg3)			\
+({								\
+	long _ret = (num);					\
+	__asm__ volatile (					\
+		"syscall\n"					\
+		: "+a"(_ret)	/* %rax */			\
+		: "D"(arg1),	/* %rdi */			\
+		  "S"(arg2),	/* %rsi */			\
+		  "d"(arg3)	/* %rdx */			\
+		: "rcx", "r11", "memory", "cc"			\
+	);							\
+	_ret;							\
 })
 
-#define my_syscall4(num, arg1, arg2, arg3, arg4)                              \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	register long _arg2 __asm__("rsi") = (long)(arg2);                    \
-	register long _arg3 __asm__("rdx") = (long)(arg3);                    \
-	register long _arg4 __asm__("r10") = (long)(arg4);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_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 = (num);					\
+	register long _arg4 __asm__("r10") = (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;							\
 })
 
-#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5)                        \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	register long _arg2 __asm__("rsi") = (long)(arg2);                    \
-	register long _arg3 __asm__("rdx") = (long)(arg3);                    \
-	register long _arg4 __asm__("r10") = (long)(arg4);                    \
-	register long _arg5 __asm__("r8")  = (long)(arg5);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_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 = (num);					\
+	register long _arg4 __asm__("r10") = (long)(arg4);	\
+	register long _arg5 __asm__("r8")  = (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;							\
 })
 
-#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6)                  \
-({                                                                            \
-	long _ret;                                                            \
-	register long _num  __asm__("rax") = (num);                           \
-	register long _arg1 __asm__("rdi") = (long)(arg1);                    \
-	register long _arg2 __asm__("rsi") = (long)(arg2);                    \
-	register long _arg3 __asm__("rdx") = (long)(arg3);                    \
-	register long _arg4 __asm__("r10") = (long)(arg4);                    \
-	register long _arg5 __asm__("r8")  = (long)(arg5);                    \
-	register long _arg6 __asm__("r9")  = (long)(arg6);                    \
-	                                                                      \
-	__asm__ volatile (                                                    \
-		"syscall\n"                                                   \
-		: "=a"(_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 = (num);					\
+	register long _arg4 __asm__("r10") = (long)(arg4);	\
+	register long _arg5 __asm__("r8")  = (long)(arg5);	\
+	register long _arg6 __asm__("r9")  = (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;							\
 })
 
 /* startup code */
-- 
Ammar Faizi

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ