From: Askar Safin <safinaskar@zohomail.com>
To: libc-alpha@sourceware.org
Cc: carlos@redhat.com
Subject: [PATCH, RFC] Add public function syscall_no_errno
Date: Sun, 28 Jan 2024 19:39:58 +0300 [thread overview]
Message-ID: <20240128163958.17421-1-safinaskar@zohomail.com> (raw)
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. */
next reply other threads:[~2024-01-28 16:40 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-28 16:39 Askar Safin [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240128163958.17421-1-safinaskar@zohomail.com \
--to=safinaskar@zohomail.com \
--cc=carlos@redhat.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).