Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp4709982pxa; Mon, 10 Aug 2020 16:28:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwEDxjw+BMMtRICJJN7qpBkyZgCIJwHEJelOYUrECnKTaMQm/0um/+tysvZr7Yzu8p6/D/E X-Received: by 2002:aa7:c74f:: with SMTP id c15mr23765973eds.331.1597102090474; Mon, 10 Aug 2020 16:28:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597102090; cv=none; d=google.com; s=arc-20160816; b=vi2tcpRAcZy6vDXayWmIWOTc2laSh9Q1Jh74VYAT+TPK5f+psA7TqteoGqOKYN0vst 6euZUMSvnU7xq58bI9IHOWMu1VU5Nia6UhXv9juAX5Sq4Z4ViTjLSEcyRwka7BX32Y3j 2Z9GgEz7ePay2PFsDMssHKOicBM1JrcEoj9CbwDket3oF3qNEiwEeAC3WLt8UnUczpBr OJOcX4lmbUJ1Efwx5F00LBbQUJ4AH+kcQA85PhauywvKm45ga9MypSJSjs+efi8Y4vek 2XXIRTD+GIIYiRlRT5EwXU5YK7ecv1VvM7P1szSaNzE7AGUbdTD3SRiJyRs0EFwPlY9T 7q8g== 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=Id96EPpHOjR0/xRBwONNtWHQnU2lDPpChI/0sAN4JJA=; b=mdw+umXEOwpQpaeXTX0sBPsx+bDVm0V0DOA3xiNTB4Tg27ntqs9+pqWcs/e05yRi52 UJLZjxSGCilWSJ6C0ojlpF6FBqdLdd+YJ9Xno5gMV8hQuhycvYZmnptJyvLQ0dGUkDXo FbKhvdivbrjalB0df9tsAl6XhMNB0CAz2ob9EgSWGuBkRMzprYdzi/xzyQvCO+neECFk bd7NX84CfTk/qp5/K80e+q7AbZXk5tscurkHQ4c7Fl4C8R96CiSvZBlWJUPAcwc6ZKbO x/eE5IASTsZx0XNd2aw6F08VT/Pwt6pHSdI2xCTpVi5KNKpVgShlSui6xG9zdCgsqF+E X/oQ== 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 j9si11738032edv.57.2020.08.10.16.27.43; Mon, 10 Aug 2020 16:28:10 -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 S1727902AbgHJX07 (ORCPT + 99 others); Mon, 10 Aug 2020 19:26:59 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:51384 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726634AbgHJX05 (ORCPT ); Mon, 10 Aug 2020 19:26:57 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: krisman) with ESMTPSA id D80E128DB7F From: Gabriel Krisman Bertazi To: luto@kernel.org, tglx@linutronix.de Cc: keescook@chromium.org, 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, Andy Lutomirski Subject: [PATCH v5 3/9] x86: vdso: Expose sigreturn address on vdso to the kernel Date: Mon, 10 Aug 2020 19:26:30 -0400 Message-Id: <20200810232636.1415588-4-krisman@collabora.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200810232636.1415588-1-krisman@collabora.com> References: <20200810232636.1415588-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. Suggested-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..1828ed2f4a5f 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 +int 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 1; + } +#endif + return 0; +} + #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 452beed7892b..b8fd74f7207d 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -385,6 +385,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 int 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