From nobody Fri Sep 16 20:25:45 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4MTlvF3KJJz4d6rv; Fri, 16 Sep 2022 20:25:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4MTlvF2R27z3N0R; Fri, 16 Sep 2022 20:25:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663359945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=t2737Q24/Ah+x7NUtR4q5UP6TBDSxA6ykMANUU0k6sA=; b=bWQjnWPwI3LhuzPrfjcc83EavH3/JYn9zOgVQEyVvOf8YUC5bezM/OmDm9TvW9xCoxmdS+ BKTYmYmt1dUoxKL2oClPYTb+Kg3AtCU/BH4sRdDRMBqdojOHsQqOyM+JbxtwtnI+tvdg4+ HJ1kq+S3SJVFXYZCgqBy8Y10Nakv+n8jxbWR7MfAC6c3Q+9rk3VuPWFKFAxsl1Sa8eTSca JNQWoWRf1jiy2oiPmSIgclClX1RVAiaan8XLYJ+TjQPbSvexBMdBRcIKI0sopMuZ3VznbY orCKdmgflwdiGd3RV0hjudANFs/qwa7nnvaR7HEGmX/tV8t4y22MDrN2Azqd1g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4MTlvF1VQqzT4G; Fri, 16 Sep 2022 20:25:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28GKPjAv026487; Fri, 16 Sep 2022 20:25:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28GKPj8s026486; Fri, 16 Sep 2022 20:25:45 GMT (envelope-from git) Date: Fri, 16 Sep 2022 20:25:45 GMT Message-Id: <202209162025.28GKPj8s026486@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: e03c7f500541 - main - libthr: extract code to get main stack base and size into helpers List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: e03c7f50054182549e097f9fbd9387d8c55ef521 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1663359945; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=t2737Q24/Ah+x7NUtR4q5UP6TBDSxA6ykMANUU0k6sA=; b=HOy9LeXMVI1VBVnDHdDnGCM4dwpuT59DqqJ3ui3IENtlKDFBaci2/eyU2/oeYVZs6djXuO s+R2jQ47rIRR6ZaRFn0QUfTC0rRnFSt7E7DWMqTXYD0Ujdr5Diobn5HjrxzaRE8uj9NHKx uYMELSCHbwb64qmyQbvBI+xoTRoFst1lKzlnimh8dMHG7fk4P/WfAc30lFVIIBND6whWyB JuF6wS2FwF7pws7+PsPsw1pBRXyFHLMp3o3651B+2Pe/QIRdLwAKxtIjYgGnPRgbch+cC7 hWdyoJY5clU3tnIRFSjrgVBIdohA+V3OLaFdSuIe9mdUkYoycg5Bog9ebKRumg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1663359945; a=rsa-sha256; cv=none; b=t+/wi9crmGl0tE17BDsuTez0QUXaNRmCBLFBGHj5MSWfUZGPqTtIJ6bUcHaLxQcrjk/bGs tD9EWW3pgcbAKYqB0sm8/yE3TdvQpQHEvgpOYpCWbyl4kwi1EuN06VXKD80vija8VAg5k+ NyFRt4PPA7auFpmYM2jaCe+WnF1piK5XqGEBAcI6CHPV2craFW1mMZjxDDeCPXE3YvanHY c7BD5Fj5TiH+Z9PnhtEJfxvItph1q/Hchlb1jW7wLlytyAl7G0EkrIZe21HqMOA9QPtHwd haAExKrYOj8PmpDoXwPbhlNL2ECHzLxoRcneF+OAW+7iEz8hHuKoNHkBoFUYOw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=e03c7f50054182549e097f9fbd9387d8c55ef521 commit e03c7f50054182549e097f9fbd9387d8c55ef521 Author: Konstantin Belousov AuthorDate: 2022-09-13 22:14:24 +0000 Commit: Konstantin Belousov CommitDate: 2022-09-16 20:24:12 +0000 libthr: extract code to get main stack base and size into helpers Reviewed by: brooks, imp (previous version) Discussed with: markj Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D36540 --- lib/libthr/thread/thr_init.c | 56 ++++++++++++++++++++++++++++------------- lib/libthr/thread/thr_private.h | 2 ++ lib/libthr/thread/thr_stack.c | 24 +++++------------- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index b9d3265a05dc..1c4867cb8185 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -434,12 +434,43 @@ init_main_thread(struct pthread *thread) /* Others cleared to zero by thr_alloc() */ } -static void -init_private(void) +bool +__thr_get_main_stack_base(char **base) { - struct rlimit rlim; size_t len; int mib[2]; + + if (elf_aux_info(AT_USRSTACKBASE, base, sizeof(*base)) == 0) + return (true); + + mib[0] = CTL_KERN; + mib[1] = KERN_USRSTACK; + len = sizeof(*base); + if (sysctl(mib, nitems(mib), base, &len, NULL, 0) == 0) + return (true); + + return (false); +} + +bool +__thr_get_main_stack_lim(size_t *lim) +{ + struct rlimit rlim; + + if (elf_aux_info(AT_USRSTACKLIM, lim, sizeof(*lim)) == 0) + return (true); + + if (getrlimit(RLIMIT_STACK, &rlim) == 0) { + *lim = rlim.rlim_cur; + return (true); + } + + return (false); +} + +static void +init_private(void) +{ char *env, *env_bigstack, *env_splitstack; _thr_umutex_init(&_mutex_static_lock); @@ -465,24 +496,13 @@ init_private(void) __thr_malloc_init(); /* Find the stack top */ - if (elf_aux_info(AT_USRSTACKBASE, &_usrstack, - sizeof(_usrstack)) != 0) { - mib[0] = CTL_KERN; - mib[1] = KERN_USRSTACK; - len = sizeof (_usrstack); - if (sysctl(mib, nitems(mib), &_usrstack, &len, - NULL, 0) == -1) - PANIC("Cannot get kern.usrstack from sysctl"); - } + if (!__thr_get_main_stack_base(&_usrstack)) + PANIC("Cannot get kern.usrstack"); env_bigstack = getenv("LIBPTHREAD_BIGSTACK_MAIN"); env_splitstack = getenv("LIBPTHREAD_SPLITSTACK_MAIN"); if (env_bigstack != NULL || env_splitstack == NULL) { - if (elf_aux_info(AT_USRSTACKLIM, &_thr_stack_initial, - sizeof(_thr_stack_initial)) != 0) { - if (getrlimit(RLIMIT_STACK, &rlim) == -1) - PANIC("Cannot get stack rlimit"); - _thr_stack_initial = rlim.rlim_cur; - } + if (!__thr_get_main_stack_lim(&_thr_stack_initial)) + PANIC("Cannot get stack rlimit"); } _thr_is_smp = sysconf(_SC_NPROCESSORS_CONF); if (_thr_is_smp == -1) diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index a5bbc5997d30..0e88c6711817 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -1102,6 +1102,8 @@ int _thr_mutex_destroy(pthread_mutex_t *); int _thr_mutex_unlock(pthread_mutex_t *); int __Tthr_mutex_lock(pthread_mutex_t *); int __Tthr_mutex_trylock(pthread_mutex_t *); +bool __thr_get_main_stack_base(char **base); +bool __thr_get_main_stack_lim(size_t *lim); __END_DECLS __NULLABILITY_PRAGMA_POP diff --git a/lib/libthr/thread/thr_stack.c b/lib/libthr/thread/thr_stack.c index 34536ecfad2e..3befb740639e 100644 --- a/lib/libthr/thread/thr_stack.c +++ b/lib/libthr/thread/thr_stack.c @@ -148,25 +148,13 @@ _thr_stack_fix_protection(struct pthread *thrd) static void singlethread_map_stacks_exec(void) { - int mib[2]; - struct rlimit rlim; - u_long usrstack, stacksz; - size_t len; + char *usrstack; + size_t stacksz; - if (elf_aux_info(AT_USRSTACKBASE, &usrstack, sizeof(usrstack)) != 0) { - mib[0] = CTL_KERN; - mib[1] = KERN_USRSTACK; - len = sizeof(usrstack); - if (sysctl(mib, nitems(mib), &usrstack, &len, NULL, 0) == -1) - return; - } - if (elf_aux_info(AT_USRSTACKLIM, &stacksz, sizeof(stacksz)) != 0) { - if (getrlimit(RLIMIT_STACK, &rlim) == -1) - return; - stacksz = rlim.rlim_cur; - } - mprotect((void *)(uintptr_t)(usrstack - stacksz), stacksz, - _rtld_get_stack_prot()); + if (!__thr_get_main_stack_base(&usrstack) || + !__thr_get_main_stack_lim(&stacksz)) + return; + mprotect(usrstack - stacksz, stacksz, _rtld_get_stack_prot()); } void