From: Samuel Thibault <samuel.thibault@gnu.org>
To: Sergey Bugaev <bugaevc@gmail.com>
Cc: libc-alpha@sourceware.org, bug-hurd@gnu.org
Subject: Re: [RFC PATCH glibc 17/34] hurd: Implement x86_64/intr-msg.h
Date: Mon, 10 Apr 2023 20:41:39 +0200 [thread overview]
Message-ID: <20230410184139.cdkw6olzy2ruwnlf@begin> (raw)
In-Reply-To: <20230319151017.531737-18-bugaevc@gmail.com>
Applied, thanks!
Sergey Bugaev, le dim. 19 mars 2023 18:10:00 +0300, a ecrit:
> This is a prelimenary version of intr-msg.h. I can't know whether or not
> it works until we can test it.
Sure :)
> The code relies on syscall preserving values
> of the registers used to pass syscall arguments. The code in SYSCALL_EXAMINE
> that just compares two bytes to the encoded syscall instruction is sure to
> give many false positives; we're going to need to come up with a more reliable
> scheme.
Not necessarily: this is only used for msg_report_wait, which is already
extra cautious about what it's doing, at worse it will report dumb
information, which should be fine enough for msg_report_wait. Possibly
we could filter out by addresses of the functions known to perform an
actual system call.
Samuel
> sysdeps/mach/hurd/x86_64/intr-msg.h | 119 ++++++++++++++++++++++++++++
> 1 file changed, 119 insertions(+)
> create mode 100644 sysdeps/mach/hurd/x86_64/intr-msg.h
>
> diff --git a/sysdeps/mach/hurd/x86_64/intr-msg.h b/sysdeps/mach/hurd/x86_64/intr-msg.h
> new file mode 100644
> index 00000000..5d94c85f
> --- /dev/null
> +++ b/sysdeps/mach/hurd/x86_64/intr-msg.h
> @@ -0,0 +1,119 @@
> +/* Machine-dependent details of interruptible RPC messaging. x86_64 version.
> + Copyright (C) 1995-2023 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +
> +/* Note that we must mark OPTION and TIMEOUT as outputs of this operation,
> + to indicate that the signal thread might mutate them as part
> + of sending us to a signal handler. */
> +
> +#define INTR_MSG_TRAP(msg, option, send_size, rcv_size, rcv_name, timeout, notify, cancel_p, intr_port_p) \
> +({ \
> + error_t err; \
> + register uintptr_t rcv_size_r10 asm ("r10") = rcv_size; \
> + register uintptr_t rcv_name_r8 asm ("r8") = rcv_name; \
> + register uintptr_t timeout_r9 asm ("r9") = timeout; \
> + asm volatile ( \
> + ".globl _hurd_intr_rpc_msg_about_to\n" \
> + ".globl _hurd_intr_rpc_msg_setup_done\n" \
> + ".globl _hurd_intr_rpc_msg_in_trap\n" \
> + /* Clear rax before we do the check for cancel below. This is to
> + detect rax being set to non-zero (actually MACH_SEND_INTERRUPTED)
> + from the outside (namely, _hurdsig_abort_rpcs), which signals us
> + to skip the trap we were about to enter. */ \
> + " xor %[err], %[err]\n" \
> + "_hurd_intr_rpc_msg_about_to:" \
> + /* We need to make a last check of cancel, in case we got interrupted
> + right before _hurd_intr_rpc_msg_about_to. */ \
> + " cmpl $0, %[cancel]\n" \
> + " jz _hurd_intr_rpc_msg_do\n" \
> + /* We got interrupted, note so and return EINTR. */ \
> + " movl $0, %[intr_port]\n" \
> + " movl %[eintr], %[err]\n" \
> + " jmp _hurd_intr_rpc_msg_sp_restored\n" \
> + "_hurd_intr_rpc_msg_do:" \
> + /* Ok, prepare the mach_msg_trap arguments. We pass the first 6 args
> + in registers, and push the last one and a fake return address. */ \
> + " pushq %[notify]\n" \
> + " pushq $0\n" \
> + "_hurd_intr_rpc_msg_setup_done:" \
> + /* From here on, it is safe to make us jump over the syscall. Now
> + check if we have been told to skip the syscall while running
> + the above. */ \
> + " test %[err], %[err]\n" \
> + " jnz _hurd_intr_rpc_msg_in_trap\n" \
> + /* Do the actual syscall. */ \
> + " movq $-25, %%rax\n" \
> + "_hurd_intr_rpc_msg_do_trap: syscall # status in %[err]\n" \
> + "_hurd_intr_rpc_msg_in_trap:" \
> + /* Clean the arguments. */ \
> + " addq $16, %%rsp\n" \
> + "_hurd_intr_rpc_msg_sp_restored:" \
> + : [err] "=&a" (err), "+S" (option), [intr_port] "=m" (*intr_port_p), \
> + "+r" (timeout_r9) \
> + : "D" (msg), "d" (send_size), "r" (rcv_size_r10), "r" (rcv_name_r8), \
> + [notify] "rm" ((uintptr_t) notify), [cancel] "m" (*cancel_p), \
> + [eintr] "i" (EINTR) \
> + : "rcx", "r11"); \
> + timeout = timeout_r9; \
> + err; \
> +})
> +\f
> +#include "hurdfault.h"
> +
> +/* This cannot be an inline function because it calls setjmp. */
> +#define SYSCALL_EXAMINE(state, callno) \
> +({ \
> + struct { unsigned char c[2]; } *p = (void *) ((state)->rip - 2); \
> + int result; \
> + if (_hurdsig_catch_memory_fault (p)) \
> + return 0; \
> + if (result = p->c[0] == 0xf && p->c[1] == 0x5) \
> + /* The PC appears to be just after a `syscall' instruction. \
> + This is a system call in progress; %rax holds the call number. */ \
> + *(callno) = (state)->rax; \
> + _hurdsig_end_catch_fault (); \
> + result; \
> +})
> +
> +
> +/* This cannot be an inline function because it calls setjmp. */
> +#define MSG_EXAMINE(state, msgid, rcvname, send_name, opt, tmout) \
> +({ \
> + int ret = 0; \
> + const struct machine_thread_state *s = (state); \
> + const mach_msg_header_t *msg = (const void *) s->rdi; \
> + *(rcvname) = s->r8; \
> + *(opt) = s->rsi; \
> + *(tmout) = s->r9; \
> + if (msg == 0) \
> + { \
> + *(send_name) = MACH_PORT_NULL; \
> + *(msgid) = 0; \
> + } \
> + else \
> + { \
> + ret = _hurdsig_catch_memory_fault (msg) ? -1 : 0; \
> + if (ret == 0) \
> + { \
> + *(send_name) = msg->msgh_remote_port; \
> + *(msgid) = msg->msgh_id; \
> + _hurdsig_end_catch_fault (); \
> + } \
> + } \
> + ret; \
> +})
> --
> 2.39.2
>
--
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.
next prev parent reply other threads:[~2023-04-10 18:41 UTC|newest]
Thread overview: 140+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-19 15:09 [RFC PATCH 00/34] The rest of the x86_64-gnu port Sergey Bugaev
2023-03-19 15:09 ` [RFC PATCH gnumach 01/34] Add i386_fsgs_base_state Sergey Bugaev
2023-04-02 22:43 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH gnumach 02/34] Remove bootstrap.defs Sergey Bugaev
2023-04-02 22:43 ` Samuel Thibault
2023-04-03 9:39 ` Sergey Bugaev
2023-03-19 15:09 ` [RFC PATCH gnumach 03/34] Make exception subcode a long Sergey Bugaev
2023-04-02 22:45 ` Samuel Thibault
2023-04-03 9:32 ` Sergey Bugaev
2023-04-06 2:11 ` Flávio Cruz
2023-04-10 23:52 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 04/34] hurd: " Sergey Bugaev
2023-04-02 22:52 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 05/34] hurd: Remove __hurd_threadvar_stack_{offset,mask} Sergey Bugaev
2023-04-02 22:53 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 06/34] hurd: Swap around two function calls Sergey Bugaev
2023-04-02 22:54 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 07/34] hurd: Fix file name in #error Sergey Bugaev
2023-04-02 22:55 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 08/34] hurd: Disable O_TRUNC and FS_RETRY_MAGICAL in rtld Sergey Bugaev
2023-04-02 22:57 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 09/34] hurd: Fix _hurd_setup_sighandler () signature Sergey Bugaev
2023-04-02 22:58 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 10/34] stdio-common: Fix building when !IS_IN (libc) Sergey Bugaev
2023-04-02 23:01 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 11/34] mach, hurd: Drop __libc_lock_self0 Sergey Bugaev
2023-04-02 23:02 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 12/34] hurd: More 64-bit integer casting fixes Sergey Bugaev
2023-04-02 23:03 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 13/34] x86-64: Disable prefer_map_32bit_exec tunable on non-Linux Sergey Bugaev
2023-04-02 23:09 ` Samuel Thibault
2023-04-03 10:10 ` Sergey Bugaev
2023-04-03 19:02 ` H.J. Lu
2023-04-03 20:11 ` Sergey Bugaev
2023-03-19 15:09 ` [RFC PATCH glibc 14/34] hurd: Move rtld-strncpy-c.c out of mach/hurd/ Sergey Bugaev
2023-04-02 23:10 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 15/34] hurd: Use uintptr_t for register values in trampoline.c Sergey Bugaev
2023-04-02 23:13 ` Samuel Thibault
2023-03-19 15:09 ` [RFC PATCH glibc 16/34] hurd: Add sys/ucontext.h and sigcontext.h for x86_64 Sergey Bugaev
2023-04-10 18:39 ` Samuel Thibault
2023-04-10 19:07 ` Sergey Bugaev
2023-04-10 19:21 ` Samuel Thibault
2023-04-10 18:58 ` Samuel Thibault
2023-04-10 19:13 ` Sergey Bugaev
2023-04-10 19:21 ` Samuel Thibault
2023-04-10 21:50 ` Sergey Bugaev
2023-04-10 22:23 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 17/34] hurd: Implement x86_64/intr-msg.h Sergey Bugaev
2023-04-10 18:41 ` Samuel Thibault [this message]
2023-03-19 15:10 ` [RFC PATCH glibc 18/34] hurd: Port trampoline.c to x86_64 Sergey Bugaev
2023-04-03 11:56 ` [PATCH v2 18.0/34] Alignment-respecting x86_64 trampoline.c Sergey Bugaev
2023-04-03 11:56 ` [PATCH v2 18.1/34] hurd: Do not declare local variables volatile Sergey Bugaev
2023-04-10 18:42 ` Samuel Thibault
2023-04-03 11:56 ` [PATCH v2 18.2/34] hurd: Port trampoline.c to x86_64 Sergey Bugaev
2023-04-10 19:04 ` Samuel Thibault
2023-04-10 21:33 ` Sergey Bugaev
2023-03-19 15:10 ` [RFC PATCH glibc 19/34] hurd: Move a couple of singal-related files to x86 Sergey Bugaev
2023-04-02 23:15 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 20/34] htl: Add tcb-offsets.sym for x86_64 Sergey Bugaev
2023-04-02 23:16 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 21/34] x86_64: Add rtld-stpncpy & rtld-strncpy Sergey Bugaev
2023-04-02 23:18 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 22/34] htl: Implement thread_set_pcsptp for x86_64 Sergey Bugaev
2023-04-02 23:19 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 23/34] elf: Stop including tls.h in ldsodefs.h Sergey Bugaev
2023-04-02 23:20 ` Samuel Thibault
2023-04-03 9:26 ` Sergey Bugaev
2023-04-10 21:26 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 24/34] hurd: Only check for TLS initialization inside rtld or in static builds Sergey Bugaev
2023-04-10 21:33 ` Samuel Thibault
2023-04-11 18:57 ` Samuel Thibault
2023-04-11 19:18 ` Samuel Thibault
2023-04-11 20:03 ` Samuel Thibault
2023-04-11 20:27 ` Sergey Bugaev
2023-04-11 21:23 ` Samuel Thibault
2023-04-12 8:36 ` Sergey Bugaev
2023-04-12 9:00 ` Samuel Thibault
2023-04-12 10:42 ` Sergey Bugaev
2023-04-12 10:45 ` Samuel Thibault
2023-04-12 17:18 ` Sergey Bugaev
2023-04-12 23:46 ` Samuel Thibault
2023-04-13 10:02 ` Sergey Bugaev
2023-04-13 10:10 ` Samuel Thibault
2023-04-13 12:17 ` Sergey Bugaev
2023-04-13 21:47 ` Samuel Thibault
2023-04-13 22:21 ` Samuel Thibault
2023-04-14 8:29 ` Sergey Bugaev
2023-04-14 8:36 ` Samuel Thibault
2023-04-14 8:53 ` Sergey Bugaev
2023-04-14 9:09 ` Samuel Thibault
2023-04-14 9:23 ` Sergey Bugaev
2023-04-14 9:31 ` Samuel Thibault
2023-04-17 7:16 ` Samuel Thibault
2023-04-14 17:34 ` Samuel Thibault
2023-04-14 19:52 ` Sergey Bugaev
2023-03-19 15:10 ` [RFC PATCH glibc 25/34] hurd: Improve reply port handling when exiting signal handlers Sergey Bugaev
2023-04-10 22:03 ` Samuel Thibault
2023-04-11 7:44 ` Sergey Bugaev
2023-04-11 20:15 ` Samuel Thibault
2023-04-11 20:35 ` Sergey Bugaev
2023-04-12 22:54 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 26/34] hurd: Remove __hurd_local_reply_port Sergey Bugaev
2023-04-10 22:07 ` Samuel Thibault
2023-04-10 22:35 ` Samuel Thibault
2023-04-11 8:00 ` Sergey Bugaev
2023-04-11 20:18 ` Samuel Thibault
2023-04-13 11:58 ` [RFC PATCH glibc v2 " Sergey Bugaev
2023-04-13 13:12 ` Samuel Thibault
2023-04-13 13:20 ` Sergey Bugaev
2023-04-13 21:28 ` Samuel Thibault
2023-04-14 17:33 ` Samuel Thibault
2023-04-14 20:29 ` Sergey Bugaev
2023-04-15 6:45 ` Samuel Thibault
2023-04-15 7:34 ` Sergey Bugaev
2023-04-15 7:42 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 27/34] hurd: Don't leak __hurd_reply_port0 Sergey Bugaev
2023-04-10 22:25 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 28/34] hurd: Implement _hurd_longjmp_thread_state for x86_64 Sergey Bugaev
2023-04-02 23:23 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 29/34] hurd: Add vm_param.h " Sergey Bugaev
2023-04-02 23:24 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 30/34] hurd: Implement longjmp " Sergey Bugaev
2023-03-19 15:10 ` [RFC PATCH glibc 31/34] hurd: Microoptimize _hurd_self_sigstate () Sergey Bugaev
2023-04-02 23:26 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 32/34] hurd: Implement sigreturn for x86_64 Sergey Bugaev
2023-04-03 11:47 ` [PATCH v2] " Sergey Bugaev
2023-03-19 15:10 ` [RFC PATCH glibc 33/34] hurd: Create abilist files for lib{mach,hurd}user Sergey Bugaev
2023-03-19 15:19 ` Samuel Thibault
2023-03-19 15:39 ` Sergey Bugaev
2023-03-19 15:43 ` Samuel Thibault
2023-03-19 15:10 ` [RFC PATCH glibc 34/34] hurd: Add expected abilist files for x86_64 Sergey Bugaev
2023-03-19 18:04 ` Florian Weimer
2023-03-19 20:14 ` [PATCH v2] " Sergey Bugaev
2023-03-20 6:30 ` Florian Weimer
2023-03-19 16:44 ` [RFC PATCH 00/34] The rest of the x86_64-gnu port Luca
2023-03-20 5:03 ` Flávio Cruz
2023-04-02 23:30 ` Samuel Thibault
2023-04-10 19:20 ` Samuel Thibault
2023-04-10 21:24 ` Sergey Bugaev
2023-04-10 21:27 ` Samuel Thibault
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=20230410184139.cdkw6olzy2ruwnlf@begin \
--to=samuel.thibault@gnu.org \
--cc=bug-hurd@gnu.org \
--cc=bugaevc@gmail.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).