From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id ELiQH+ffQme3egEA62LTzQ:P1 (envelope-from ) for ; Sun, 24 Nov 2024 08:12:23 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1.migadu.com with LMTPS id ELiQH+ffQme3egEA62LTzQ (envelope-from ) for ; Sun, 24 Nov 2024 09:12:23 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=rsWthIt8; dkim=fail ("headers rsa verify failed") header.d=gnu.org header.s=fencepost-gnu-org header.b=BhWOGhdJ; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1732435943; a=rsa-sha256; cv=none; b=R2t2R9MNr4EbK4bPXpCAAMjirMGX3FFpZXbGOpajZJjsNWO/MVDkvaeWOLMUOK7OZeJ5uQ BerkPQX0J6koZCt01ol8MggmRvpJZTbJDp4VIzcnPERnipR0i9bpFVNXxllWJ5s4es+69s pM2Dnara4EnAfCuEv6wIa4YG92Ig8ZNWLr3z9O+r7dH6n6jAAZg4eU8uoT5p+cutNk3UtE 46faaEnFS7wSVHWsEZBV1tBg6l8aEbtONHRhbL/n3KvDERqhbnyG2bpXaw/aiKSTFDMLrP /i92XA3DHnYkcUQCglUfolGN2jxMGM/H90rzV5jM9+ncmUFZav1rTCsoRy0/Lw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=rsWthIt8; dkim=fail ("headers rsa verify failed") header.d=gnu.org header.s=fencepost-gnu-org header.b=BhWOGhdJ; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1732435943; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=/7669s/vPl4u/i/CZrXyROJfSDNJk9YoFJcrZnxakcY=; b=m8BUyXw7UdOrw6ZpjYs6StlXEkCIirirfoIGw4GUPxgzsGSN869yFAZubsFdJjDmcDSeZv QxeQZYg4lt1ISYhTEifDSRlZ0samj0F3Z1CD5IXwWRUHZii3/tJT2c5VnnqKW/CGLibjpe pCbJrdIpnuKy8OY9F8/sSmNmA9TCz8vmR82X2qGBinIIPXmJ7sAvi2cPCzlod4z6rlrWwK AgMQNK/1sfEC9tk3YLagZS/acqmY/B9g1DtKiiwRd+uW6hXKAgw3+cZiR/H5wApcy1CXub 2aOrr0p+G1nw5WRdGO5pYEbpbh6hx1VgbsrZlKUt/62X5kQ2UcEiPmPH0kGYdw== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 18EF078D25 for ; Sun, 24 Nov 2024 09:12:23 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tF7UW-0000Ew-Nl; Sun, 24 Nov 2024 02:57:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tF7US-0000Bu-0c for guix-patches@gnu.org; Sun, 24 Nov 2024 02:57:08 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tF7UR-0002Kn-OA; Sun, 24 Nov 2024 02:57:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:References:In-Reply-To:Date:From:To:Subject; bh=/7669s/vPl4u/i/CZrXyROJfSDNJk9YoFJcrZnxakcY=; b=rsWthIt8OifJO7zE3CTC1fN/l+8MlQvkg9nEQEBWEYVa6lEkXtlgkIXC99+3kuDyuahuXCCVrYxwHp+FbxreQBtUEclfY+cBjKV12lumkB1J6wNhctvmpk5JmC0uxbxy7Jok7hQ0mKkIXMUraWjrBwEONTIiPnO7ZM4dJcsbgj9dXQ1J+Zv3rS9Pp/M1MzILSjYvCsS0vzGLNQQdkwil2Q+H2INEkrjInsPIEJ5qSjp3G355hWpC1JcU+JM/OCWVGCb0++WKlMgTluBdpWuGggrqw8AmqzbRp0VlxbUJcZNJL8eNp8sigUdjEWpvpzAA6jHtMieKF3VleQ+LoE8ZLg==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tF7UR-0004gD-HI; Sun, 24 Nov 2024 02:57:07 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74290] [PATCH v4 12/58] gnu: glibc/hurd: Add patches for the 64bit Hurd. Resent-From: Janneke Nieuwenhuizen Original-Sender: "Debbugs-submit" Resent-CC: andreas@enge.fr, ludo@gnu.org, guix-patches@gnu.org Resent-Date: Sun, 24 Nov 2024 07:57:07 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74290 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74290@debbugs.gnu.org Cc: Andreas Enge , Ludovic =?UTF-8?Q?Court=C3=A8s?= X-Debbugs-Original-Xcc: Andreas Enge , Ludovic =?UTF-8?Q?Court=C3=A8s?= Received: via spool by 74290-submit@debbugs.gnu.org id=B74290.173243497717521 (code B ref 74290); Sun, 24 Nov 2024 07:57:07 +0000 Received: (at 74290) by debbugs.gnu.org; 24 Nov 2024 07:56:17 +0000 Received: from localhost ([127.0.0.1]:60687 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tF7Ta-0004Xx-Vf for submit@debbugs.gnu.org; Sun, 24 Nov 2024 02:56:17 -0500 Received: from eggs.gnu.org ([209.51.188.92]:39366) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tF7TT-0004V5-BI for 74290@debbugs.gnu.org; Sun, 24 Nov 2024 02:56:09 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tF7TO-0001vr-4X; Sun, 24 Nov 2024 02:56:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:References:In-Reply-To:Date:Subject:To: From; bh=/7669s/vPl4u/i/CZrXyROJfSDNJk9YoFJcrZnxakcY=; b=BhWOGhdJVzaOcoUgUqr3 B01ZgEqu6HbpZv6NaEEQYbXL7AiI7vvtbeBbspdNH7ZSbYkvZNgwXv4YS3PbxYAiLM8Tqws27iXqz nWabcLyOHy3yildVmVdjnO9GvmuMgEUJtdS8Y+9tj3ys39a9wY2urcKpwsnET8PgAWtwZ2a+NcboU YD5pnBe7r7V2JU6j9TAydXC5+RUBiLuuX4YsUhFLVls882IaWopQwRHuYCWCKTmaZM1vxlFV66HH8 VeFF7MRrOprhosG4do438nzUWXuROqkYhRbnfQUAIZHyS1MHj/70F+jbwl0Te1B70PQ7Qh1rhUx3c oIREuHA6SRWZ/g==; From: Janneke Nieuwenhuizen Date: Sun, 24 Nov 2024 08:54:35 +0100 Message-ID: <7c8d9bb229538bd21e91c0beb562d26bd4fabf98.1732434271.git.janneke@gnu.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Queue-Id: 18EF078D25 X-Migadu-Scanner: mx13.migadu.com X-Migadu-Spam-Score: -6.97 X-Spam-Score: -6.97 X-TUID: Y7vGfSWfg4AA These patches fix: * Statically linked tar to hang/segfault upon issuing the "--mtime=@1" warning; this is also applicable for the 32bit Hurd using glibc-2.39! See . * Shell replacement problems for the 64bit Hurd. See . * Findutil's gnulib-tests/test-sigaction failure. * gnu/packages/patches/glibc-hurd-pthread_setcancelstate.patch, gnu/packages/patches/glibc-hurd64-fault.patch, gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch, gnu/packages/patches/glibc-hurd64-sgms-context.patch: New file. * gnu/local.mk (dist_patch_DATA): Register them. * gnu/packages/base.scm (glibc/hurd): Use them. Change-Id: I9ee65983876cd22ad1dc01aabb41a34074631599 --- gnu/local.mk | 4 + gnu/packages/base.scm | 12 +- .../glibc-hurd-pthread_setcancelstate.patch | 92 ++++ gnu/packages/patches/glibc-hurd64-fault.patch | 32 ++ .../glibc-hurd64-intr-msg-clobber.patch | 62 +++ .../patches/glibc-hurd64-sgms-context.patch | 505 ++++++++++++++++++ 6 files changed, 706 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/glibc-hurd-pthread_setcancelstate.patch create mode 100644 gnu/packages/patches/glibc-hurd64-fault.patch create mode 100644 gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch create mode 100644 gnu/packages/patches/glibc-hurd64-sgms-context.patch diff --git a/gnu/local.mk b/gnu/local.mk index 0753002f75..f15272f25c 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1437,7 +1437,11 @@ dist_patch_DATA = \ %D%/packages/patches/glibc-hurd-getauxval.patch \ %D%/packages/patches/glibc-hurd-gettyent.patch \ %D%/packages/patches/glibc-hurd-mach-print.patch \ + %D%/packages/patches/glibc-hurd-pthread_setcancelstate.patch \ %D%/packages/patches/glibc-hurd-signal-sa-siginfo.patch \ + %D%/packages/patches/glibc-hurd64-fault.patch \ + %D%/packages/patches/glibc-hurd64-intr-msg-clobber.patch \ + %D%/packages/patches/glibc-hurd64-sgms-context.patch \ %D%/packages/patches/glibc-ldd-powerpc.patch \ %D%/packages/patches/glibc-ldd-x86_64.patch \ %D%/packages/patches/glibc-locales.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index 83f8c0d9e9..80e53c2e52 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -1588,7 +1588,17 @@ (define-public which command.") (license gpl3+))) ; some files are under GPLv2+ -(define-public glibc/hurd glibc) +(define-public glibc/hurd + (package/inherit glibc + (source + (origin + (inherit (package-source glibc)) + (patches + (append (origin-patches (package-source glibc)) + (search-patches "glibc-hurd-pthread_setcancelstate.patch" + "glibc-hurd64-fault.patch" + "glibc-hurd64-intr-msg-clobber.patch" + "glibc-hurd64-sgms-context.patch"))))))) (define-public glibc/hurd-headers (package/inherit glibc/hurd diff --git a/gnu/packages/patches/glibc-hurd-pthread_setcancelstate.patch b/gnu/packages/patches/glibc-hurd-pthread_setcancelstate.patch new file mode 100644 index 0000000000..1d7c81b98e --- /dev/null +++ b/gnu/packages/patches/glibc-hurd-pthread_setcancelstate.patch @@ -0,0 +1,92 @@ +Upstream-status: Taken from . + +This is needed for the 64bit Hurd statically linked tar non to hang when +issuing a warning. + +since the move of libpthread functions to libc, glibc dropped the use +of __libc_ptf_call. But htl hasn't made the move yet, so we have to use +__libc_ptf_call there for now. + +Index: glibc-2.36/misc/error.c +=================================================================== +--- glibc-2.36.orig/misc/error.c ++++ glibc-2.36/misc/error.c +@@ -240,7 +240,8 @@ __error_internal (int status, int errnum + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; +- __pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); ++ __libc_ptf_call (__pthread_setcancelstate, ++ (PTHREAD_CANCEL_DISABLE, &state), 0); + #endif + + flush_stdout (); +@@ -262,7 +263,7 @@ __error_internal (int status, int errnum + + #ifdef _LIBC + _IO_funlockfile (stderr); +- __pthread_setcancelstate (state, NULL); ++ __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); + #endif + } + +@@ -306,7 +307,9 @@ __error_at_line_internal (int status, in + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; +- __pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); ++ __libc_ptf_call (__pthread_setcancelstate, ++ (PTHREAD_CANCEL_DISABLE, &state), ++ 0); + #endif + + flush_stdout (); +@@ -336,7 +339,7 @@ __error_at_line_internal (int status, in + + #ifdef _LIBC + _IO_funlockfile (stderr); +- __pthread_setcancelstate (state, NULL); ++ __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); + #endif + } + +Index: glibc-2.36/libio/iopopen.c +=================================================================== +--- glibc-2.36.orig/libio/iopopen.c ++++ glibc-2.36/libio/iopopen.c +@@ -281,9 +281,10 @@ _IO_new_proc_close (FILE *fp) + do + { + int state; +- __pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); ++ __libc_ptf_call (__pthread_setcancelstate, ++ (PTHREAD_CANCEL_DISABLE, &state), 0); + wait_pid = __waitpid (((_IO_proc_file *) fp)->pid, &wstatus, 0); +- __pthread_setcancelstate (state, NULL); ++ __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); + } + while (wait_pid == -1 && errno == EINTR); + if (wait_pid == -1) +Index: glibc-2.36/stdlib/fmtmsg.c +=================================================================== +--- glibc-2.36.orig/stdlib/fmtmsg.c ++++ glibc-2.36/stdlib/fmtmsg.c +@@ -124,7 +124,8 @@ fmtmsg (long int classification, const c + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; +- __pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); ++ __libc_ptf_call (__pthread_setcancelstate, ++ (PTHREAD_CANCEL_DISABLE, &state), 0); + + __libc_lock_lock (lock); + +@@ -193,7 +194,7 @@ fmtmsg (long int classification, const c + + __libc_lock_unlock (lock); + +- __pthread_setcancelstate (state, NULL); ++ __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); + + return result; + } diff --git a/gnu/packages/patches/glibc-hurd64-fault.patch b/gnu/packages/patches/glibc-hurd64-fault.patch new file mode 100644 index 0000000000..24980e8c2a --- /dev/null +++ b/gnu/packages/patches/glibc-hurd64-fault.patch @@ -0,0 +1,32 @@ +Upstream-status: Taken from: . + +See . + +commit 11ad033e1c09c8b8e7bbaa72420f41ab8bcf0f63 +Author: Flavio Cruz +Date: Tue Jul 30 00:51:20 2024 -0400 + + x86_64 hurd: ensure we have a large enough buffer to receive exception_raise requests. + + Message-ID: + +diff --git a/hurd/hurdfault.c b/hurd/hurdfault.c +index 5110c6030f..1fe973f54d 100644 +--- a/hurd/hurdfault.c ++++ b/hurd/hurdfault.c +@@ -121,7 +121,14 @@ faulted (void) + struct + { + mach_msg_header_t head; +- char buf[64]; ++ /* This is the size of the exception_raise request ++ * including mach_msg_header_t. ++ * See generated code in faultexc_server.c. */ ++#ifdef __LP64__ ++ char buf[112]; ++#else ++ char buf[64]; ++#endif + } request; + mig_reply_header_t reply; + extern int _hurdsig_fault_exc_server (mach_msg_header_t *, diff --git a/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch b/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch new file mode 100644 index 0000000000..600f89a711 --- /dev/null +++ b/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch @@ -0,0 +1,62 @@ +Upstream-status: Taken from . + +See , +and . + +Commited for 2.40 + +commit c8b4ce0b368115714bd4cce131e1683759471099 +Author: Samuel Thibault +Date: Sat Jul 13 17:00:55 2024 +0200 + + hurd: Fix restoring message to be retried + + save_data stores the start of the original message to be retried, + overwritten by the EINTR reply. In 64b builds the overwrite is however + rounded up to the 64b pointer size, so we have to save more than just + the 32b err. + + Thanks a lot to Luca Dariz for the investigation! + +diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c +index 2c2e7dc463..424c1fc700 100644 +--- a/hurd/intr-msg.c ++++ b/hurd/intr-msg.c +@@ -42,7 +42,10 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, + struct clobber + { + mach_msg_type_t type; +- error_t err; ++ union { ++ error_t err; ++ uintptr_t align; ++ }; + }; + union msg + { + +Taken from: + +Force putting save_data on the stack rather than in SSE register + +The signal management does not yet properly save SSE state, so that save_data +would get overwritten by signal handlers, notably leading to `` shell +replacement getting empty content because then the io_read RPC retry gets an +MIG_BAD_ARGUMENTS error. + +XXX: This is only temporary to fix the common shll replacement issue, and is +waiting for proper SSE state restoration. + +Index: glibc-2.38/hurd/intr-msg.c +=================================================================== +--- glibc-2.38.orig/hurd/intr-msg.c ++++ glibc-2.38/hurd/intr-msg.c +@@ -79,7 +79,7 @@ _hurd_intr_rpc_mach_msg (mach_msg_header + mach_msg_bits_t msgh_bits; + mach_port_t remote_port; + mach_msg_id_t msgid; +- struct clobber save_data; ++ volatile struct clobber save_data; + + if ((option & (MACH_SEND_MSG|MACH_RCV_MSG)) != (MACH_SEND_MSG|MACH_RCV_MSG) + || _hurd_msgport_thread == MACH_PORT_NULL) diff --git a/gnu/packages/patches/glibc-hurd64-sgms-context.patch b/gnu/packages/patches/glibc-hurd64-sgms-context.patch new file mode 100644 index 0000000000..7ae45542c1 --- /dev/null +++ b/gnu/packages/patches/glibc-hurd64-sgms-context.patch @@ -0,0 +1,505 @@ +Upstream-status: Taken from . + +commit 88b771ab5e1169e746dbf4a990d90cffc5fa54ea +Author: Flavio Cruz +Date: Sat Feb 17 15:25:35 2024 -0500 + + Implement setcontext/getcontext/makecontext/swapcontext for Hurd x86_64 + + Tested with the tests provided by glibc plus some other toy examples. + Message-ID: <20240217202535.1860803-1-flaviocruz@gmail.com> + +diff --git a/sysdeps/mach/hurd/x86_64/Makefile b/sysdeps/mach/hurd/x86_64/Makefile +index 80cf2eb6dc..2b43f5d625 100644 +--- a/sysdeps/mach/hurd/x86_64/Makefile ++++ b/sysdeps/mach/hurd/x86_64/Makefile +@@ -3,3 +3,7 @@ ifeq ($(subdir),conform) + # (missing SA_NOCLDWAIT) + conformtest-xfail-conds += x86_64-gnu + endif ++ ++ifeq ($(subdir),stdlib) ++sysdep_routines += __start_context ++endif +diff --git a/sysdeps/mach/hurd/x86_64/__start_context.S b/sysdeps/mach/hurd/x86_64/__start_context.S +new file mode 100644 +index 0000000000..3cb4c6b5a9 +--- /dev/null ++++ b/sysdeps/mach/hurd/x86_64/__start_context.S +@@ -0,0 +1,49 @@ ++/* Copyright (C) 2024 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 ++ . */ ++ ++#include ++ ++/* This is the helper code which gets called if a function which is ++ registered with 'makecontext' returns. In this case we have to ++ install the context listed in the uc_link element of the context ++ 'makecontext' manipulated at the time of the 'makecontext' call. ++ If the pointer is NULL the process must terminate. */ ++ ++ ++ENTRY(__start_context) ++ /* This removes the parameters passed to the function given to ++ 'makecontext' from the stack. RBX contains the address ++ on the stack pointer for the next context. */ ++ movq %rbx, %rsp ++ ++ /* Don't use pop here so that stack is aligned to 16 bytes. */ ++ movq (%rsp), %rdi /* This is the next context. */ ++ testq %rdi, %rdi ++ je 2f /* If it is zero exit. */ ++ ++ call __setcontext ++ /* If this returns (which can happen if __sigprocmask fails) we'll ++ exit the program with the return error value (-1). */ ++ movq %rax,%rdi ++ ++2: ++ call HIDDEN_JUMPTARGET(exit) ++ /* The 'exit' call should never return. In case it does cause ++ the process to terminate. */ ++L(hlt): ++ hlt ++END(__start_context) +diff --git a/sysdeps/mach/hurd/x86_64/getcontext.S b/sysdeps/mach/hurd/x86_64/getcontext.S +new file mode 100644 +index 0000000000..ef431be1a3 +--- /dev/null ++++ b/sysdeps/mach/hurd/x86_64/getcontext.S +@@ -0,0 +1,68 @@ ++/* Save current context. ++ Copyright (C) 2024 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 ++ . */ ++ ++#include ++ ++#include "ucontext_i.h" ++ ++ ++ENTRY(__getcontext) ++ /* Save the preserved registers, the registers used for passing ++ args, and the return address. */ ++ movq %rbx, oRBX(%rdi) ++ movq %rbp, oRBP(%rdi) ++ movq %r12, oR12(%rdi) ++ movq %r13, oR13(%rdi) ++ movq %r14, oR14(%rdi) ++ movq %r15, oR15(%rdi) ++ ++ movq %rdi, oRDI(%rdi) ++ movq %rsi, oRSI(%rdi) ++ movq %rdx, oRDX(%rdi) ++ movq %rcx, oRCX(%rdi) ++ movq %r8, oR8(%rdi) ++ movq %r9, oR9(%rdi) ++ ++ movq (%rsp), %rcx ++ movq %rcx, oRIP(%rdi) ++ leaq 8(%rsp), %rcx /* Exclude the return address. */ ++ movq %rcx, oRSP(%rdi) ++ ++ /* We have separate floating-point register content memory on the ++ stack. We use the __fpregs_mem block in the context. Set the ++ links up correctly. */ ++ ++ leaq oFPREGSMEM(%rdi), %rcx ++ movq %rcx, oFPREGS(%rdi) ++ /* Save the floating-point environment. */ ++ fnstenv (%rcx) ++ fldenv (%rcx) ++ stmxcsr oMXCSR(%rdi) ++ ++ /* Save the current signal mask with ++ * __sigprocmask(SIG_BLOCK, NULL, oSIGMASK(%rdi)); */ ++ leaq oSIGMASK(%rdi), %rdx ++ movq $0, %rsi ++ movl $SIG_BLOCK, %edi ++ call HIDDEN_JUMPTARGET (__sigprocmask) ++ ++ /* Propagate %rax (and errno, in case). */ ++ ret ++PSEUDO_END(__getcontext) ++ ++weak_alias (__getcontext, getcontext) +diff --git a/sysdeps/mach/hurd/x86_64/makecontext.c b/sysdeps/mach/hurd/x86_64/makecontext.c +new file mode 100644 +index 0000000000..6990a7775c +--- /dev/null ++++ b/sysdeps/mach/hurd/x86_64/makecontext.c +@@ -0,0 +1,119 @@ ++/* Create new context. ++ Copyright (C) 2024 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 ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++#include "ucontext_i.h" ++ ++/* This implementation can handle any ARGC value but only ++ normal integer parameters. ++ makecontext sets up a stack and the registers for the ++ user context. The stack looks like this: ++ +-----------------------+ ++ | next context | ++ +-----------------------+ ++ | parameter 7-n | ++ +-----------------------+ ++ | trampoline address | ++ %rsp -> +-----------------------+ ++ ++ The registers are set up like this: ++ %rdi,%rsi,%rdx,%rcx,%r8,%r9: parameter 1 to 6 ++ %rbx : address of next context ++ %rsp : stack pointer. ++*/ ++ ++/* XXX: This implementation currently only handles integer arguments. ++ To handle long int and pointer arguments the va_arg arguments needs ++ to be changed to long and also the stdlib/tst-setcontext.c file needs ++ to be changed to pass long arguments to makecontext. */ ++ ++ ++void ++__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) ++{ ++ extern void __start_context (void) attribute_hidden; ++ greg_t *sp; ++ unsigned int idx_uc_link; ++ va_list ap; ++ int i; ++ ++ /* Generate room on stack for parameter if needed and uc_link. */ ++ sp = (greg_t *) ((uintptr_t) ucp->uc_stack.ss_sp ++ + ucp->uc_stack.ss_size); ++ sp -= (argc > 6 ? argc - 6 : 0) + 1; ++ /* Align stack and make space for trampoline address. */ ++ sp = (greg_t *) ((((uintptr_t) sp) & -16L) - 8); ++ ++ idx_uc_link = (argc > 6 ? argc - 6 : 0) + 1; ++ ++ /* Setup context ucp. */ ++ /* Address to jump to. */ ++ ucp->uc_mcontext.gregs[REG_RIP] = (uintptr_t) func; ++ /* Setup rbx.*/ ++ ucp->uc_mcontext.gregs[REG_RBX] = (uintptr_t) &sp[idx_uc_link]; ++ ucp->uc_mcontext.gregs[REG_RSP] = (uintptr_t) sp; ++ ++ /* Setup stack. */ ++ sp[0] = (uintptr_t) &__start_context; ++ sp[idx_uc_link] = (uintptr_t) ucp->uc_link; ++ ++ va_start (ap, argc); ++ /* Handle arguments. ++ ++ The standard says the parameters must all be int values. This is ++ an historic accident and would be done differently today. For ++ x86-64 all integer values are passed as 64-bit values and ++ therefore extending the API to copy 64-bit values instead of ++ 32-bit ints makes sense. It does not break existing ++ functionality and it does not violate the standard which says ++ that passing non-int values means undefined behavior. */ ++ for (i = 0; i < argc; ++i) ++ switch (i) ++ { ++ case 0: ++ ucp->uc_mcontext.gregs[REG_RDI] = va_arg (ap, greg_t); ++ break; ++ case 1: ++ ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, greg_t); ++ break; ++ case 2: ++ ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, greg_t); ++ break; ++ case 3: ++ ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, greg_t); ++ break; ++ case 4: ++ ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, greg_t); ++ break; ++ case 5: ++ ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, greg_t); ++ break; ++ default: ++ /* Put value on stack. */ ++ sp[i - 5] = va_arg (ap, greg_t); ++ break; ++ } ++ va_end (ap); ++} ++ ++ ++weak_alias (__makecontext, makecontext) +diff --git a/sysdeps/mach/hurd/x86_64/setcontext.S b/sysdeps/mach/hurd/x86_64/setcontext.S +new file mode 100644 +index 0000000000..99919ee2a8 +--- /dev/null ++++ b/sysdeps/mach/hurd/x86_64/setcontext.S +@@ -0,0 +1,96 @@ ++/* Install given context. ++ Copyright (C) 2024 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 ++ . */ ++ ++#include ++ ++#include "ucontext_i.h" ++ ++ ++ENTRY(__setcontext) ++ /* Save argument since call will destroy it. */ ++ pushq %rdi ++ cfi_adjust_cfa_offset(8) ++ ++ /* Set the signal mask with ++ __sigprocmask (SIG_SETMASK, mask, NULL). */ ++ xorl %edx, %edx ++ leaq oSIGMASK(%rdi), %rsi ++ movl $SIG_SETMASK, %edi ++ call HIDDEN_JUMPTARGET (__sigprocmask) ++ /* Pop the pointer into RDX. The choice is arbitrary, but ++ leaving RDI and RSI available for use later can avoid ++ shuffling values. */ ++ popq %rdx ++ ++ test %rax, %rax ++ jne L(pseudo_end) ++ ++ /* Restore the floating-point context. Not the registers, only the ++ rest. */ ++ movq oFPREGS(%rdx), %rcx ++ fldenv (%rcx) ++ ldmxcsr oMXCSR(%rdx) ++ ++ /* Load the new stack pointer, the preserved registers and ++ registers used for passing args. */ ++ cfi_def_cfa(%rdx, 0) ++ cfi_offset(%rbx,oRBX) ++ cfi_offset(%rbp,oRBP) ++ cfi_offset(%r12,oR12) ++ cfi_offset(%r13,oR13) ++ cfi_offset(%r14,oR14) ++ cfi_offset(%r15,oR15) ++ cfi_offset(%rsp,oRSP) ++ cfi_offset(%rip,oRIP) ++ ++ movq oRSP(%rdx), %rsp ++ movq oRBX(%rdx), %rbx ++ movq oRBP(%rdx), %rbp ++ movq oR12(%rdx), %r12 ++ movq oR13(%rdx), %r13 ++ movq oR14(%rdx), %r14 ++ movq oR15(%rdx), %r15 ++ ++ /* The following ret should return to the address set with ++ getcontext. Therefore push the address on the stack. */ ++ movq oRIP(%rdx), %rcx ++ pushq %rcx ++ ++ movq oRSI(%rdx), %rsi ++ movq oRDI(%rdx), %rdi ++ movq oRCX(%rdx), %rcx ++ movq oR8(%rdx), %r8 ++ movq oR9(%rdx), %r9 ++ ++ /* Setup finally %rdx. */ ++ movq oRDX(%rdx), %rdx ++ ++ /* End FDE here, we fall into another context. */ ++ cfi_endproc ++ cfi_startproc ++ ++ /* Clear rax to indicate success. */ ++ xorl %eax, %eax ++L(pseudo_end): ++ /* The following 'ret' will pop the address of the code and jump ++ to it. */ ++ ret ++PSEUDO_END(__setcontext) ++libc_hidden_def (__setcontext) ++ ++weak_alias (__setcontext, setcontext) +diff --git a/sysdeps/mach/hurd/x86_64/swapcontext.S b/sysdeps/mach/hurd/x86_64/swapcontext.S +new file mode 100644 +index 0000000000..79718a1fdd +--- /dev/null ++++ b/sysdeps/mach/hurd/x86_64/swapcontext.S +@@ -0,0 +1,120 @@ ++/* Save current context and install the given one. ++ Copyright (C) 2024 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 ++ . */ ++ ++#include ++ ++#include "ucontext_i.h" ++ ++ ++/* int __swapcontext (ucontext_t *oucp, const ucontext_t *ucp); ++ ++ Saves the machine context in oucp such that when it is activated, ++ it appears as if __swapcontextt() returned again, restores the ++ machine context in ucp and thereby resumes execution in that ++ context. ++ ++ This implementation is intended to be used for *synchronous* context ++ switches only. Therefore, it does not have to save anything ++ other than the PRESERVED state. */ ++ ++ENTRY(__swapcontext) ++ /* Save the preserved registers, the registers used for passing args, ++ and the return address. */ ++ movq %rbx, oRBX(%rdi) ++ movq %rbp, oRBP(%rdi) ++ movq %r12, oR12(%rdi) ++ movq %r13, oR13(%rdi) ++ movq %r14, oR14(%rdi) ++ movq %r15, oR15(%rdi) ++ ++ movq %rdi, oRDI(%rdi) ++ movq %rsi, oRSI(%rdi) ++ movq %rdx, oRDX(%rdi) ++ movq %rcx, oRCX(%rdi) ++ movq %r8, oR8(%rdi) ++ movq %r9, oR9(%rdi) ++ ++ movq (%rsp), %rcx ++ movq %rcx, oRIP(%rdi) ++ leaq 8(%rsp), %rcx /* Exclude the return address. */ ++ movq %rcx, oRSP(%rdi) ++ ++ /* We have separate floating-point register content memory on the ++ stack. We use the __fpregs_mem block in the context. Set the ++ links up correctly. */ ++ leaq oFPREGSMEM(%rdi), %rcx ++ movq %rcx, oFPREGS(%rdi) ++ /* Save the floating-point environment. */ ++ fnstenv (%rcx) ++ stmxcsr oMXCSR(%rdi) ++ ++ ++ /* The function call destroys some registers, save ucp. */ ++ movq %rsi, %r12 ++ ++ /* Save the current signal mask and install the new one with ++ __sigprocmask (SIG_BLOCK, newset, oldset). */ ++ leaq oSIGMASK(%rdi), %rdx ++ leaq oSIGMASK(%rsi), %rsi ++ movl $SIG_SETMASK, %edi ++ call HIDDEN_JUMPTARGET (__sigprocmask) ++ test %rax, %rax ++ jne L(pseudo_end) ++ ++ /* Restore destroyed register into RDX. The choice is arbitrary, ++ but leaving RDI and RSI available for use later can avoid ++ shuffling values. */ ++ movq %r12, %rdx ++ ++ /* Restore the floating-point context. Not the registers, only the ++ rest. */ ++ movq oFPREGS(%rdx), %rcx ++ fldenv (%rcx) ++ ldmxcsr oMXCSR(%rdx) ++ ++ /* Load the new stack pointer and the preserved registers. */ ++ movq oRSP(%rdx), %rsp ++ movq oRBX(%rdx), %rbx ++ movq oRBP(%rdx), %rbp ++ movq oR12(%rdx), %r12 ++ movq oR13(%rdx), %r13 ++ movq oR14(%rdx), %r14 ++ movq oR15(%rdx), %r15 ++ ++ /* The following ret should return to the address set with ++ getcontext. Therefore push the address on the stack. */ ++ movq oRIP(%rdx), %rcx ++ pushq %rcx ++ ++ /* Setup registers used for passing args. */ ++ movq oRDI(%rdx), %rdi ++ movq oRSI(%rdx), %rsi ++ movq oRCX(%rdx), %rcx ++ movq oR8(%rdx), %r8 ++ movq oR9(%rdx), %r9 ++ ++ /* Setup finally %rdx. */ ++ movq oRDX(%rdx), %rdx ++ ++ /* Clear rax to indicate success. */ ++ xorl %eax, %eax ++L(pseudo_end): ++ ret ++PSEUDO_END(__swapcontext) ++ ++weak_alias (__swapcontext, swapcontext) -- 2.46.0