From patchwork Fri Mar 19 18:35:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 42705 X-Patchwork-Delegate: carlos@redhat.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 97D7C385041F; Fri, 19 Mar 2021 18:35:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 97D7C385041F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1616178944; bh=x7RqkQmrY+plBJSFBZmIePiHF9UqEBPHnWEZuOfT944=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=LLhyyCo/FG3sjmM4Zc8V61aWle5eXx+WITgLPqrMFE784WhOaFQdvuxVxuvXzcsw6 R00Xq6Z/yYqak6UDDu1saobCZ+dqurEDOFo3ft5SjLJogRYddf8j0ssMnVY3+Pf8x6 vIISee3u2CERX0Xrerbmn7Ivt4YLQ4MSzBs4DVrI= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 64CEB3857C7F for ; Fri, 19 Mar 2021 18:35:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 64CEB3857C7F Received: by mail-pj1-x1030.google.com with SMTP id k23-20020a17090a5917b02901043e35ad4aso7102653pji.3 for ; Fri, 19 Mar 2021 11:35:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=x7RqkQmrY+plBJSFBZmIePiHF9UqEBPHnWEZuOfT944=; b=mpPOx1qx7lwVmyDwsx5LpXKn/UoyGgJaTfZmh7D2SLFI64KjOJQPCi9x+BiohiQQTv b+MzfhJC7EVWcJ6sjIWmOh9p8oVfyWI9B7tcmVlcgykj/u6K/h1o330aEL2P9WIWFWHb Kr/J4cvVJ5seRpUQAcVHfiv2KJu7Uurf+1NNmrV5TuObO90wVo3Bf9+i8Ex2dzKGYFpr XcS3g7LurOE0u8iOWvQvaL0cDex3hf5o2Tsm59iIW0z8fJT86ALgzSAV4IjVa3PyRDYp //k2XYSTI8vLFJr2U8d0NvWerrPHUO9OCVAM2melNkJ9oHJwCyudUxpKQOSaLG5On5oU ySBg== X-Gm-Message-State: AOAM532YElDF4cMrvNcy3AyiT0XNBFIN6peZPobXPVknPKTtW7BHBA6t VNiO+HONJz/pAOjF0iZUnq9wdGebuxg= X-Google-Smtp-Source: ABdhPJwrQEwqlXuRCcht2LWxNM9RO3urAeKHDdm6A9ASW1gwfTFx9T4aOU3HBkXC1obqhawwwcko6Q== X-Received: by 2002:a17:90a:8b16:: with SMTP id y22mr10699279pjn.191.1616178939997; Fri, 19 Mar 2021 11:35:39 -0700 (PDT) Received: from gnu-cfl-2.localdomain ([172.56.38.37]) by smtp.gmail.com with ESMTPSA id c16sm5958508pfc.112.2021.03.19.11.35.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Mar 2021 11:35:39 -0700 (PDT) Received: from gnu-cfl-2.?040none?041 (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id F00641A0111 for ; Fri, 19 Mar 2021 11:35:36 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v6] x86_64: Correct THREAD_SETMEM/THREAD_SETMEM_NC for movq [BZ #27591] Date: Fri, 19 Mar 2021 11:35:36 -0700 Message-Id: <20210319183536.1663081-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Spam-Status: No, score=-3036.5 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 autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" config/i386/constraints.md in GCC has (define_constraint "e" "32-bit signed integer constant, or a symbolic reference known to fit that range (for immediate operands in sign-extending x86-64 instructions)." (match_operand 0 "x86_64_immediate_operand")) Since movq takes a signed 32-bit immediate or a register source operand, use "er", instead of "nr"/"ir", constraint for 32-bit signed integer constant or register on movq. Reviewed-by: Carlos O'Donell --- sysdeps/x86_64/Makefile | 2 + sysdeps/x86_64/nptl/tls.h | 10 ++++- sysdeps/x86_64/tst-x86-64-tls-1.c | 64 +++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 sysdeps/x86_64/tst-x86-64-tls-1.c diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index d1d7cb9d2e..06a444b6af 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -183,6 +183,8 @@ ifeq (no,$(build-hardcoded-path-in-tests)) tests-container += tst-glibc-hwcaps-cache endif +tests-internal += tst-x86-64-tls-1 + endif # $(subdir) == elf ifeq ($(subdir),csu) diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h index 20f0958780..a78c4f4d01 100644 --- a/sysdeps/x86_64/nptl/tls.h +++ b/sysdeps/x86_64/nptl/tls.h @@ -271,8 +271,11 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80, "i" (offsetof (struct pthread, member))); \ else /* 8 */ \ { \ + /* Since movq takes a signed 32-bit immediate or a register source \ + operand, use "er" constraint for 32-bit signed integer constant \ + or register. */ \ asm volatile ("movq %q0,%%fs:%P1" : \ - : IMM_MODE ((uint64_t) cast_to_integer (value)), \ + : "er" ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member))); \ }}) @@ -296,8 +299,11 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80, "r" (idx)); \ else /* 8 */ \ { \ + /* Since movq takes a signed 32-bit immediate or a register source \ + operand, use "er" constraint for 32-bit signed integer constant \ + or register. */ \ asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" : \ - : IMM_MODE ((uint64_t) cast_to_integer (value)), \ + : "er" ((uint64_t) cast_to_integer (value)), \ "i" (offsetof (struct pthread, member[0])), \ "r" (idx)); \ }}) diff --git a/sysdeps/x86_64/tst-x86-64-tls-1.c b/sysdeps/x86_64/tst-x86-64-tls-1.c new file mode 100644 index 0000000000..354635884e --- /dev/null +++ b/sysdeps/x86_64/tst-x86-64-tls-1.c @@ -0,0 +1,64 @@ +/* Test THREAD_SETMEM and THREAD_SETMEM_NC for IMM64. + Copyright (C) 2021 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 + +static int +do_test (void) +{ + unsigned long long int saved_ssp_base, ssp_base; + saved_ssp_base = THREAD_GETMEM (THREAD_SELF, header.ssp_base); + + THREAD_SETMEM (THREAD_SELF, header.ssp_base, (1ULL << 57) - 1); + ssp_base = THREAD_GETMEM (THREAD_SELF, header.ssp_base); + if (ssp_base != ((1ULL << 57) - 1)) + FAIL_EXIT1 ("THREAD_SETMEM: 0x%llx != 0x%llx", + ssp_base, (1ULL << 57) - 1); + + THREAD_SETMEM (THREAD_SELF, header.ssp_base, -1ULL); + ssp_base = THREAD_GETMEM (THREAD_SELF, header.ssp_base); + if (ssp_base != -1ULL) + FAIL_EXIT1 ("THREAD_SETMEM: 0x%llx != 0x%llx", ssp_base, -1ULL); + + THREAD_SETMEM (THREAD_SELF, header.ssp_base, saved_ssp_base); +#ifndef __ILP32__ + struct pthread_key_data *saved_specific, *specific; + saved_specific = THREAD_GETMEM_NC (THREAD_SELF, specific, 1); + + uintptr_t value = (1UL << 57) - 1; + THREAD_SETMEM_NC (THREAD_SELF, specific, 1, + (struct pthread_key_data *) value); + specific = THREAD_GETMEM_NC (THREAD_SELF, specific, 1); + if (specific != (struct pthread_key_data *) value) + FAIL_EXIT1 ("THREAD_GETMEM_NC: %p != %p", + specific, (struct pthread_key_data *) value); + + THREAD_SETMEM_NC (THREAD_SELF, specific, 1, + (struct pthread_key_data *) -1UL); + specific = THREAD_GETMEM_NC (THREAD_SELF, specific, 1); + if (specific != (struct pthread_key_data *) -1UL) + FAIL_EXIT1 ("THREAD_GETMEM_NC: %p != %p", + specific, (struct pthread_key_data *) -1UL); + + THREAD_SETMEM_NC (THREAD_SELF, specific, 1, saved_specific); +#endif + return 0; +} + +#include