From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by sourceware.org (Postfix) with ESMTPS id E8ED23858017 for ; Thu, 10 Nov 2022 18:44:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E8ED23858017 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-ed1-x52c.google.com with SMTP id r14so4444968edc.7 for ; Thu, 10 Nov 2022 10:44:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ZVXlXnnfY8anSVLTgE7klRCJ3BhvM4XaOWvMQKFHe3E=; b=pC/nQ4J2Nda2rxy5NyjNmixeSnUKQzFv52VhSPM/Ib71ANtz1/ln9rzWjAaszv+TS/ fHu4JX6U2yT4c+8srZiqeX7P8MMI3aM4ZMm1FR/VBlrBiMP75kLmXywA8xt8ILC3TTWu FykTVB6qp30h/gwpmU3yDortjT5Q8Ihq495i+iwoEJ4EXhdP86kIp85a42+60nocWVL3 Jjq8BOoJHwokMz0sIpMri8oFo4u5HFhD9KVqDgKnOOmdu2T59z4F1ju+YHGSYkUVtITo muSshT2eFyzzZnysJTaB3B0u/BcLSFMKyibciDuBPoYhCeTKPd2rJxdePrCgK1VuwL8p ioMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZVXlXnnfY8anSVLTgE7klRCJ3BhvM4XaOWvMQKFHe3E=; b=iUnrxiKOghFXNnSThizhPUcYCzof6MX5CUkWai07B5KTAQyqoP39EGyp8AXGJ2O4t3 q3oUbyvMzfYIAUh/gxwTzheVr+f9rudJQb4TOoEc91pjTYr/g5kxxmmQjqOg+G8s1GX0 LsFm5Kd5tmdH1q/nNTvn2w7Qiel5nX+PfFDImhcIEGdwfPbxGyaAZk5bzh6vQfRzHYdL jkVivkqMdGI6DLrtubq5XUcNB1bPSNehfz5DgpQfTIXxJgrJ1m5w+knYvqWl7Qcmo+FK CRKVpZ6kuj5vpZWuJVXo/NhUuU4kwbrRnv173tIlgKBQJ2jscJUn/iMAExJ17/vZsJk4 LtBQ== X-Gm-Message-State: ACrzQf1Qw0XDAwbl4DQ3mIK7mS+6OUabx+F1wQKwscU9GT8zetzG9JzM H+lbsV1LQfFimSlF7YyCz8XlsgoMcr4fGKUWrEHTQ+ZY9n4= X-Google-Smtp-Source: AMsMyM4KETN8F3nAp4ntvo7XggkprOcQelXIuXGc/48PZOl5MAg6wZa/ntIJTaUUvAM4lEnZ+JdtItbHx/fUv73apqg= X-Received: by 2002:a05:6402:c07:b0:459:f897:7940 with SMTP id co7-20020a0564020c0700b00459f8977940mr2894890edb.168.1668105844553; Thu, 10 Nov 2022 10:44:04 -0800 (PST) MIME-Version: 1.0 References: <878rkiu72f.fsf@oldenburg.str.redhat.com> In-Reply-To: <878rkiu72f.fsf@oldenburg.str.redhat.com> From: "H.J. Lu" Date: Thu, 10 Nov 2022 10:43:26 -0800 Message-ID: Subject: Re: [PATCH] Linux: Support non-variadic calls to prctl (bug 29770) To: Florian Weimer Cc: libc-alpha@sourceware.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3023.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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: On Thu, Nov 10, 2022 at 8:07 AM Florian Weimer via Libc-alpha wrote: > > Commit ff026950e280bc3e9487b41b460fb31bc5b57721 ("Add a C wrapper for > prctl [BZ #25896]") replaced the assembler wrapper with a C function. > However, the C variadic function implementation has a different ABI > on powerpc64le-linux-gnu, and now requires calls with a variadic > prototype. Therefore, switch to a non-variadic implementation. > > The internal __prctl is now non-variadic as well. Switch uses in > __pthread_getname_np and __pthread_setname_np to direct system calls > to avoid casts and the extra arguments. Other callers already supply > the extra arguments. For the MIPS usage in elf_machine_reject_phdr_p, > supply the extra arguments to __prctl. > > Visual inspection confirms that the x86-64 x32 version still performs > zero extension on the arguments. > > Tested on aarch64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, > x86_64-linux-gnu. Built with build-many-glibcs.py. > > --- > include/sys/prctl.h | 3 ++- > nptl/pthread_getname.c | 2 +- > nptl/pthread_setname.c | 2 +- > sysdeps/mips/dl-machine-reject-phdr.h | 8 ++++---- > sysdeps/unix/sysv/linux/prctl.c | 18 ++++++++++-------- > 5 files changed, 18 insertions(+), 15 deletions(-) > > diff --git a/include/sys/prctl.h b/include/sys/prctl.h > index d33f3a290e..3b9a949a03 100644 > --- a/include/sys/prctl.h > +++ b/include/sys/prctl.h > @@ -3,7 +3,8 @@ > > # ifndef _ISOMAC > > -extern int __prctl (int __option, ...); > +extern int __prctl (int __option, unsigned long int, unsigned long int, > + unsigned long int, unsigned long int); > libc_hidden_proto (__prctl) > > # endif /* !_ISOMAC */ > diff --git a/nptl/pthread_getname.c b/nptl/pthread_getname.c > index ebec06e23f..8d485d874b 100644 > --- a/nptl/pthread_getname.c > +++ b/nptl/pthread_getname.c > @@ -38,7 +38,7 @@ __pthread_getname_np (pthread_t th, char *buf, size_t len) > return ERANGE; > > if (pd == THREAD_SELF) > - return __prctl (PR_GET_NAME, buf) ? errno : 0; > + return -INTERNAL_SYSCALL_CALL (prctl, PR_GET_NAME, buf); > > #define FMT "/proc/self/task/%u/comm" > char fname[sizeof (FMT) + 8]; > diff --git a/nptl/pthread_setname.c b/nptl/pthread_setname.c > index f24560db47..1da548dbbf 100644 > --- a/nptl/pthread_setname.c > +++ b/nptl/pthread_setname.c > @@ -40,7 +40,7 @@ __pthread_setname_np (pthread_t th, const char *name) > return ERANGE; > > if (pd == THREAD_SELF) > - return __prctl (PR_SET_NAME, name) ? errno : 0; > + return -INTERNAL_SYSCALL_CALL (prctl, PR_SET_NAME, name); > > #define FMT "/proc/self/task/%u/comm" > char fname[sizeof (FMT) + 8]; > diff --git a/sysdeps/mips/dl-machine-reject-phdr.h b/sysdeps/mips/dl-machine-reject-phdr.h > index 45b6bcaeac..7efd5fc92b 100644 > --- a/sysdeps/mips/dl-machine-reject-phdr.h > +++ b/sysdeps/mips/dl-machine-reject-phdr.h > @@ -169,7 +169,7 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, > bool cannot_mode_switch = false; > > /* Get the current hardware mode. */ > - cur_mode = __prctl (PR_GET_FP_MODE); > + cur_mode = __prctl (PR_GET_FP_MODE, 0, 0, 0, 0); > # endif > #endif > > @@ -305,15 +305,15 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, > /* Set the new mode. Use fr1_mode if the requirements cannot be met by > FR0. */ > if (!in_req.fr0) > - return __prctl (PR_SET_FP_MODE, fr1_mode) != 0; > - else if (__prctl (PR_SET_FP_MODE, /* fr0_mode */ 0) != 0) > + return __prctl (PR_SET_FP_MODE, fr1_mode, 0, 0, 0) != 0; > + else if (__prctl (PR_SET_FP_MODE, /* fr0_mode */ 0, 0, 0, 0) != 0) > { > /* Setting FR0 can validly fail on an R6 core so retry with the FR1 > mode as a fall back. */ > if (errno != ENOTSUP) > return true; > > - return __prctl (PR_SET_FP_MODE, fr1_mode) != 0; > + return __prctl (PR_SET_FP_MODE, fr1_mode, 0, 0, 0) != 0; > } > } > # endif /* HAVE_PRCTL_FP_MODE */ > diff --git a/sysdeps/unix/sysv/linux/prctl.c b/sysdeps/unix/sysv/linux/prctl.c > index 25fd968ae2..102d4b0a21 100644 > --- a/sysdeps/unix/sysv/linux/prctl.c > +++ b/sysdeps/unix/sysv/linux/prctl.c > @@ -18,7 +18,15 @@ > > #include > #include > + > +/* Hide the type information from GCC. The prototype in the installed > + header is a variadic function. The non-variadic implementation > + below is both more efficient and more compatible because some ABIs > + assume additional work performed by the caller for variadic > + functions (notably powerpc64le). */ > +#define prctl prctl_XXX > #include > +#undef prctl > > /* Unconditionally read all potential arguments. This may pass > garbage values to the kernel, but avoids the need for teaching > @@ -26,15 +34,9 @@ > that are added to the kernel in the future). */ > > int > -__prctl (int option, ...) > +__prctl (int option, unsigned long int arg2, unsigned long int arg3, > + unsigned long int arg4, unsigned long int arg5) > { > - va_list arg; > - va_start (arg, option); > - unsigned long int arg2 = va_arg (arg, unsigned long int); > - unsigned long int arg3 = va_arg (arg, unsigned long int); > - unsigned long int arg4 = va_arg (arg, unsigned long int); > - unsigned long int arg5 = va_arg (arg, unsigned long int); > - va_end (arg); > return INLINE_SYSCALL_CALL (prctl, option, arg2, arg3, arg4, arg5); > } > > > base-commit: 22a46dee24351fd5f4f188ad80554cad79c82524 > prctl is an exported variadic function. Do we need to keep it? -- H.J.