Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp2929135ybx; Fri, 8 Nov 2019 11:24:07 -0800 (PST) X-Google-Smtp-Source: APXvYqxCgcInTaBJrVtpwCuZgclov6JTsSBJlOM/2Fhf84Mwrvazh4pgVsMMJIPpru+ZAZ6rnjAV X-Received: by 2002:a17:906:52c3:: with SMTP id w3mr10678683ejn.122.1573241047466; Fri, 08 Nov 2019 11:24:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573241047; cv=none; d=google.com; s=arc-20160816; b=SOTJbQcmd34ptXstUXaMlLKFIwc05cjeV82P6ljaZsDB33SSDmfy0FPs7qF+fGz1yv PLZ5Su0ZTJGm1vDb3pzPZcgUB72YNycMat0zTYjIaKIxUpWLUNWpYmCxrSraXrfHGBLN dW+zlOUWk2/5KT538KwODkCTJ3DgS+kCZbf+5RukU1qW7UoerLeg8Ul0iN2K/6OaVs0z WjuuvBYpbB65NaaEXiSf3QP0DeOzv1L5aQ5mM/CjNX6WpQj0f2CkVN8JfZCSfNfMbNTA CrAk9YsT3t7CFxdfausMzF4V3pEsVAdqhdTm8SJYpTpdPM5XFQL4FpapRElWhY5I7dpA 3Zsw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=8AMyc5XvL8Q2JSqjR7ZgsREk0ZUW2+/X44rxX2rqy4w=; b=z2iCkoSrXzkG6/b9Nw9m30zMZxtXxKYGs5Awv3pIgeE6VuSYnfVJ8vCkXdJIyMtHuU Q++AkfM0894QF+4RNhNJLyOmU9E95kNz875RR0gC8Eth3Vz7gPnMBaNITn6hJ5lVVjzI 1m7q8H/n1Dn28PxY2GUkbvRBCw/gq5R1M0Hq+9DJA/1e7GkxusqjFgy8gklrVK4ClF3R zAl5zlST8Yx+ERTJt5crPFiELoDBLYnfHCjYDvCYmmxQ/Mhq0rBPb3SmpDJuiw8f5b++ m/D2DcAdw17VuKpAK6955Y5t7l6qLa99KvXjmRX8OLVNP9+en6wT590Adpmm24YfygeY YRYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mMqlPIex; 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 g3si4401296ejf.345.2019.11.08.11.23.44; Fri, 08 Nov 2019 11:24:07 -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=@kernel.org header.s=default header.b=mMqlPIex; 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 S1731097AbfKHSyy (ORCPT + 99 others); Fri, 8 Nov 2019 13:54:54 -0500 Received: from mail.kernel.org ([198.145.29.99]:52030 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733145AbfKHSyx (ORCPT ); Fri, 8 Nov 2019 13:54:53 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 12CC5222D4; Fri, 8 Nov 2019 18:54:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1573239292; bh=XyDUF0kGkyKuyMkjd9zEvhyjfXTmEIEko1RtdM/HBec=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mMqlPIex7j95EDft48j6AkAPT5L4E7bLybGNruOzZtPM7I5ttfrmKjMk70BnbO7n3 715xMNtYYvlW5oSO29YKCS2fFxMaadLS0EDFDgGbJX13orLWe65/+fGn3j1oorvrxn Y2ZucAWohSFhiy7JzOQSgsTG3fEY7hWBLxypXYDw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Greg Kroah-Hartman , Julien Thierry , Russell King , "David A. Long" , Sasha Levin , Ard Biesheuvel Subject: [PATCH 4.4 65/75] ARM: 8796/1: spectre-v1,v1.1: provide helpers for address sanitization Date: Fri, 8 Nov 2019 19:50:22 +0100 Message-Id: <20191108174806.118003985@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191108174708.135680837@linuxfoundation.org> References: <20191108174708.135680837@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Julien Thierry Commit afaf6838f4bc896a711180b702b388b8cfa638fc upstream. Introduce C and asm helpers to sanitize user address, taking the address range they target into account. Use asm helper for existing sanitization in __copy_from_user(). Signed-off-by: Julien Thierry Signed-off-by: Russell King Signed-off-by: David A. Long Reviewed-by: Julien Thierry Signed-off-by: Sasha Levin Signed-off-by: Ard Biesheuvel Signed-off-by: Greg Kroah-Hartman --- arch/arm/include/asm/assembler.h | 11 +++++++++++ arch/arm/include/asm/uaccess.h | 26 ++++++++++++++++++++++++++ arch/arm/lib/copy_from_user.S | 6 +----- 3 files changed, 38 insertions(+), 5 deletions(-) --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -461,6 +461,17 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) #endif .endm + .macro uaccess_mask_range_ptr, addr:req, size:req, limit:req, tmp:req +#ifdef CONFIG_CPU_SPECTRE + sub \tmp, \limit, #1 + subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr + addhs \tmp, \tmp, #1 @ if (tmp >= 0) { + subhss \tmp, \tmp, \size @ tmp = limit - (addr + size) } + movlo \addr, #0 @ if (tmp < 0) addr = NULL + csdb +#endif + .endm + .macro uaccess_disable, tmp, isb=1 #ifdef CONFIG_CPU_SW_DOMAIN_PAN /* --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -138,6 +138,32 @@ static inline void set_fs(mm_segment_t f __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) /* + * Sanitise a uaccess pointer such that it becomes NULL if addr+size + * is above the current addr_limit. + */ +#define uaccess_mask_range_ptr(ptr, size) \ + ((__typeof__(ptr))__uaccess_mask_range_ptr(ptr, size)) +static inline void __user *__uaccess_mask_range_ptr(const void __user *ptr, + size_t size) +{ + void __user *safe_ptr = (void __user *)ptr; + unsigned long tmp; + + asm volatile( + " sub %1, %3, #1\n" + " subs %1, %1, %0\n" + " addhs %1, %1, #1\n" + " subhss %1, %1, %2\n" + " movlo %0, #0\n" + : "+r" (safe_ptr), "=&r" (tmp) + : "r" (size), "r" (current_thread_info()->addr_limit) + : "cc"); + + csdb(); + return safe_ptr; +} + +/* * Single-value transfer routines. They automatically use the right * size if we just have the right pointer type. Note that the functions * which read from user space (*get_*) need to take care not to leak --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S @@ -93,11 +93,7 @@ ENTRY(arm_copy_from_user) #ifdef CONFIG_CPU_SPECTRE get_thread_info r3 ldr r3, [r3, #TI_ADDR_LIMIT] - adds ip, r1, r2 @ ip=addr+size - sub r3, r3, #1 @ addr_limit - 1 - cmpcc ip, r3 @ if (addr+size > addr_limit - 1) - movcs r1, #0 @ addr = NULL - csdb + uaccess_mask_range_ptr r1, r2, r3, ip #endif #include "copy_template.S"