Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1594202pxk; Fri, 4 Sep 2020 13:33:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzMpvuZgwr4/TbS8nS/2BKjqpOjkgqAY+wPwpX4bdycsIKiiNw86AwrCUpsawHYmtMQP9ie X-Received: by 2002:aa7:d785:: with SMTP id s5mr10323395edq.154.1599251597143; Fri, 04 Sep 2020 13:33:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599251597; cv=none; d=google.com; s=arc-20160816; b=POOWez1ulukGuFvx8cGLJkaCihcUqz7ngCF2bEijnOBZ9THShA6czHmvocXQP605rD 7dDzY2Qoj6lIps64xGCw6LwM1pv5Xhp99Yqz7dWwalSjm6bfnHwX3cHnAN+g08/z5Qaw C30B33+b3imU5ql55M9JfrJtMeLD5n3J9EBy3NnPaaQqM+UePV26EdoF/RK6M8EP3FKJ kcULchDejJsOITNwK/WxPcslN7y+Fh/DuGOVpRk7nybyzM62Pjt3sCTouG2NBWfzSGXr irOUC7OFNEJCSpUiKYTZuASUpwZ4jdIVtJGV16EmoVBvniR/67Z/s+PY50gybSz/sRVa fEfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=3F8xk0YagIoXcKlwGnVxdOsY5/vA4i90DM+6vJcVI64=; b=CTNvtttYinUy1pKb53H4uyoWy15fUmkn8YBwJQ4lwfr/LSmLtQgMApIHa2NtUY1QgU xZV09quLRNXsS0rod8u8O1UdKStwoxiJHretcYWFXkG2NfD8jzFofVdHGrSdlAnh/Vqp 5EZ+Plf54IGskoPhzNc5xLeahHfCjkoqSVPHBCXkDbb1R69p4z1lUEiheqvzmBc9LtdB JrD91ubBembjnmpBDRs90FqU6i/C1wYKi5fSvgQiXp6Dgjrz+Be62rbxtzIXSQXTgQmI Xr/OXhvWJiwoL90/oTyd7z1Va5oKDi3yhtSN9afY+o2rHB53l3f4I1Y4G3O9ceu8TkN+ VW8g== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u11si4776198edp.466.2020.09.04.13.32.54; Fri, 04 Sep 2020 13:33:17 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728140AbgIDUcK (ORCPT + 99 others); Fri, 4 Sep 2020 16:32:10 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:42074 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726621AbgIDUcH (ORCPT ); Fri, 4 Sep 2020 16:32:07 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: krisman) with ESMTPSA id 71E8029B031 From: Gabriel Krisman Bertazi To: luto@kernel.org, tglx@linutronix.de, keescook@chromium.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, willy@infradead.org, linux-kselftest@vger.kernel.org, shuah@kernel.org, Gabriel Krisman Bertazi , kernel@collabora.com Subject: [PATCH v6 3/9] x86: vdso: Expose sigreturn address on vdso to the kernel Date: Fri, 4 Sep 2020 16:31:41 -0400 Message-Id: <20200904203147.2908430-4-krisman@collabora.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200904203147.2908430-1-krisman@collabora.com> References: <20200904203147.2908430-1-krisman@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Syscall user redirection requires the signal trampoline code to not be captured, in order to support returning with a locked selector while avoiding recursion back into the signal handler. For ia-32, which has the trampoline in the vDSO, expose the entry points to the kernel, such that it can avoid dispatching syscalls from that region to userspace. Changes since V1 - Change return address to bool (Andy) Suggested-by: Andy Lutomirski Acked-by: Andy Lutomirski Signed-off-by: Gabriel Krisman Bertazi --- arch/x86/entry/vdso/vdso2c.c | 2 ++ arch/x86/entry/vdso/vdso32/sigreturn.S | 2 ++ arch/x86/entry/vdso/vma.c | 15 +++++++++++++++ arch/x86/include/asm/elf.h | 1 + arch/x86/include/asm/vdso.h | 2 ++ 5 files changed, 22 insertions(+) diff --git a/arch/x86/entry/vdso/vdso2c.c b/arch/x86/entry/vdso/vdso2c.c index 7380908045c7..2d0f3d8bcc25 100644 --- a/arch/x86/entry/vdso/vdso2c.c +++ b/arch/x86/entry/vdso/vdso2c.c @@ -101,6 +101,8 @@ struct vdso_sym required_syms[] = { {"__kernel_sigreturn", true}, {"__kernel_rt_sigreturn", true}, {"int80_landing_pad", true}, + {"vdso32_rt_sigreturn_landing_pad", true}, + {"vdso32_sigreturn_landing_pad", true}, }; __attribute__((format(printf, 1, 2))) __attribute__((noreturn)) diff --git a/arch/x86/entry/vdso/vdso32/sigreturn.S b/arch/x86/entry/vdso/vdso32/sigreturn.S index c3233ee98a6b..1bd068f72d4c 100644 --- a/arch/x86/entry/vdso/vdso32/sigreturn.S +++ b/arch/x86/entry/vdso/vdso32/sigreturn.S @@ -18,6 +18,7 @@ __kernel_sigreturn: movl $__NR_sigreturn, %eax SYSCALL_ENTER_KERNEL .LEND_sigreturn: +SYM_INNER_LABEL(vdso32_sigreturn_landing_pad, SYM_L_GLOBAL) nop .size __kernel_sigreturn,.-.LSTART_sigreturn @@ -29,6 +30,7 @@ __kernel_rt_sigreturn: movl $__NR_rt_sigreturn, %eax SYSCALL_ENTER_KERNEL .LEND_rt_sigreturn: +SYM_INNER_LABEL(vdso32_rt_sigreturn_landing_pad, SYM_L_GLOBAL) nop .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn .previous diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index 9185cb1d13b9..3fc323d24824 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -436,6 +436,21 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) } #endif +bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) +{ +#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) + const struct vdso_image *image = current->mm->context.vdso_image; + unsigned long vdso = (unsigned long) current->mm->context.vdso; + + if (in_ia32_syscall() && image == &vdso_image_32) { + if (regs->ip == vdso + image->sym_vdso32_sigreturn_landing_pad || + regs->ip == vdso + image->sym_vdso32_rt_sigreturn_landing_pad) + return true; + } +#endif + return false; +} + #ifdef CONFIG_X86_64 static __init int vdso_setup(char *s) { diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index b9a5d488f1a5..eb41db289fe6 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -383,6 +383,7 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); +extern bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs); #define compat_arch_setup_additional_pages compat_arch_setup_additional_pages /* Do not change the values. See get_align_mask() */ diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h index bbcdc7b8f963..589f489dd375 100644 --- a/arch/x86/include/asm/vdso.h +++ b/arch/x86/include/asm/vdso.h @@ -27,6 +27,8 @@ struct vdso_image { long sym___kernel_rt_sigreturn; long sym___kernel_vsyscall; long sym_int80_landing_pad; + long sym_vdso32_sigreturn_landing_pad; + long sym_vdso32_rt_sigreturn_landing_pad; }; #ifdef CONFIG_X86_64 -- 2.28.0