public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH, RFC] Add public function syscall_no_errno
@ 2024-01-28 16:39 Askar Safin
  2024-02-01 17:53 ` Adhemerval Zanella Netto
  2024-02-07  1:57 ` Mike Frysinger
  0 siblings, 2 replies; 23+ messages in thread
From: Askar Safin @ 2024-01-28 16:39 UTC (permalink / raw)
  To: libc-alpha; +Cc: carlos

Hi! I want glibc to have function "syscall_no_errno" on Linux.
It should do the same "syscall" does, but it should not interpret
return value and set errno. This is useful for calling syscalls
such as getuid. I. e. now the user can call directly all syscalls
including getuid and similar.

I add example patch. It is quick-and-dirty. I was unable to figure out
how to add function to headers. So, please, don't apply it as-is.

I just want to know do you agree with my proposal. If yes, I will try
to write better patch.

I will repeat: currently glibc is simply incomplete, because it
does not provide a way to call directly syscalls, such as getuid.
So the user have to craft assembly, which is very difficult.

The patch is against current master, i. e. ae49a7b29acc184b03c2a6bd6ac01b5e08efd54f

--

diff --git a/misc/Versions b/misc/Versions
index d5b348e8..ad37a4c2 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -71,7 +71,7 @@ libc {
     # s*
     sbrk; select; setdomainname; setfsent; sethostent; sethostid; sethostname;
     setlogmask; setmntent; setregid; setreuid; setttyent; setusershell; sstk;
-    stty; sync; syscall; syslog;
+    stty; sync; syscall; syslog; syscall_no_errno;
 
     # t*
     tdelete; tfind; truncate; tsearch; ttyslot; twalk;
diff --git a/posix/unistd.h b/posix/unistd.h
index 54d7d752..2f0f6e79 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -1089,6 +1089,7 @@ extern void *sbrk (intptr_t __delta) __THROW;
    In Mach, all system calls take normal arguments and always return an
    error code (zero for success).  */
 extern long int syscall (long int __sysno, ...) __THROW;
+extern long int syscall_no_errno (long int __sysno, ...) __THROW;
 
 #endif	/* Use misc.  */
 
diff --git a/sysdeps/unix/sysv/linux/syscall-names.list b/sysdeps/unix/sysv/linux/syscall-names.list
index aac065e7..dac4d78e 100644
--- a/sysdeps/unix/sysv/linux/syscall-names.list
+++ b/sysdeps/unix/sysv/linux/syscall-names.list
@@ -612,6 +612,7 @@ sys_epoll_create
 sys_epoll_ctl
 sys_epoll_wait
 syscall
+syscall_no_errno
 sysfs
 sysinfo
 syslog
diff --git a/sysdeps/unix/sysv/linux/syscall.c b/sysdeps/unix/sysv/linux/syscall.c
index 3cff1d97..481b18a4 100644
--- a/sysdeps/unix/sysv/linux/syscall.c
+++ b/sysdeps/unix/sysv/linux/syscall.c
@@ -41,3 +41,20 @@ syscall (long int number, ...)
     }
   return r;
 }
+long int
+syscall_no_errno (long int number, ...)
+{
+  va_list args;
+
+  va_start (args, number);
+  long int a0 = va_arg (args, long int);
+  long int a1 = va_arg (args, long int);
+  long int a2 = va_arg (args, long int);
+  long int a3 = va_arg (args, long int);
+  long int a4 = va_arg (args, long int);
+  long int a5 = va_arg (args, long int);
+  va_end (args);
+
+  long int r = INTERNAL_SYSCALL_NCS_CALL (number, a0, a1, a2, a3, a4, a5);
+  return r;
+}
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index aea7848e..55d9dadd 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -1761,6 +1761,7 @@ GLIBC_2.2.5 sys_nerr D 0x4
 GLIBC_2.2.5 sys_sigabbrev D 0x200
 GLIBC_2.2.5 sys_siglist D 0x200
 GLIBC_2.2.5 syscall F
+GLIBC_2.2.5 syscall_no_errno F
 GLIBC_2.2.5 sysconf F
 GLIBC_2.2.5 sysctl F
 GLIBC_2.2.5 sysinfo F
diff --git a/sysdeps/unix/sysv/linux/x86_64/syscall.S b/sysdeps/unix/sysv/linux/x86_64/syscall.S
index 43af8087..04483251 100644
--- a/sysdeps/unix/sysv/linux/x86_64/syscall.S
+++ b/sysdeps/unix/sysv/linux/x86_64/syscall.S
@@ -26,6 +26,18 @@
 
 
 	.text
+ENTRY (syscall_no_errno)
+	movq %rdi, %rax		/* Syscall number -> rax.  */
+	movq %rsi, %rdi		/* shift arg1 - arg5.  */
+	movq %rdx, %rsi
+	movq %rcx, %rdx
+	movq %r8, %r10
+	movq %r9, %r8
+	movq 8(%rsp),%r9	/* arg6 is on the stack.  */
+	syscall			/* Do the system call.  */
+	ret			/* Return to caller.  */
+
+PSEUDO_END_NOERRNO (syscall_no_errno)
 ENTRY (syscall)
 	movq %rdi, %rax		/* Syscall number -> rax.  */
 	movq %rsi, %rdi		/* shift arg1 - arg5.  */

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2024-02-13 11:57 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-28 16:39 [PATCH, RFC] Add public function syscall_no_errno Askar Safin
2024-02-01 17:53 ` Adhemerval Zanella Netto
2024-02-01 18:18   ` Rich Felker
2024-02-01 19:32   ` Askar Safin
2024-02-01 20:16     ` dalias
2024-02-01 20:57       ` Adhemerval Zanella Netto
2024-02-08 15:02         ` [PATCH v2] " Askar Safin
2024-02-08 17:48           ` Szabolcs Nagy
2024-02-12 14:24           ` Florian Weimer
2024-02-12 14:44             ` Rich Felker
2024-02-12 16:16               ` Askar Safin
2024-02-12 17:25                 ` Zack Weinberg
2024-02-12 17:43                   ` Andreas Schwab
2024-02-12 18:22                     ` Zack Weinberg
2024-02-13  9:10                       ` Andreas Schwab
2024-02-13 11:57                         ` Adhemerval Zanella Netto
2024-02-12 17:55                   ` Adhemerval Zanella Netto
2024-02-12 18:34                   ` Askar Safin
2024-02-07  0:59       ` [PATCH, RFC] " Askar Safin
2024-02-07 20:59         ` dalias
2024-02-08 17:08           ` Askar Safin
2024-02-07  1:57 ` Mike Frysinger
2024-02-07 12:55   ` Askar Safin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).