Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp5291644yba; Wed, 8 May 2019 10:47:05 -0700 (PDT) X-Google-Smtp-Source: APXvYqzzUiKTNHLrwtw0fnMD/SYH8pAZtsyBXo7fwrN5w3Nv7f6F/tPYAMCZ5PpKAOucgaU4N16M X-Received: by 2002:aa7:8392:: with SMTP id u18mr52055286pfm.217.1557337625266; Wed, 08 May 2019 10:47:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557337625; cv=none; d=google.com; s=arc-20160816; b=0rH65EvgEYG3np1lFLGcs70lw+8Q5KDj+mLwQZBIxTqndYocgajEFIpsgPKFGOYN1p DNKsQlZrqT9OYYtR6wNb7IkRtI+WdWUXNW2ytx6gAsS4zPj+Vd7evSXSzAHlr7r11JC4 HXYNtwCV/GnIhaDmA0X2qT1LL2uROXOWSFH+qL7aQgNQTrD+GkmWe+vyHFqQ500tadMK hggYvVNaefv0lfkiUpNG9OXh/fwmZxmjwPVcq1MrPiqBVv2F7wew9FZms9OA9WanL/mn wSe+j+GPqTnHSDAkzftPf3oaCyte3bh0dLr+mNl/hu92xJ7L6CILtYmjCBGqHZzz28H+ I6gg== 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 :dkim-signature; bh=20I5PYxwGLsYlJSdyFGi1cZfbWK6zgDlYzj35GGoIoM=; b=hc4HKQnpVkBz9UL628hkuGGiM6fTbmigFonai0ro8mrMfOTIaSnJdSiwWXm75XqnLf aTIHeMGanOOIp3v6YlZ231EqxdnoElwNIvrflg694ji/8FZXUG+bKHXJwQAmr5S/Y8kA 3q/OdTJuM4zRpeWQ1Q9C2c6Qk6ONTootoWm39q435MllIoPtQ2FJrk6rLJdxUB3Atl4H EIqQuzopCHvlLFmn1jaYmLx4472vYvLyN13kr8jpuyZQRlCTjUit/fAfQ4b5dRuaTqMO kBwIqipG46huL8Zwknv/Jci+na2f5AlZ88mn+qaYHOWFG9YSNJ5N6P1B2BEZG8607j/W Ar+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=HSW3A3DS; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j9si24369798pgh.206.2019.05.08.10.46.49; Wed, 08 May 2019 10:47:05 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=HSW3A3DS; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728170AbfEHPX0 (ORCPT + 99 others); Wed, 8 May 2019 11:23:26 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:33361 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726860AbfEHPXX (ORCPT ); Wed, 8 May 2019 11:23:23 -0400 Received: by mail-pf1-f193.google.com with SMTP id z28so10681625pfk.0; Wed, 08 May 2019 08:23:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=20I5PYxwGLsYlJSdyFGi1cZfbWK6zgDlYzj35GGoIoM=; b=HSW3A3DSIoJGybAaCOZZYW6VXuD2MlUDElepcsSSqKhYUp1TwFc2D8kPlr3nIscqu1 OA0pyzgzVGwBDGeyIK3llGU7ajiZziLNJkTB/KL6anJBkxJWkgDE4JX9bfnWycWwBq7t LxHVMdzYfeuMaA7lVyGhwwp4+0Pp03BWlae+f6HQoo5d9AHoNz1C8dZ96EHHLoqZDzJK 4laChkBpGUCD+gUyr7Gp5UMWCE0niNgw+qSbypW7R9ekhkxdjNj4F9DLGa4BxQuRf98R HO7x9CSJZE9zvRfHniEcCaFurGK8vdHU8h1NTkBEWeApaWa+ICDcTNewamtQFtO7GZz9 UvuQ== 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:mime-version:content-transfer-encoding; bh=20I5PYxwGLsYlJSdyFGi1cZfbWK6zgDlYzj35GGoIoM=; b=AHbsQdB8TkcWKvDcdABz4l1bPMgHYmqNrXh7xFoxDVmXUDJm9irKVigA2ZuM60Uhpg XDF8pwHxpg0d4K0QpAhV+N2KEkWsxeE38o5FPVkeBgWsB/qd+YY9Tu3FtMk+5Fa0Jswo itqcAHPaQBbgxyaSb+thNiXDyF4ZPzWME+Ot+p9+5djRnEvXA0QrsSiVCIAuHOUtCNv0 s6znLGoKc/SDsT8GjZJ/xTvSNnTnUXUTzwinOLhyOt+jenD3WYHgaM5SZOYbH4go1bEG xIOv4lOlrI51JhokD4hPLQfR90XOSdUcmcNgnqB9kwjQehTNZ2rmQ7WieDf8R+0QHSDP QK5w== X-Gm-Message-State: APjAAAVvYp52PdTSjAbk6kvt63vDw1CqQXyOnXh86OCDH2NlugS2PwRp tvIzwgwYGJzE9cTQA6WsXbY= X-Received: by 2002:a65:578b:: with SMTP id b11mr26005764pgr.446.1557329002951; Wed, 08 May 2019 08:23:22 -0700 (PDT) Received: from localhost.localdomain ([104.238.181.70]) by smtp.gmail.com with ESMTPSA id o73sm7459360pfi.137.2019.05.08.08.23.17 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 08 May 2019 08:23:22 -0700 (PDT) From: Changbin Du To: corbet@lwn.net, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de Cc: x86@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Changbin Du , Mauro Carvalho Chehab Subject: [PATCH v4 13/27] Documentation: x86: convert intel_mpx.txt to reST Date: Wed, 8 May 2019 23:21:27 +0800 Message-Id: <20190508152141.8740-14-changbin.du@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190508152141.8740-1-changbin.du@gmail.com> References: <20190508152141.8740-1-changbin.du@gmail.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 This converts the plain text documentation to reStructuredText format and add it to Sphinx TOC tree. No essential content change. Signed-off-by: Changbin Du Reviewed-by: Mauro Carvalho Chehab --- Documentation/x86/index.rst | 1 + .../x86/{intel_mpx.txt => intel_mpx.rst} | 120 ++++++++++-------- 2 files changed, 65 insertions(+), 56 deletions(-) rename Documentation/x86/{intel_mpx.txt => intel_mpx.rst} (75%) diff --git a/Documentation/x86/index.rst b/Documentation/x86/index.rst index e2c0db9fcd4e..b5cdc0d889b3 100644 --- a/Documentation/x86/index.rst +++ b/Documentation/x86/index.rst @@ -19,3 +19,4 @@ x86-specific Documentation mtrr pat protection-keys + intel_mpx diff --git a/Documentation/x86/intel_mpx.txt b/Documentation/x86/intel_mpx.rst similarity index 75% rename from Documentation/x86/intel_mpx.txt rename to Documentation/x86/intel_mpx.rst index 85d0549ad846..387a640941a6 100644 --- a/Documentation/x86/intel_mpx.txt +++ b/Documentation/x86/intel_mpx.rst @@ -1,5 +1,11 @@ -1. Intel(R) MPX Overview -======================== +.. SPDX-License-Identifier: GPL-2.0 + +=========================================== +Intel(R) Memory Protection Extensions (MPX) +=========================================== + +Intel(R) MPX Overview +===================== Intel(R) Memory Protection Extensions (Intel(R) MPX) is a new capability introduced into Intel Architecture. Intel MPX provides hardware features @@ -7,7 +13,7 @@ that can be used in conjunction with compiler changes to check memory references, for those references whose compile-time normal intentions are usurped at runtime due to buffer overflow or underflow. -You can tell if your CPU supports MPX by looking in /proc/cpuinfo: +You can tell if your CPU supports MPX by looking in /proc/cpuinfo:: cat /proc/cpuinfo | grep ' mpx ' @@ -21,8 +27,8 @@ can be downloaded from http://software.intel.com/en-us/articles/intel-software-development-emulator -2. How to get the advantage of MPX -================================== +How to get the advantage of MPX +=============================== For MPX to work, changes are required in the kernel, binutils and compiler. No source changes are required for applications, just a recompile. @@ -84,14 +90,15 @@ Kernel MPX Code: is unmapped. -3. How does MPX kernel code work -================================ +How does MPX kernel code work +============================= Handling #BR faults caused by MPX --------------------------------- When MPX is enabled, there are 2 new situations that can generate #BR faults. + * new bounds tables (BT) need to be allocated to save bounds. * bounds violation caused by MPX instructions. @@ -124,37 +131,37 @@ the kernel. It can theoretically be done completely from userspace. Here are a few ways this could be done. We don't think any of them are practical in the real-world, but here they are. -Q: Can virtual space simply be reserved for the bounds tables so that we - never have to allocate them? -A: MPX-enabled application will possibly create a lot of bounds tables in - process address space to save bounds information. These tables can take - up huge swaths of memory (as much as 80% of the memory on the system) - even if we clean them up aggressively. In the worst-case scenario, the - tables can be 4x the size of the data structure being tracked. IOW, a - 1-page structure can require 4 bounds-table pages. An X-GB virtual - area needs 4*X GB of virtual space, plus 2GB for the bounds directory. - If we were to preallocate them for the 128TB of user virtual address - space, we would need to reserve 512TB+2GB, which is larger than the - entire virtual address space today. This means they can not be reserved - ahead of time. Also, a single process's pre-populated bounds directory - consumes 2GB of virtual *AND* physical memory. IOW, it's completely - infeasible to prepopulate bounds directories. - -Q: Can we preallocate bounds table space at the same time memory is - allocated which might contain pointers that might eventually need - bounds tables? -A: This would work if we could hook the site of each and every memory - allocation syscall. This can be done for small, constrained applications. - But, it isn't practical at a larger scale since a given app has no - way of controlling how all the parts of the app might allocate memory - (think libraries). The kernel is really the only place to intercept - these calls. - -Q: Could a bounds fault be handed to userspace and the tables allocated - there in a signal handler instead of in the kernel? -A: mmap() is not on the list of safe async handler functions and even - if mmap() would work it still requires locking or nasty tricks to - keep track of the allocation state there. +:Q: Can virtual space simply be reserved for the bounds tables so that we + never have to allocate them? +:A: MPX-enabled application will possibly create a lot of bounds tables in + process address space to save bounds information. These tables can take + up huge swaths of memory (as much as 80% of the memory on the system) + even if we clean them up aggressively. In the worst-case scenario, the + tables can be 4x the size of the data structure being tracked. IOW, a + 1-page structure can require 4 bounds-table pages. An X-GB virtual + area needs 4*X GB of virtual space, plus 2GB for the bounds directory. + If we were to preallocate them for the 128TB of user virtual address + space, we would need to reserve 512TB+2GB, which is larger than the + entire virtual address space today. This means they can not be reserved + ahead of time. Also, a single process's pre-populated bounds directory + consumes 2GB of virtual *AND* physical memory. IOW, it's completely + infeasible to prepopulate bounds directories. + +:Q: Can we preallocate bounds table space at the same time memory is + allocated which might contain pointers that might eventually need + bounds tables? +:A: This would work if we could hook the site of each and every memory + allocation syscall. This can be done for small, constrained applications. + But, it isn't practical at a larger scale since a given app has no + way of controlling how all the parts of the app might allocate memory + (think libraries). The kernel is really the only place to intercept + these calls. + +:Q: Could a bounds fault be handed to userspace and the tables allocated + there in a signal handler instead of in the kernel? +:A: mmap() is not on the list of safe async handler functions and even + if mmap() would work it still requires locking or nasty tricks to + keep track of the allocation state there. Having ruled out all of the userspace-only approaches for managing bounds tables that we could think of, we create them on demand in @@ -167,20 +174,20 @@ If a #BR is generated due to a bounds violation caused by MPX. We need to decode MPX instructions to get violation address and set this address into extended struct siginfo. -The _sigfault field of struct siginfo is extended as follow: - -87 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ -88 struct { -89 void __user *_addr; /* faulting insn/memory ref. */ -90 #ifdef __ARCH_SI_TRAPNO -91 int _trapno; /* TRAP # which caused the signal */ -92 #endif -93 short _addr_lsb; /* LSB of the reported address */ -94 struct { -95 void __user *_lower; -96 void __user *_upper; -97 } _addr_bnd; -98 } _sigfault; +The _sigfault field of struct siginfo is extended as follow:: + + 87 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ + 88 struct { + 89 void __user *_addr; /* faulting insn/memory ref. */ + 90 #ifdef __ARCH_SI_TRAPNO + 91 int _trapno; /* TRAP # which caused the signal */ + 92 #endif + 93 short _addr_lsb; /* LSB of the reported address */ + 94 struct { + 95 void __user *_lower; + 96 void __user *_upper; + 97 } _addr_bnd; + 98 } _sigfault; The '_addr' field refers to violation address, and new '_addr_and' field refers to the upper/lower bounds when a #BR is caused. @@ -209,9 +216,10 @@ Adding new prctl commands Two new prctl commands are added to enable and disable MPX bounds tables management in kernel. +:: -155 #define PR_MPX_ENABLE_MANAGEMENT 43 -156 #define PR_MPX_DISABLE_MANAGEMENT 44 + 155 #define PR_MPX_ENABLE_MANAGEMENT 43 + 156 #define PR_MPX_DISABLE_MANAGEMENT 44 Runtime library in userspace is responsible for allocation of bounds directory. So kernel have to use XSAVE instruction to get the base @@ -223,8 +231,8 @@ into struct mm_struct to be used in future during PR_MPX_ENABLE_MANAGEMENT command execution. -4. Special rules -================ +Special rules +============= 1) If userspace is requesting help from the kernel to do the management of bounds tables, it may not create or modify entries in the bounds directory. -- 2.20.1