From patchwork Thu Dec 28 15:38:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Wiklander X-Patchwork-Id: 122845 Delivered-To: patches@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3598731qgn; Thu, 28 Dec 2017 07:39:54 -0800 (PST) X-Received: by 10.25.233.25 with SMTP id g25mr17761450lfh.101.1514475594351; Thu, 28 Dec 2017 07:39:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514475594; cv=none; d=google.com; s=arc-20160816; b=x0E2jQBMd2EuOYDj2VeFwHKRBQRiAjk7ryxQpsPJBxDlhjr4PRu0wLZ31553zvXKb1 QLFBK6hJEwNmwBT/DjaU02Lev8cj46Lesb1cxBvwRH8Oz2z0+zTzfq4vpWkT6Zi6fHM9 Eh61FrfVuvjIbRABTgK52qJ/Vhys2tuE68u1wlqhpujkLEtVlLX1xNujVrxagab5xQX3 1XNzg/wk3xJdsDWJ84LGN9EPIx2O1CkRazgg+QwsRU1tWZ7CT9eDPGIf3RGC7hsb04uN n2w2IQxqgCVsNJ+LEcK2uG5TQU3j4WJCpIxwmV2OX24yMcDrURP0PcHCXGtieGS4U69/ 4peA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=oQ4bB2a+Tixxos37z0gF1LajxIFPFdyxqKWQvwtl0Z0=; b=0yaZugQam0RTpP19ixb/p7HiOSvnnXgGbCOXMPCBJ1ytmCfWCMbmYIIzwmfyS8NIqe lQWjaBeAevd0sq9iEhmyZeR0dWRtk5Oi0ND28tpdNfNfhTPplxcWLJEt6vyYW8kwzOlX hepr0o9xX7rGxUpFppwGEMeewvr9sw4rXjIWe9IArCcypPFz/O2XxT2lrnX/BQWQkJ9B TCmsvIHhjHpHqwugfc18n2Dj3oC+myBnzyDhCxRKP49XwmMBIrxfnkVosZvtUeL/Ej2E 7RcCm/K+1JjtAVFnl53hmy1/WF+Rxwe6Jsq4SZhmti3G7Jz+dg+dW56DO2i7aygDEwzl khZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F0IQ9gU9; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id i67sor1784996lfb.108.2017.12.28.07.39.54 for (Google Transport Security); Thu, 28 Dec 2017 07:39:54 -0800 (PST) Received-SPF: pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F0IQ9gU9; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=oQ4bB2a+Tixxos37z0gF1LajxIFPFdyxqKWQvwtl0Z0=; b=F0IQ9gU9+selxbRP7TT1fYrIpJ/pTlXE4sv+hnI7c3EPx2YJyeMCP7FXYznMZJ6rq4 i/3VCQzS3PYRVAaaThVSfwqZMYm0Pi4QImQKWZbXHP+iKgh2ZsTSQqEv+Ymbwd0yHIeF +QGsBgre3kVvZgsQaBFpAl2TYkd+cJP+mnnHo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=oQ4bB2a+Tixxos37z0gF1LajxIFPFdyxqKWQvwtl0Z0=; b=Fg1IqfiFayQB6HmIRebph5JXXVmBqTxRBtVZvsnJgSVgAxMkyr6ZojaolcuSy4wc+5 JWwJTP7dAwgjTRV9cykLpnayftYcRsGN0wmUbXXfr79EIQF9BDiietGR/pZ4Vp2J4zO0 1s/KZN6k9f9ZTRtV18hMZMuVbGoDKaG3Ed7uRfuVRlKcitp3L7qkimlqC72ush1cjqFl G94UwrX+BQ3dm9NAyM9m/QaTdRjbQ/DM32SGQlP5+2fvE1KRt56bqXSMAJDBAUt0hvrP MM5E+Ap2/fA5iPbbHefQif3IQAEdXt9rkxMTuZD+WUsj47if8CFqUXcF4OLdiEDMrHbC ydGQ== X-Gm-Message-State: AKGB3mI0i55QeVVT+kx68RHJkGzL4iOQ6RtTVqlDGo+z6LTX2qccqNLp 15khsRF/qYUd+T32t8/OodwkxInw X-Google-Smtp-Source: ACJfBosNHUBXz5SbMUtm7owRihP7Jj6yXalPpWTg9MgnmCsjmDfzMVFGoa7K4RiJsbaz5ucNVRvmsg== X-Received: by 10.25.152.77 with SMTP id a74mr19208715lfe.104.1514475594003; Thu, 28 Dec 2017 07:39:54 -0800 (PST) Return-Path: Received: from localhost.localdomain (31-211-242-190.customers.ownit.se. [31.211.242.190]) by smtp.gmail.com with ESMTPSA id y70sm3986429lfk.78.2017.12.28.07.39.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Dec 2017 07:39:53 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, tee-dev@lists.linaro.org Cc: Arnd Bergmann , zkong@codeaurora.org, bmanohar@qti.qualcomm.com, Volodymyr Babchuk , Volodymyr Babchuk , thomas zeng , Jens Wiklander Subject: [PATCH 2/2] tee: optee: check type of registered shared memory Date: Thu, 28 Dec 2017 16:38:57 +0100 Message-Id: <20171228153857.30086-3-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171228153857.30086-1-jens.wiklander@linaro.org> References: <20171228153857.30086-1-jens.wiklander@linaro.org> Checks the memory type of the pages to be registered as shared memory. Only normal cached memory is allowed. Signed-off-by: Jens Wiklander --- drivers/tee/optee/call.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) -- 2.14.1 diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index d61c14b788f2..47b12b7fd02d 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -535,6 +536,41 @@ void optee_free_pages_list(void *list, size_t num_entries) free_pages_exact(list, get_pages_list_size(num_entries)); } +static bool is_normal_memory(pgprot_t p) +{ +#if defined(CONFIG_ARM) + return (pgprot_val(p) & L_PTE_MT_MASK) == L_PTE_MT_WRITEALLOC; +#elif defined(CONFIG_ARM64) + return (pgprot_val(p) & PTE_ATTRINDX_MASK) == PTE_ATTRINDX(MT_NORMAL); +#else +#error "Unuspported architecture" +#endif +} + +static int __check_mem_type(struct vm_area_struct *vma, unsigned long end) +{ + while (vma && is_normal_memory(vma->vm_page_prot)) { + if (vma->vm_end >= end) + return 0; + vma = vma->vm_next; + } + + return -EINVAL; +} + +static int check_mem_type(unsigned long start, size_t num_pages) +{ + struct mm_struct *mm = current->mm; + int rc; + + down_read(&mm->mmap_sem); + rc = __check_mem_type(find_vma(mm, start), + start + num_pages * PAGE_SIZE); + up_read(&mm->mmap_sem); + + return rc; +} + int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, struct page **pages, size_t num_pages, unsigned long start) @@ -543,11 +579,15 @@ int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, struct optee_msg_arg *msg_arg; u64 *pages_list; phys_addr_t msg_parg; - int rc = 0; + int rc; if (!num_pages) return -EINVAL; + rc = check_mem_type(start, num_pages); + if (rc) + return rc; + pages_list = optee_allocate_pages_list(num_pages); if (!pages_list) return -ENOMEM; @@ -614,7 +654,7 @@ int optee_shm_register_supp(struct tee_context *ctx, struct tee_shm *shm, * We don't want to register supplicant memory in OP-TEE. * Instead information about it will be passed in RPC code. */ - return 0; + return check_mem_type(start, num_pages); } int optee_shm_unregister_supp(struct tee_context *ctx, struct tee_shm *shm)