Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3547452pxj; Mon, 24 May 2021 09:06:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxF12gYAkbTvYJ7Tdx5/R0RrNeqSSshK+xHhBGBn6Dfm4WKurcwquyc83r0i552PejdOSIl X-Received: by 2002:a17:907:7747:: with SMTP id kx7mr24276495ejc.400.1621872416853; Mon, 24 May 2021 09:06:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621872416; cv=none; d=google.com; s=arc-20160816; b=hIuhRLur18dP0QIQEiN5Yqj8/otySmsdoSXBepYvkmcy1HvHCmhr9zDabaZ19cCetf Um6roBUdCZ2Eb/OFIZayRCTRxr3Y+hUuLJ+tPijo3uv5QtwiZIcCb4vYz+OSJaSNuWGT UubZIE622kkktbjsdwtxIctpVxEIsTEACC6H/4DuEe/esFpcIlwCr83EBI3QCyK9fM0b wwdcB5EJdJcTHfvtVPBT8jkqq5d4a0JYUsFW5nmdD9pM96ZiMXWWWPG8BhALV9UepY9z oiybqJgwoS3NwVnuSGS+wztF9FJYmhc/+QxVZ8XIFL9MuXN9zc54dn2tTn35mZp7cfqq ndog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=dvSQy7lbm9MHFTT0qm9mkTvi99oyd9+l/OZYEOZ2l6Q=; b=OIu5ai6tEsF9+WsGKUV1/mA/j5Tvskd3tCIU7nRArRhdBOm7BF75XPg01a6NLG7AIm WSUXyAAYSJjQRq6C1cA9DouXlu8WSqoDAqfMuDv0nxqn7N9MGE1ZdXdjcTR+THjUbmAR D8Uy8WZWv9J7ZsWvGqh/rbvL9ae2IYZlqFkrjAu532Tu5GFDraTO+MZEY5elW5Js39Il sCMJPqqYS4lYo20KYIbgYpqFUWY7OATJOwq16VxXd1sgeLDsI7Fyb2HhJCvvZ6MyO6Dq pgFJHOBsnyBUTTpr7iCl+hDHudVsjDw7J3LvZEGaBQm/RRkM5jsbhMo+l/ZNQJ4jGc0R Gtqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="zLd/D2p4"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 17si13311940edv.148.2021.05.24.09.06.17; Mon, 24 May 2021 09:06:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="zLd/D2p4"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235713AbhEXQGI (ORCPT + 99 others); Mon, 24 May 2021 12:06:08 -0400 Received: from mail.kernel.org ([198.145.29.99]:40474 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234863AbhEXP71 (ORCPT ); Mon, 24 May 2021 11:59:27 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id E2E5261477; Mon, 24 May 2021 15:45:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621871120; bh=cNH/ocZTYnc7E4L3KwtJ0nosH89FB7NhLrNwG6ebksk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=zLd/D2p4TA4ViP8ZnTowsKI7U9ue1fmKmo3s7hHKrFxBn/hqQnwYLFX/DQGrbAME7 p0McWv+KLAJJtxU7dQjIBwk8Uyd4DGgtAriY7Ig1SiI5EkbyyDTtKDpfwzU12+apaM ZyUoMg0wup2Eu9l1TQ33D1bybIa3iUBP1Z13xnx0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Dmitry V. Levin" , Nicholas Piggin , Michael Ellerman Subject: [PATCH 5.12 082/127] powerpc/64s/syscall: Use pt_regs.trap to distinguish syscall ABI difference between sc and scv syscalls Date: Mon, 24 May 2021 17:26:39 +0200 Message-Id: <20210524152337.621853041@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210524152334.857620285@linuxfoundation.org> References: <20210524152334.857620285@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nicholas Piggin commit 5665bc35c1ed917ac8fd06cb651317bb47a65b10 upstream. The sc and scv 0 system calls have different ABI conventions, and ptracers need to know which system call type is being used if they want to look at the syscall registers. Document that pt_regs.trap can be used for this, and fix one in-tree user to work with scv 0 syscalls. Fixes: 7fa95f9adaee ("powerpc/64s: system call support for scv/rfscv instructions") Cc: stable@vger.kernel.org # v5.9+ Reported-by: "Dmitry V. Levin" Suggested-by: "Dmitry V. Levin" Signed-off-by: Nicholas Piggin Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20210520111931.2597127-1-npiggin@gmail.com Signed-off-by: Greg Kroah-Hartman --- Documentation/powerpc/syscall64-abi.rst | 10 +++++++++ tools/testing/selftests/seccomp/seccomp_bpf.c | 27 +++++++++++++++++--------- 2 files changed, 28 insertions(+), 9 deletions(-) --- a/Documentation/powerpc/syscall64-abi.rst +++ b/Documentation/powerpc/syscall64-abi.rst @@ -109,6 +109,16 @@ auxiliary vector. scv 0 syscalls will always behave as PPC_FEATURE2_HTM_NOSC. +ptrace +------ +When ptracing system calls (PTRACE_SYSCALL), the pt_regs.trap value contains +the system call type that can be used to distinguish between sc and scv 0 +system calls, and the different register conventions can be accounted for. + +If the value of (pt_regs.trap & 0xfff0) is 0xc00 then the system call was +performed with the sc instruction, if it is 0x3000 then the system call was +performed with the scv 0 instruction. + vsyscall ======== --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -1753,16 +1753,25 @@ TEST_F(TRACE_poke, getpid_runs_normally) # define SYSCALL_RET_SET(_regs, _val) \ do { \ typeof(_val) _result = (_val); \ - /* \ - * A syscall error is signaled by CR0 SO bit \ - * and the code is stored as a positive value. \ - */ \ - if (_result < 0) { \ - SYSCALL_RET(_regs) = -_result; \ - (_regs).ccr |= 0x10000000; \ - } else { \ + if ((_regs.trap & 0xfff0) == 0x3000) { \ + /* \ + * scv 0 system call uses -ve result \ + * for error, so no need to adjust. \ + */ \ SYSCALL_RET(_regs) = _result; \ - (_regs).ccr &= ~0x10000000; \ + } else { \ + /* \ + * A syscall error is signaled by the \ + * CR0 SO bit and the code is stored as \ + * a positive value. \ + */ \ + if (_result < 0) { \ + SYSCALL_RET(_regs) = -_result; \ + (_regs).ccr |= 0x10000000; \ + } else { \ + SYSCALL_RET(_regs) = _result; \ + (_regs).ccr &= ~0x10000000; \ + } \ } \ } while (0) # define SYSCALL_RET_SET_ON_PTRACE_EXIT