Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp5870549ybc; Wed, 27 Nov 2019 10:46:44 -0800 (PST) X-Google-Smtp-Source: APXvYqxA3TwFd6ZukOZsuvhXf3yE3uO0OcmtGl3PkgICew9enO/FSEXA35Levq/4510L9zRuT4F9 X-Received: by 2002:a17:906:5c4d:: with SMTP id c13mr49891551ejr.80.1574880404773; Wed, 27 Nov 2019 10:46:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574880404; cv=none; d=google.com; s=arc-20160816; b=FW9Cve/C3P9DLGSvCKXNoECCaHMX7q8rT3V9GhxRERnA3v/ZBhR3vWMgBW/t/aQK2/ MhE11FZP9r6xvyN7cOH3a5ZF9chEs9s/SjVAM0Lg9iN/PJZ9Gv8pB8nMjkN9uPP/tblG X0H+shnS3kpZrHRrVbpwSYGJ4XSnXP7DDnt8m3otxF7pRjXLceffh6erPVFrYggmMkMD TIvZOVqZI0M70NbLiKWWvUVdYrkgCKlAhaJr63tEgcZHPin3rYRmPZFVUYsF/frKt6gL S0BP4jpcRu3PVJOsIwF6/mzsmXoTIJc/fJPqR7hLWC0DyJCdS5ufVFXdAveRCarzQmfj FnPw== 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:to:from :dkim-signature; bh=mmTY6jId1v+47cuDmza9RnIkjkXWdRY+vbpk8X/8frQ=; b=aIrAP06iCKAKJCIig0J+rEQmk7n79vLfIRp6NdGCO3n6ROJyF1LoCaPl49P6hmuYPy h+DTD7CITQLL2d+bU8yEH1HoI/71FegDNcCkoDXu+34wEktg1vKLmLPVeLQLRU0QcXfu pdgRWCbFTzGdDnybvsyrrcS/3tqvVL57o9L9a/qEAUyVQYzqUOudTIxf0ZGyU+h443ge iVTwUHAAbePadUVUQV+9kbIDGAzxsQoCKre5GnoBIY3BGdb0fMwh1BzWvv1VYZBq2A9F /LEJFVYsOrBlb9g53c2DsV/HEHFl4rWfMNw9luH2d8kysfHlh24sZPRjg1N13Yivr/E/ R2PQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=aqsQ5OAX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w10si10392975eja.116.2019.11.27.10.46.19; Wed, 27 Nov 2019 10:46:44 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=aqsQ5OAX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727186AbfK0SpA (ORCPT + 99 others); Wed, 27 Nov 2019 13:45:00 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:37358 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726729AbfK0So7 (ORCPT ); Wed, 27 Nov 2019 13:44:59 -0500 Received: by mail-qt1-f193.google.com with SMTP id w47so22271824qtk.4 for ; Wed, 27 Nov 2019 10:44:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=mmTY6jId1v+47cuDmza9RnIkjkXWdRY+vbpk8X/8frQ=; b=aqsQ5OAXHGXD5zjd0tkoV3bg//T0inyW1N4legOfHsJkyZLkH9CzwP4TcriC/5sAh2 VtWLHeF/r+TnuRNjuKx6BMozUDoxsRSBodMfjdmrZjPn5UbxNWdE/xKI0vwSFb946OAy E/fmMSLqpDVgF/f1rcDGG5IPNKKs8vuiqhIfHK2V2nq2Xy5pNg/qK0AWwgxy9vafVI6E jcXCRTS5FOA86OpGapQ9fabPjE/agXmP2hEz0lge7LMIPLOKPa2CSdl1fWVpMCP8m2wq VTHfoVnSmr9gZrHaEfkbXJcZXX7Ep6k0Mz4a86uHKXKPaXscOTWBi9thXBkdTHkk0PET 5hJw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=mmTY6jId1v+47cuDmza9RnIkjkXWdRY+vbpk8X/8frQ=; b=jh/evXqZmA8TVDXP0qEMV0N06G7KyG4wW60IOHZgridRqlTipkCGP1K4MQvhAkgvTT 27DBWwjEBg8525At7seL59sKWmudP/SACbKVKv7wVvVbTsWr0Rgd+toVD0oLwdYiw58H TqQZcBQz0yv0sZFGZFIOg+aKkPsNbs7Nx+a1/BjdAucozyr7LTMDYvFLu7FHr6JnFGs/ TcM/EYzGqTjB2zZrW8CFGYlNXV8AeTSL/HHQ237TFr8adQGa08ei4ru0Ax3rc5NgN46t WGFc5/bZmpy7cpVslf1odObCnOjzYSe0CFNezfaklLt3huRPnKYmZ2tAjdaRs1gHj7MM B1IQ== X-Gm-Message-State: APjAAAUfZQrcFoV5/PNdcRzAOB7JZkPCKUpHAUX/LC0C/1unYabG43i5 Z6ottr8oYqCEhhYlHuw6JlysCQ== X-Received: by 2002:aed:2f62:: with SMTP id l89mr33703579qtd.358.1574880297657; Wed, 27 Nov 2019 10:44:57 -0800 (PST) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id o62sm2748024qte.76.2019.11.27.10.44.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 10:44:57 -0800 (PST) From: Pavel Tatashin To: pasha.tatashin@soleen.com, jmorris@namei.org, sashal@kernel.org, linux-kernel@vger.kernel.org, catalin.marinas@arm.com, will@kernel.org, steve.capper@arm.com, linux-arm-kernel@lists.infradead.org, marc.zyngier@arm.com, james.morse@arm.com, vladimir.murzin@arm.com, mark.rutland@arm.com, tglx@linutronix.de, gregkh@linuxfoundation.org, allison@lohutok.net, info@metux.net, alexios.zavras@intel.com, sstabellini@kernel.org, boris.ostrovsky@oracle.com, jgross@suse.com, stefan@agner.ch, yamada.masahiro@socionext.com, xen-devel@lists.xenproject.org, linux@armlinux.org.uk Subject: [PATCH 1/3] arm/arm64/xen: use C inlines for privcmd_call Date: Wed, 27 Nov 2019 13:44:51 -0500 Message-Id: <20191127184453.229321-2-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191127184453.229321-1-pasha.tatashin@soleen.com> References: <20191127184453.229321-1-pasha.tatashin@soleen.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 privcmd_call requires to enable access to userspace for the duration of the hypercall. Currently, this is done via assembly macros. Change it to C inlines instead. Signed-off-by: Pavel Tatashin Acked-by: Stefano Stabellini --- arch/arm/include/asm/assembler.h | 2 +- arch/arm/include/asm/xen/hypercall.h | 10 +++++++++ arch/arm/xen/enlighten.c | 2 +- arch/arm/xen/hypercall.S | 4 ++-- arch/arm64/include/asm/xen/hypercall.h | 28 ++++++++++++++++++++++++++ arch/arm64/xen/hypercall.S | 19 ++--------------- include/xen/arm/hypercall.h | 12 +++++------ 7 files changed, 50 insertions(+), 27 deletions(-) diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 99929122dad7..8e9262a0f016 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -480,7 +480,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) .macro uaccess_disable, tmp, isb=1 #ifdef CONFIG_CPU_SW_DOMAIN_PAN /* - * Whenever we re-enter userspace, the domains should always be + * Whenever we re-enter kernel, the domains should always be * set appropriately. */ mov \tmp, #DACR_UACCESS_DISABLE diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h index 3522cbaed316..cac5bd9ef519 100644 --- a/arch/arm/include/asm/xen/hypercall.h +++ b/arch/arm/include/asm/xen/hypercall.h @@ -1 +1,11 @@ +#ifndef _ASM_ARM_XEN_HYPERCALL_H +#define _ASM_ARM_XEN_HYPERCALL_H #include + +static inline long privcmd_call(unsigned int call, unsigned long a1, + unsigned long a2, unsigned long a3, + unsigned long a4, unsigned long a5) +{ + return arch_privcmd_call(call, a1, a2, a3, a4, a5); +} +#endif /* _ASM_ARM_XEN_HYPERCALL_H */ diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index dd6804a64f1a..e87280c6d25d 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -440,4 +440,4 @@ EXPORT_SYMBOL_GPL(HYPERVISOR_platform_op_raw); EXPORT_SYMBOL_GPL(HYPERVISOR_multicall); EXPORT_SYMBOL_GPL(HYPERVISOR_vm_assist); EXPORT_SYMBOL_GPL(HYPERVISOR_dm_op); -EXPORT_SYMBOL_GPL(privcmd_call); +EXPORT_SYMBOL_GPL(arch_privcmd_call); diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S index b11bba542fac..277078c7da49 100644 --- a/arch/arm/xen/hypercall.S +++ b/arch/arm/xen/hypercall.S @@ -94,7 +94,7 @@ HYPERCALL2(multicall); HYPERCALL2(vm_assist); HYPERCALL3(dm_op); -ENTRY(privcmd_call) +ENTRY(arch_privcmd_call) stmdb sp!, {r4} mov r12, r0 mov r0, r1 @@ -119,4 +119,4 @@ ENTRY(privcmd_call) ldm sp!, {r4} ret lr -ENDPROC(privcmd_call); +ENDPROC(arch_privcmd_call); diff --git a/arch/arm64/include/asm/xen/hypercall.h b/arch/arm64/include/asm/xen/hypercall.h index 3522cbaed316..1a74fb28607f 100644 --- a/arch/arm64/include/asm/xen/hypercall.h +++ b/arch/arm64/include/asm/xen/hypercall.h @@ -1 +1,29 @@ +#ifndef _ASM_ARM64_XEN_HYPERCALL_H +#define _ASM_ARM64_XEN_HYPERCALL_H #include +#include + +static inline long privcmd_call(unsigned int call, unsigned long a1, + unsigned long a2, unsigned long a3, + unsigned long a4, unsigned long a5) +{ + long rv; + + /* + * Privcmd calls are issued by the userspace. The kernel needs to + * enable access to TTBR0_EL1 as the hypervisor would issue stage 1 + * translations to user memory via AT instructions. Since AT + * instructions are not affected by the PAN bit (ARMv8.1), we only + * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation + * is enabled (it implies that hardware UAO and PAN disabled). + */ + uaccess_ttbr0_enable(); + rv = arch_privcmd_call(call, a1, a2, a3, a4, a5); + /* + * Disable userspace access from kernel once the hyp call completed. + */ + uaccess_ttbr0_disable(); + + return rv; +} +#endif /* _ASM_ARM64_XEN_HYPERCALL_H */ diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S index c5f05c4a4d00..921611778d2a 100644 --- a/arch/arm64/xen/hypercall.S +++ b/arch/arm64/xen/hypercall.S @@ -49,7 +49,6 @@ #include #include -#include #include @@ -86,27 +85,13 @@ HYPERCALL2(multicall); HYPERCALL2(vm_assist); HYPERCALL3(dm_op); -ENTRY(privcmd_call) +ENTRY(arch_privcmd_call) mov x16, x0 mov x0, x1 mov x1, x2 mov x2, x3 mov x3, x4 mov x4, x5 - /* - * Privcmd calls are issued by the userspace. The kernel needs to - * enable access to TTBR0_EL1 as the hypervisor would issue stage 1 - * translations to user memory via AT instructions. Since AT - * instructions are not affected by the PAN bit (ARMv8.1), we only - * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation - * is enabled (it implies that hardware UAO and PAN disabled). - */ - uaccess_ttbr0_enable x6, x7, x8 hvc XEN_IMM - - /* - * Disable userspace access from kernel once the hyp call completed. - */ - uaccess_ttbr0_disable x6, x7 ret -ENDPROC(privcmd_call); +ENDPROC(arch_privcmd_call); diff --git a/include/xen/arm/hypercall.h b/include/xen/arm/hypercall.h index b40485e54d80..624c8ad7e42a 100644 --- a/include/xen/arm/hypercall.h +++ b/include/xen/arm/hypercall.h @@ -30,8 +30,8 @@ * IN THE SOFTWARE. */ -#ifndef _ASM_ARM_XEN_HYPERCALL_H -#define _ASM_ARM_XEN_HYPERCALL_H +#ifndef _ARM_XEN_HYPERCALL_H +#define _ARM_XEN_HYPERCALL_H #include @@ -41,9 +41,9 @@ struct xen_dm_op_buf; -long privcmd_call(unsigned call, unsigned long a1, - unsigned long a2, unsigned long a3, - unsigned long a4, unsigned long a5); +long arch_privcmd_call(unsigned int call, unsigned long a1, + unsigned long a2, unsigned long a3, + unsigned long a4, unsigned long a5); int HYPERVISOR_xen_version(int cmd, void *arg); int HYPERVISOR_console_io(int cmd, int count, char *str); int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); @@ -88,4 +88,4 @@ MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req, BUG(); } -#endif /* _ASM_ARM_XEN_HYPERCALL_H */ +#endif /* _ARM_XEN_HYPERCALL_H */ -- 2.24.0