From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x131.google.com (mail-lf1-x131.google.com [IPv6:2a00:1450:4864:20::131]) by sourceware.org (Postfix) with ESMTPS id 981D33856DD0 for ; Wed, 17 May 2023 19:14:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 981D33856DD0 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lf1-x131.google.com with SMTP id 2adb3069b0e04-4f13d8f74abso1405412e87.0 for ; Wed, 17 May 2023 12:14:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684350884; x=1686942884; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=PQeF2UNB+92aUMXnsUUaGeRq0Or6LfsjJk2p7NQETCY=; b=MrK29ynh78wNatFFMMIjQ9kRJWqfqT1+Y6uIJf9ycMMEJazTFzHl8Cu8kWv4YH1Bi5 IOTQW0qacByc60q0LJ4UefTvmwa5EhmmfDh1eBVmPURYyZ42WpJ2AQxiKZ8qlIldDLhy 39sloPGIqhiv/t2fgGAiEAKAILZorXwBpNUx3GuedstjYwylVRNbj/JRhEaXYqg9koiV bc7wkn//gv2AZWtylGp6c/l1J/j3ZPdsmMv0aeWeEixcvbDjgQ/S5xP9xZ6eFk5m+3dk HiT6jSM21fe6dBFvzerQLm4l/VVsYz0XJr2aCNUBGJWUfmIADReP8o3U5zHfDHlrYwVh bB1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684350884; x=1686942884; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PQeF2UNB+92aUMXnsUUaGeRq0Or6LfsjJk2p7NQETCY=; b=kCUAgFybSgAUaIfSW4aY57aarVPqYGQGX1f8/0TO3vgSzVHlKCWN9AS5H+eY2akBAg GJd0mydrb0G6yb4c9/8udg32qWWtWAFU6zDu0RjvdhbSA/32OjguMYrkCc66GL99sU5h KvfbzuHC4D3+OMDvP3yBV9NZ4QPL7kvzS87TBSsvWLId9t31KZuLehQsscqxwY2ZZjc2 Nc0x2zhYTdCsaXlT7KTQpniXc82HxU2oqXVB/REHVlVPDhIelqCcJiY0CEvKAvWCG3YA UtAImNXz3rKeUPBbCSoaVix7QghMciUrGvB8eqtp6DkQjSKughLZ7r4wMnduoG05/zTQ k7Og== X-Gm-Message-State: AC+VfDw67af24SyYSrZchHcKz5qfPI6t/FchjSqELEOgHZw0Y8m5Vkzt jzYmgOyYwN2qteE+T2Xlr8Gm3aGpyr0= X-Google-Smtp-Source: ACHHUZ6NkHN67b9pMF1SQ4EVxocGSjwqLIcrBZoNFMMErEjF4Jcu+hrLN0etfPm9w3TRcNrqada57g== X-Received: by 2002:a19:f715:0:b0:4f1:5001:1d9c with SMTP id z21-20020a19f715000000b004f150011d9cmr453794lfe.55.1684350883681; Wed, 17 May 2023 12:14:43 -0700 (PDT) Received: from surface-pro-6.. ([194.190.106.50]) by smtp.gmail.com with ESMTPSA id o18-20020ac24352000000b004eed8de597csm3415744lfl.32.2023.05.17.12.14.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 May 2023 12:14:42 -0700 (PDT) From: Sergey Bugaev To: libc-alpha@sourceware.org, bug-hurd@gnu.org Subject: [PATCH 04/10] mach: Add __mach_setup_thread_call () Date: Wed, 17 May 2023 22:14:30 +0300 Message-Id: <20230517191436.73636-5-bugaevc@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230517191436.73636-1-bugaevc@gmail.com> References: <20230517191436.73636-1-bugaevc@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is just like mach_setup_thread (), but it's suitable for making the thread call a function correctly, as opposed to explicitly setting the thread's stack and instruction pointers to the given values. Internally, it uses MACHINE_THREAD_STATE_SETUP_CALL. Unlike mach_setup_thread (), which is exported via mach.h for the benefit of the Hurd exec server, __mach_setup_thread_call () is private to glibc for the time being. Signed-off-by: Sergey Bugaev --- mach/mach.h | 6 +++++- mach/setup-thread.c | 52 ++++++++++++++++++++++++++++++++------------- mach/setup-thread.h | 32 ++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 mach/setup-thread.h diff --git a/mach/mach.h b/mach/mach.h index d115f5a1..348f0196 100644 --- a/mach/mach.h +++ b/mach/mach.h @@ -88,7 +88,11 @@ extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode); If STACK_BASE is not null it is filled in with the chosen stack base. If STACK_SIZE is not null it is filled in with the chosen stack size. Regardless, an extra page of red zone is allocated off the end; this - is not included in *STACK_SIZE. */ + is not included in *STACK_SIZE. + + Mote: this function is unsuitable for setting up the thread to call a + function at PC, since the architecture ABI may impose additional + requirements beyond setting PC and stack. */ kern_return_t __mach_setup_thread (task_t task, thread_t thread, void *pc, vm_address_t *stack_base, vm_size_t *stack_size); diff --git a/mach/setup-thread.c b/mach/setup-thread.c index ae24a149..0e149787 100644 --- a/mach/setup-thread.c +++ b/mach/setup-thread.c @@ -16,6 +16,7 @@ . */ #include +#include #include #include #include @@ -24,17 +25,10 @@ #define STACK_SIZE (16 * 1024 * 1024) /* 16MB, arbitrary. */ -/* Give THREAD a stack and set it to run at PC when resumed. - If *STACK_SIZE is nonzero, that size of stack is allocated. - If *STACK_BASE is nonzero, that stack location is used. - If STACK_BASE is not null it is filled in with the chosen stack base. - If STACK_SIZE is not null it is filled in with the chosen stack size. - Regardless, an extra page of red zone is allocated off the end; this - is not included in *STACK_SIZE. */ - -kern_return_t -__mach_setup_thread (task_t task, thread_t thread, void *pc, - vm_address_t *stack_base, vm_size_t *stack_size) +static kern_return_t +mach_setup_thread_impl (task_t task, thread_t thread, int is_call, + void *pc, vm_address_t *stack_base, + vm_size_t *stack_size) { kern_return_t error; struct machine_thread_state ts; @@ -43,6 +37,8 @@ __mach_setup_thread (task_t task, thread_t thread, void *pc, vm_size_t size; int anywhere; + memset (&ts, 0, sizeof (ts)); + size = stack_size ? *stack_size ? : STACK_SIZE : STACK_SIZE; stack = stack_base ? *stack_base ? : 0 : 0; anywhere = !stack_base || !*stack_base; @@ -54,21 +50,25 @@ __mach_setup_thread (task_t task, thread_t thread, void *pc, if (stack_size) *stack_size = size; - memset (&ts, 0, sizeof (ts)); - MACHINE_THREAD_STATE_SET_PC (&ts, pc); #ifdef STACK_GROWTH_DOWN if (stack_base) *stack_base = stack + __vm_page_size; - ts.SP = stack + __vm_page_size + size; #elif defined (STACK_GROWTH_UP) if (stack_base) *stack_base = stack; - ts.SP = stack; stack += size; #else #error stack direction unknown #endif + if (is_call) + MACHINE_THREAD_STATE_SETUP_CALL (&ts, *stack_base, size, pc); + else + { + MACHINE_THREAD_STATE_SET_PC (&ts, pc); + MACHINE_THREAD_STATE_SET_SP (&ts, *stack_base, size); + } + /* Create the red zone. */ if (error = __vm_protect (task, stack, __vm_page_size, 0, VM_PROT_NONE)) return error; @@ -77,8 +77,30 @@ __mach_setup_thread (task_t task, thread_t thread, void *pc, (natural_t *) &ts, tssize); } +/* Give THREAD a stack and set it to run at PC when resumed. + If *STACK_SIZE is nonzero, that size of stack is allocated. + If *STACK_BASE is nonzero, that stack location is used. + If STACK_BASE is not null it is filled in with the chosen stack base. + If STACK_SIZE is not null it is filled in with the chosen stack size. + Regardless, an extra page of red zone is allocated off the end; this + is not included in *STACK_SIZE. */ + +kern_return_t +__mach_setup_thread (task_t task, thread_t thread, void *pc, + vm_address_t *stack_base, vm_size_t *stack_size) +{ + return mach_setup_thread_impl (task, thread, 0, pc, stack_base, stack_size); +} + weak_alias (__mach_setup_thread, mach_setup_thread) +kern_return_t +__mach_setup_thread_call (task_t task, thread_t thread, void *pc, + vm_address_t *stack_base, vm_size_t *stack_size) +{ + return mach_setup_thread_impl (task, thread, 1, pc, stack_base, stack_size); +} + /* Give THREAD a TLS area. */ kern_return_t __mach_setup_tls (thread_t thread) diff --git a/mach/setup-thread.h b/mach/setup-thread.h new file mode 100644 index 00000000..b4c94d1d --- /dev/null +++ b/mach/setup-thread.h @@ -0,0 +1,32 @@ +/* Setup a Mach thread. + Copyright (C) 1993-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 + . */ + +#ifndef _MACH_SETUP_THREAD_H + +#define _MACH_SETUP_THREAD_H 1 + +#include + +/* Like mach_setup_thread (), but suitable for setting up function + calls. */ +kern_return_t __mach_setup_thread_call (task_t task, thread_t thread, + void *function, + vm_address_t *stack_base, + vm_size_t *stack_size); + +#endif /* mach/setup-thread.h */ -- 2.40.1