From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753238AbdF0PCk (ORCPT ); Tue, 27 Jun 2017 11:02:40 -0400 Received: from mail-by2nam01on0079.outbound.protection.outlook.com ([104.47.34.79]:55968 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752108AbdF0O6j (ORCPT ); Tue, 27 Jun 2017 10:58:39 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com; From: Tom Lendacky Subject: [PATCH v8 12/38] x86/mm: Extend early_memremap() support with additional attrs To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , Radim =?utf-8?b?S3LEjW3DocWZ?= , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Larry Woodman , Jonathan Corbet , Joerg Roedel , "Michael S. Tsirkin" , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Boris Ostrovsky , Dmitry Vyukov , Juergen Gross , Thomas Gleixner , Paolo Bonzini Date: Tue, 27 Jun 2017 09:58:23 -0500 Message-ID: <20170627145823.15908.76242.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> References: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: MWHPR2201CA0057.namprd22.prod.outlook.com (10.172.59.31) To DM5PR12MB1146.namprd12.prod.outlook.com (10.168.236.141) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 18a206c7-e84c-46d1-d50c-08d4bd6cf8a9 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506067)(300135500095);SRVR:DM5PR12MB1146; X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;3:sPlVmvkmxiTdC1olxfSyeo1KgW1HbGKy7Kl9W1Ko161XzOVGzaqKT73nhh3hc4Q0zGO4rUyhZSUw9zVQ11hLzL7i30TzhtghFItXpKIYhilT+LKCzvx7sq9QyDlnE9o5q/BIrHgD6cfaJfh6d+FJlid6NfdYRCXkyqiU9wj/4N/z6eHfDZcABqFXRlT/WUCPFCa/4tYxtqOHgo9q0yTLmPD1C+iTAc5hDBClPOAOnXRIHcAlfI3Za+ic19aGgjwyb1SwosbLgoOyTPtW3NG0KqTymgKFc6Fwq1343thZYRsZEHFbhpVjTedy+D9uxJtcBOGMHBeALK/gO6YzUmtA9gZQIcz/94jjmt8pXdEgSCeQ/jUBhX8fOR2E2z6OnfndPOig+pwKlnAe9NwcIsfalOUc4Fn5jhElb4cXJ2TbeVruBzf7nh5lTh8Loll8K8EYjqakDbkWZmVPy9jrbFcriMV+XFtDcoOeChH2Db8Cpgzcqk1u/+ty0Ihd4SiznVmEsL5+3WZjg+jSqM05Cd/KzKeHCq0PyV0NrZ7VbMAcifX89O7GVHHcXQUhYviqPs905cahNmVspukMozkUgfk8LVP1azM0dOlcKT/2jvzVYMSbkU56mPLHHX+gOSPq+sWSaun9/3OnnBM/bRX1Y0gqr6nOKhVNNCY/mz1HC2jBvqkzbWxJAIfECIeTsW7GbLZlKDk917h6wGJR4hKMqdMB/CZHxZ8H1GpoL0thmztF7AqUUfoHN8KQDvRv4foWJvv07bLWyWilzyKBr/cnjAt4xg== X-MS-TrafficTypeDiagnostic: DM5PR12MB1146: X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;25:8jIy9wqsp46nTdFd4o0v5oIR2Y4U8Vz65Lx62wDMIASb6MGl/Uq0LdCqUz94rKl9htftStKtySUZPDAoHmPfxQng4B0+p9vZpS7C9lU6MdhULkw6ii/XrEKWP1Jz8b/Uy/A7LeiPtYh6G+lL4u6t2xi5ugpoxTv35rFjYoApsdm6vsAgEwyJpFadESRwNkeh+hPTpNHPVwtnSkE9grKMuxjPHEwfNhpJCSiJx1E/ex2ZwmvIbewZD/Qt0xlp1gL1lHXuqrP2TwJXWF3XI6apmhxyW7n1jwnS5bapHAEy9kDdqNHVp63LtYUgU+/PXlQRd44BCNTPwaKay0HwqB0y2fJMpHlT0u4elSe8ebMVh7m8V5WMYtzkwcjCS4kosu4JONEvdR2ikQLWYt1SKrOiFtMUa2hV6YxtN4bfxZqiJQdriGvSr13FAUl2DPKfa5zamkodVfrzXwLlC9RZODd/GfARGeu4QDKDPJOmSI5IZRxNhiZ0+PE2a3A6JP3Fqp8EITMW6oW6AoK8Dd4yaQE0FoIZpYA0Pf8h+FgC5g0D/B/3IX17zZQil+JOJCoF0YYPkC+TFTb/txo15320IhS68/oDDcG/OvLdsIjQztIZ5k2oFsC4EXTWXacBtxwpKNla3NXcYta0ZIhJD3oxuTcto5f10u+ScW01nEAb+YKCR1xaMPgwoQo9JfOWMBiflDjU14VPdzLHq6TaqpWgG5PIh9Sk+4jvjC0popHTewy9vI8dhUIJngvrUACF2AWGk6Ck1uS9znvjDh47z6Bm+/nll7N/e8PXuJwGE6thOjhGkYqZVRCa1KXaPu7nQB0BX35GQEmMHAsCrxZ0FZxybb4OaspiAmR95IgPrI7HkobSUb7zkIpA58dQ1aQIYh9M7q5SpX0BV/QzZIB3hqXtwpNrvEab8b+siPlJKsgzZqm4iVU= X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;31:u76aU07pBZjupfEEmW5J5nhIhtvarcGc4zYcNVjQmNWzASPZ/5r6fxMWzUkC4qRDS/SSCH/3O4k1V5mUjlHJnkDWf7usLvgO94FXEYHkatQ/yjQl0PsV5g8idCYPFzuclHNun4SCIw+8MVLstsmQ/IWlp/Py36b6MbfcyHwpUKhr2y0z+LZ7UuFdGY0NBYbUOWzmCjluwE89uz4L1x8W5zj0pbY5du8lbiAvGtTFIcpuDrk0e67+VjCfTM9/kFx4mkKniW5flkDfGUxo/QYYcvOo92Fc2/+LD1yD5VpUQbGt3JIEcmNmxRXYsKdxn59lyO9pVvUp9zXyTqyQBbizpJY/6QSAn7Tu4VeGlvwjSwVwyu5s0GdOQScGK+rcqdVQ45yf6gXvC6dJeorgH1VLzHWOT+mSOW0upEK0yHLwq1FHp8cmCzd4p3t1Gti2oiOVPttCLyIfS3kFTPpmt5pHUX/F5GaNw4q7z315kEjaEaTAB6jFBgIRrjadnvljo51LG8nQrfKtnBGn0bVLQfAqqMVRp0VWrcTW+HHCF8y4yRNPS6glPIys7K6XcZ//XBRNamvLVF/jcaUVhIW/GdlNqbuF6D3TuNID7HVuG8chAfbrMnsLKP2Ab7Mxpzk8OxMvWqnJcXxwu2ynsJnRPzFse88CA2J4mFEEYq+ol8TWvO8= X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;20:ze5Y2yRc8oE4lBb3YshptXDQ3P/YfnAt72UVh2WU0p2Jkr1ZftDbgUAEJawgs5qie849TCObcOFsgMnEJlRsMQV1VB+r1xOVUz+K3Nx2V6/G8Y0d+nGI9yXHlwxViZvGk+9SOaiSQiFBs2j1oRUaVS8xBF0w1/zGeIFXndIIbkFozXOPw1Eg8zntHjEevI/GOA+CEONQfXRF6M72kDqovOwXtZDs1S5aRniWiOttC7bB5vPPPGY7dXObwbMwMsyJP7dfiwe5FUYLJzpQF6vb09ekYBPn23hMYdOSaITToVSxqEmzUCyoP5LHAwjXBx2ZK+O3FEE2Ukr1fMyGQn9ga5mTm58q4xZaooPBxdZdw/7wJKv6MCm/24P41yqfVXW9t+rjRK0BhQ6QJtYSIZaQQMwgxVO6G9lleByUQ1jIW+KTQGlmZqKZP/wsCLBmaRFSJF3HdRwDAfcXXno5ZmI9ij176CaXKjWCM3ubN0QV7WXhK0VpxALzgCU+pPpgEs/O X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123558100)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:DM5PR12MB1146;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:DM5PR12MB1146; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTVQUjEyTUIxMTQ2OzQ6LzQwVk1aanQwTkszbHR2bWRLeVNMNDQrRzN6?= =?utf-8?B?L1d4NWFNNEhVRkhKTHR0M1BKY3FTaUZnSWZHYlJsMjk3NFM2ZVdRdm4zdEpZ?= =?utf-8?B?Yjd1V3pQblkvc0pMbFpVSHo2ZllyMG1VSk56N0N3NHhRQVJSbTFWejdEWkFH?= =?utf-8?B?TmlJRzF6ZkZQMmtyL05vQmtURUIzUFN0ZkpuVU84eXFsRStkSzBvalRVMTNW?= =?utf-8?B?K3J3U2pBQTJ4ZSthb3h3b1V0NW1CRnF1T0FNWHl4YlRtK256UGZKUEM5T3FE?= =?utf-8?B?ZURJTnFEK3Fxd3JiTHJ3VDU0NkJvNmRYSlc5UnJUdGNxVFo3L2VKMm1FcXc2?= =?utf-8?B?OHcwY0hKZjJSN0MvcTJZVlE3SHhwZ2xZSkk1b2x5djk3WU1YUXd1MGFWZkxG?= =?utf-8?B?aElJNFU0MkJyN3BDN3BMc1hrVEwyMjVPc0ZneHhpSnBHcUVYL1ZpckpvMVo1?= =?utf-8?B?K1RjZi84aExUbGVURTZQSVovdFozM1FMSFRIbHh4WVZPZ0tZNVJIVFYxZFp1?= =?utf-8?B?SmlkQ2JMMGlDT2l3dDRUNCt4U1RmMkRkVEZyWkxQL2RrRGJCL2ZHR1BXbnVU?= =?utf-8?B?M2J0WVBZQm4zNHJBU3h2aWJrTkJBLzhrTkp3NkZYUUZBdmVVd2lOMjdLVTNS?= =?utf-8?B?MDlhdFBlRmljWDNzUHlQV2gvOEhpaWxPdy8yd044MGpNWG03RzFUSXhOMFY0?= =?utf-8?B?V05saEF0TXQzOG43NTVBUWtTdk5CNHE5dks5YVI3SFpzckd5anI2aWp6U3FZ?= =?utf-8?B?MmdzRXg5eEZJZFMxbnVqeHNpRitTN09RQlJaWTkxeEhsV3lyaC8rS1hsMDZ5?= =?utf-8?B?TGgrbzNTNzBsU0NuSjNlc3ZmbjFESUpOUFI0Zm1NeFBxaFdvakY2YlN1K0x4?= =?utf-8?B?bzRrNjZIN3RMN3ZvVVFmUjd4MkRhTWJpdU5sOWY0M0owbzF3dk84dUNIc041?= =?utf-8?B?NVdFY05lNUlKZG1KN2NaTXNLeUZ3ay84VHhvd1FqR2F3emk5TmROMjB2dWYx?= =?utf-8?B?S3BsU2dnM2pkWFEySXhyYTkxNC90ZER4N1dVRnNrUjhNTDBIZnRSdkhkZTZ3?= =?utf-8?B?eUhhdnQ0SXo1K0l0V2hDaEgzTGFjNXdJbEMrbTIwQzE2NE16NTFCYitDUWhV?= =?utf-8?B?WXAyZitzaitLTGVRVlYwSng0N0lUQmN5MG1kRmtDL2E2M1NXNlpudk9RVnha?= =?utf-8?B?RG0vTVlPS0FVS1JTYVJuNUphblluYnZDTWIxejFhTHA0NjQ4VXVYQmZxQnp3?= =?utf-8?B?dUJKZTVaN0VGLzhkb1ZUZ2hpUkQwNUN4ZU11NzRSRTBFbGdPU1pVSkRWczU2?= =?utf-8?B?VTd5RmtPdU1Ka0hoMHFhUmFWM202cUNFWVBGNzJVcjlxNzFoL3lCVkd1RU1E?= =?utf-8?B?UjVPWHFWNEJjbXVmWmJvQ1JtZDZIY29aYWRpSi9BS25KZVR5bEsyT2tKMXNQ?= =?utf-8?B?a0x2TWVkRDc3SGZ1UHd0eC9QME5wSGhBNXZ5aGlWSk1oTEY0S3FlVjE2dXds?= =?utf-8?B?QTArNHVBNGs1akNabitCeVYvalZKSnJyNm1kTk1OdDgwY2NkRHFKaWIxSVEz?= =?utf-8?B?WldCajRCWnp3cy9jcFdWRG5rSzRoK09xbUFkaFRPT0doT2wzZlVhRkk5K1B1?= =?utf-8?B?RGNtc3kwbDBpV1ZkL2VqWkQzNDB6U21BeGhmTjRUTTBRczVVZDhBYU8xQ2wz?= =?utf-8?Q?9OO1jLmpVd2EBvx4IibBDdaUYKsU4mnDSZu1zg?= X-Forefront-PRVS: 0351D213B3 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39860400002)(39840400002)(39450400003)(39410400002)(39400400002)(39850400002)(83506001)(47776003)(66066001)(25786009)(23676002)(55016002)(38730400002)(6506006)(2950100002)(110136004)(54356999)(50986999)(72206003)(4326008)(4001350100001)(76176999)(189998001)(478600001)(33646002)(81166006)(50466002)(42186005)(8676002)(97746001)(5660300001)(1076002)(53416004)(2906002)(7416002)(53936002)(305945005)(7406005)(9686003)(54906002)(103116003)(86362001)(7736002)(6116002)(3846002)(230700001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR12MB1146;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTVQUjEyTUIxMTQ2OzIzOndFOStiNlQ1UkROTEFGYS80MFNFSEJTR05t?= =?utf-8?B?bGlvUDlNelBzTEdBWEIxNjFRQSs0d3NDZmZMVWhSWWhkUm8wNTNTeFVlV1NK?= =?utf-8?B?QzVpQ0pZMkMyeXhlc1ExU0dtQTR5a0ZEbnplbXBKSGltZzhkeURuYjNNTWkr?= =?utf-8?B?SE9KdDY2T1NzeWo1T0s5U094UlpzNTdXbEhXSVIyTklRSjh5YVE4T0p5QmMv?= =?utf-8?B?UlRMZWhMcWZGN3lUS3g0bTVXYmc0cHVsZTBpQ2h2ZFVYUkNHSHp5N25XbW1t?= =?utf-8?B?NXJOSmhBMnRSNEVBUnpJSG9VUWFDYkFpS0pVdy9KTHpHWVgvazkvTHFPQmp5?= =?utf-8?B?OG04aWYvb2xPem1Nc1d2OUszYmpZUk5FeTl1ZTJYb0tYYTNHZkVDcy9sdXVy?= =?utf-8?B?eGlOcmVGZnhna0QvMklHdnRTZTlFQTFwYXAreXFDYTgxTzRtb2JubnVqdG1P?= =?utf-8?B?dC95NnZoK2dtdHBhczM1RXFDMEtDSVBrbzJpT0dyZ3hFcHV4RWdlQk5oS1Ft?= =?utf-8?B?amIzNFEyZmZpQ3Vpelc5RFRuTkF3dnVvZVYyTmJxMjhqU2lJTnYvNWJidDVi?= =?utf-8?B?V3pYZUs2TFk0OWNHTHBIY0ZFZ1dJRXpTbHBGUGEwaE9lbXRtUHNabzdianAw?= =?utf-8?B?cWNGUERFbkRYekVMSE83eHhGVW1OallrRXlROUthNkVPZ3R0NW5FUGVZemJn?= =?utf-8?B?dHM1VittaFRMbFV5TGFkeW8wZlZ1WUVVZjdMT2w0QVdXenBOakMrRVE5Qlow?= =?utf-8?B?UDh0dU1xbHlaWkNEdEVCT0NKOERMT3pTM0NlMG9sZDM0c2FOWUJJMkxzeGFR?= =?utf-8?B?U1ZFZTVIenFmUFFyR0hGb1RYMDdna1ZVV2ZPREVNODRGenl3OU4vZ3dnUXJI?= =?utf-8?B?Z3RHRlBNZm85VHFFNU14VEdIYzFCQkZnRGlxdW81YVUxZXQ4RUZ5N1hNaEpR?= =?utf-8?B?ZjRtd1dMalR4aHhkUlc0NG90Q1FnK0hveERDYjBJaHlGVkdTWnp0VTNSTDVV?= =?utf-8?B?ckU2cWZ4NWppYi9LelFBWGFEMW42cS8xV3lyUkJZQlNpcDdTKzFWaEhaRGhO?= =?utf-8?B?V1VhSHNHdUNWcXdZeEtic2RwbERhMnlJOTFIOW40NTJITDRMdkc0bXI0ZXRG?= =?utf-8?B?ZU85RDBXSmhlblh3MlI1cThZYnkvMW9kMkIzY3djSVE3MkZxRnNCdjN0eDZl?= =?utf-8?B?b3FaZlhTZFg0UDRMa05yN1RRVE13bHRIeGx5ZGFoa3VmN2xHZS9rVjFiWlZF?= =?utf-8?B?MFZ5cEV4VVBhNDhHc0dxSFBjL0tSUE5TVHdXSlJlZUJ0L0t3ZmNEZUhMWnoy?= =?utf-8?B?UHFmUTZybnRmYmt3NVNwMllucVN6VXZrUlRRMjBUQ3BWRnFxOU96Z3FXdTRV?= =?utf-8?B?UG5LUWxKZnYrMjB6YTVNb21OdCtpbXJHNkprbWgvSWFsTks2bDhWZXFIK1FN?= =?utf-8?B?ek5zWERFWFdGSkxWdkxHWEdQcnlWRE96dEtpTWh6aDJockJ2RlFMZkJ0WHpG?= =?utf-8?B?V2JlVk1pMHFiUTlLQ1JuVjQwL09ibExXSzd6U1h6LzltekZuSVZzMi9wNFpo?= =?utf-8?B?a1FJUE8ydWdpWmtNSHV2NWRjUjBYcVBCQUV5UFVzMFU0RldwWHI0T0VWeGlr?= =?utf-8?B?Z3RwVzBTY055MzcvZEFVSXNvWmNXdTY2Y0srM2V6UnEra2JES2x3TE5DenB4?= =?utf-8?Q?tSlSq46oZcItMhq7WU=3D?= X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTVQUjEyTUIxMTQ2OzY6eHZ2UXJIQjFyeFplZDFUMjg1L0YyQTN0d0dp?= =?utf-8?B?TUluU2xUYjIrZm45WGozM05qSU9XVXBtZE11bXZNOWdLNFBnbUx4RUlsb28r?= =?utf-8?B?Vkdpa3doWGpMaE5ZZG5hQ01sa1FPR0RodU45Zmx6dEtZUHBUR25JNzAvRWVi?= =?utf-8?B?ZnBBbGRIK1cvK0kyY053QU9kSFd0Y1locTJnaHBkZS92ZmpJMmFkRGF3eStC?= =?utf-8?B?a1VFQnQraWs2WnFtM1lXR1VqRkluZm8zZHU1T2lJS0JQeU5KNDMzM0pxWXZj?= =?utf-8?B?VGdYdndzMEt5U2REcldkSGVKZkZ4NDJyOGJQcWl1aDVzREtUYTh3cForb3d0?= =?utf-8?B?VlRDcUZrTFdTcFYreng0azVvNzlnNVZZQ21XZk9QQit6MXpGWTg2THFOSCtF?= =?utf-8?B?U2hYRTdMbGRQanNnRUlLczdZR25ZNU9QbFRlU25ibG9oYnZlRjE1R0hvU0pw?= =?utf-8?B?NTFWcG9qdHUwbTM5ek1aTXZXeEExZzZGR0NUODlZeU1YWmVybVpEdE5GZ2ll?= =?utf-8?B?SGdPZi9YNEpyRmg5RnVwY0lxOFlicTE2MENTd1NBcDN1VHlnNVJFcGNDM1VE?= =?utf-8?B?WmZITlZ5YjhOVDFwcGtUaGJkWEE4RnUrRjkvenJ5VWNjV2tzS1dpTU1FcTND?= =?utf-8?B?bFFlYkxHcGMycENmTkQ0Qzk1ZHdPUjVBMkJXeVBCVHA5UW9ZQ0VCNEZLVkdE?= =?utf-8?B?dkJ6TFFyYXBINEg5SzZLR09RT005NmFUMnNSQjhXOTFMM29iQ1ZRNXpKYXVy?= =?utf-8?B?OGJOQkRFcDd5VFpEQndxSTQ5SUFKK2lubmlValVCZXdMVVRQdDVLeHNpRjV3?= =?utf-8?B?dHo2VUdXZXhQZTMzV2JWdjRLTHhFSVAwdE13bE5SdXAvUE5zbWpxNW41dWVz?= =?utf-8?B?ZFFwM3RiaHVhcmRhSUYvbVhsU3U0MDdxWUZnRERiREVOU21vRnBzWXc1djAr?= =?utf-8?B?dWlWemRmeUw3N1FObUtpbUtaam9XYWdJY0E4djRyaFIzMHhteVJJNXQxTS9l?= =?utf-8?B?OWxCcldUYTV3cFF5ZVk5Q2lPeFZSb29Eb2R6L3NRcWpSbjlybTd2RVlXbk5I?= =?utf-8?B?c0hqWnQ2VzhTUUVPOStkaEdyVTRVaUs1bDNrMTdyKzg4V09FeWZ0bm10NFRo?= =?utf-8?B?NTFWUDVSRVVySnROQnZYb3gwK2QwQWY3WFRFekVRdXNtVE9ZdVU3NzNDU04v?= =?utf-8?B?cEdZeSs2MmJKc3d4S1BnemtnVmdpeGN1MFljQ3VJRGhOWXhvUEpHT0NWNGpE?= =?utf-8?B?ZGNhQzRadHV0YzY0Wm9NUVRwQS83bnFQaFU2QlVWZitLdFlhQ1J6UVg3RjFW?= =?utf-8?B?L2NPZnY0bG95U2dnK3Y1NktqaWUrQXZQMFdXYkhHT0ZYQmt2WUJsOHArZnJQ?= =?utf-8?Q?bY3I5s4?= X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;5:zOz+LXH532gNsku3HZ/Om1ovC+9ie+sh3VhkHjVvMLg6z3Z6EKFP4OlzKUcgD1WFk3jpeX6YX0kyUzAWR7pzqC4XYgxG+IKdgGMxijlaNDIZJ++BKddTPvEKtOOQ5ezFOh5D/pRhhtxEsyIuBHi3bA+amUdBjbtEPYSc/9KG+NCwaIRJRmrbmYCC3wg7IZdnvpy+wvldzJyDAo6MTBDOd1NzELrzR9ACFnJIEtnZELqenSY1U7/YeQ5Z6IpPu/sCtKOdcMElpkWQGFUp4pgSmTJ61CQVdfR2DJGUGCZigv/Ay771AdJXrf+Y0noLtcpO1i2yOmcYzOjJL6GiA2EoH9xVj9WQ6+YCk2noEpBYQncU4UaC9o3XlUAN3XL9VbqXK8JwzRGkaGLsGZMin3fDMdVMW6P4i+RCRmRXqnVe2Gy/LwVAom8LIptAWUOCVurs2iXo8UCCVHvTDd7LruYx4nIhoMpwMHeMGAr4mrRDQV2NhL4uSsmZ/LElQDd4nF/M;24:dVhcJjWEjdnr1XlYe0Uj0DnGzODVAWMrsz18HvpSSrNvUS4EbFJKM3h8HCJZMqzmHFDWjmAcX1xRplGGdOwVOO2yfTIzNCz3vr5zvrlknyQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;7:iFRxDwOAAs7p1yG6YYh/1gh5AkJxIKXNaLEWeWwakoCnWAt3hNguLgtyXNmZp1AG5GEq6U4Z8vicaXx/Q9xsEBjX2YN0Qud9wn12bo5hyrnkFfN4qLZzGp/HpI4L56FmT3EOi2rWkZQhuPaYMTfBJKrL6PK4Ok+usi4s46PcrGRhTINm195/Wi7eryH7RfVSF8dwlHPC7/V4F+PBv1wfXfNF+g3AzGZbIOslSPMiu5iP/4JGtXyNRDz21Iy/YwWqDuDT+BL8RIaQX7iccm4FQROPt3fXcWLS2a41XAVB9N6nicpGot24pySv7S6t1r776g6lttODBY3MmD2LACsGSwm11NUjTfFMUti+h0EOYaDVtPBp5BsDWus/4mNMUwC85mKtWlXxcsUq5cyVHMU6umAyiIHKt/jU7cGvllpsrI5zUYPb2zHhakvZTUVKo2ef1jvqZVW9tp1nITBQTJpbl/zCsqJyQE6F7BuDS7HVnMMMcwA0rnieVVD15JJ21ZmDv583YA3kTyyX8UmivseKggsFdLc/5Rum0Acv3j31TNZWG53yzuBiNAndzFlxDUzsmFi714b21FbZu94QP5A+nrdDcFt1umzBEa+BUQbgE/9WZICDfsKomlRJiQklLpaC6lEpFP5G0q0ByHXFSUTmNY9HzuY5Y/hs4hAB1JJd749Dsyk/+cOUnP2ZzPZvMtF/t0onSerkdqyxLxu/7P0bpYGAXR3yNybg4hQ0QBv3P0XDRIRZB9uEXjZQ9YR9StiCVjA4wGvBpayl3QkUzMVW+WiX4VYmN742ZBxzaXy9dBE= X-Microsoft-Exchange-Diagnostics: 1;DM5PR12MB1146;20:WsdcLkTzBJwRBAU87e6ZVSm+N5MTJKhdovk7WEZJPviydfmxr7EvOlQF5n4seKxvRUU3Od9TpIzJoxMVXJFAVu2h5+LNKL4w8U4k7Z8MTygl+p+iqUo9CkMvpX/OuT/G7Q/Xak+N8dbzNxfBXhgQd6zLFzdRHsRmbEMPxaESr6tUzzsT3CbrErKE/5pmJO0++f3mQJxJhBsQciJQME0crQOH7FA8Qvo4GjlaCS1YtplOANblIzbV6smE4Psv2rJT X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2017 14:58:25.9212 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1146 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add early_memremap() support to be able to specify encrypted and decrypted mappings with and without write-protection. The use of write-protection is necessary when encrypting data "in place". The write-protect attribute is considered cacheable for loads, but not stores. This implies that the hardware will never give the core a dirty line with this memtype. Reviewed-by: Borislav Petkov Signed-off-by: Tom Lendacky --- arch/x86/Kconfig | 4 +++ arch/x86/include/asm/fixmap.h | 13 ++++++++++ arch/x86/include/asm/pgtable_types.h | 8 ++++++ arch/x86/mm/ioremap.c | 44 ++++++++++++++++++++++++++++++++++ include/asm-generic/early_ioremap.h | 2 ++ mm/early_ioremap.c | 10 ++++++++ 6 files changed, 81 insertions(+) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3a59e9c..a04081ce 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1434,6 +1434,10 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT If set to N, then the encryption of system memory can be activated with the mem_encrypt=on command line option. +config ARCH_USE_MEMREMAP_PROT + def_bool y + depends on AMD_MEM_ENCRYPT + # Common NUMA Features config NUMA bool "Numa Memory Allocation and Scheduler Support" diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index d9ff226..dcd9fb5 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -164,6 +164,19 @@ static inline void __set_fixmap(enum fixed_addresses idx, */ #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE +/* + * Early memremap routines used for in-place encryption. The mappings created + * by these routines are intended to be used as temporary mappings. + */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size); + #include #define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags) diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index de32ca3..32095af 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -161,6 +161,7 @@ enum page_cache_mode { #define _PAGE_CACHE_MASK (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT) #define _PAGE_NOCACHE (cachemode2protval(_PAGE_CACHE_MODE_UC)) +#define _PAGE_CACHE_WP (cachemode2protval(_PAGE_CACHE_MODE_WP)) #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ @@ -189,6 +190,7 @@ enum page_cache_mode { #define __PAGE_KERNEL_VVAR (__PAGE_KERNEL_RO | _PAGE_USER) #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) +#define __PAGE_KERNEL_WP (__PAGE_KERNEL | _PAGE_CACHE_WP) #define __PAGE_KERNEL_IO (__PAGE_KERNEL) #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE) @@ -202,6 +204,12 @@ enum page_cache_mode { #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \ _PAGE_DIRTY | _PAGE_ENC) +#define __PAGE_KERNEL_ENC (__PAGE_KERNEL | _PAGE_ENC) +#define __PAGE_KERNEL_ENC_WP (__PAGE_KERNEL_WP | _PAGE_ENC) + +#define __PAGE_KERNEL_NOENC (__PAGE_KERNEL) +#define __PAGE_KERNEL_NOENC_WP (__PAGE_KERNEL_WP) + #define PAGE_KERNEL __pgprot(__PAGE_KERNEL | _PAGE_ENC) #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO | _PAGE_ENC) #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC | _PAGE_ENC) diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index bfc3e2d..26db273 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -414,6 +414,50 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr) iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK)); } +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +/* Remap memory with encryption */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC); +} + +/* + * Remap memory with encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC_WP); +} + +/* Remap memory without encryption */ +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC); +} + +/* + * Remap memory without encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC_WP); +} +#endif /* CONFIG_ARCH_USE_MEMREMAP_PROT */ + static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss; static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) diff --git a/include/asm-generic/early_ioremap.h b/include/asm-generic/early_ioremap.h index 734ad4d..2edef8d 100644 --- a/include/asm-generic/early_ioremap.h +++ b/include/asm-generic/early_ioremap.h @@ -13,6 +13,8 @@ extern void *early_memremap(resource_size_t phys_addr, unsigned long size); extern void *early_memremap_ro(resource_size_t phys_addr, unsigned long size); +extern void *early_memremap_prot(resource_size_t phys_addr, + unsigned long size, unsigned long prot_val); extern void early_iounmap(void __iomem *addr, unsigned long size); extern void early_memunmap(void *addr, unsigned long size); diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c index 6d5717b..d7d30da 100644 --- a/mm/early_ioremap.c +++ b/mm/early_ioremap.c @@ -226,6 +226,16 @@ void __init early_iounmap(void __iomem *addr, unsigned long size) } #endif +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +void __init * +early_memremap_prot(resource_size_t phys_addr, unsigned long size, + unsigned long prot_val) +{ + return (__force void *)__early_ioremap(phys_addr, size, + __pgprot(prot_val)); +} +#endif + #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Lendacky Subject: [PATCH v8 12/38] x86/mm: Extend early_memremap() support with additional attrs Date: Tue, 27 Jun 2017 09:58:23 -0500 Message-ID: <20170627145823.15908.76242.stgit@tlendack-t1.amdoffice.net> References: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> Sender: owner-linux-mm@kvack.org To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , Radim =?utf-8?b?S3LEjW3DocWZ?= , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Larry Woodman , Jonathan Corbet , Joerg Roedel , "Michael S. Tsirkin" , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Boris Ostrovsky , Dmitry Vyukov , Juergen Gross , Thomas Gleixner , Paolo Bonzini List-Id: linux-efi@vger.kernel.org Add early_memremap() support to be able to specify encrypted and decrypted mappings with and without write-protection. The use of write-protection is necessary when encrypting data "in place". The write-protect attribute is considered cacheable for loads, but not stores. This implies that the hardware will never give the core a dirty line with this memtype. Reviewed-by: Borislav Petkov Signed-off-by: Tom Lendacky --- arch/x86/Kconfig | 4 +++ arch/x86/include/asm/fixmap.h | 13 ++++++++++ arch/x86/include/asm/pgtable_types.h | 8 ++++++ arch/x86/mm/ioremap.c | 44 ++++++++++++++++++++++++++++++++++ include/asm-generic/early_ioremap.h | 2 ++ mm/early_ioremap.c | 10 ++++++++ 6 files changed, 81 insertions(+) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3a59e9c..a04081ce 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1434,6 +1434,10 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT If set to N, then the encryption of system memory can be activated with the mem_encrypt=on command line option. +config ARCH_USE_MEMREMAP_PROT + def_bool y + depends on AMD_MEM_ENCRYPT + # Common NUMA Features config NUMA bool "Numa Memory Allocation and Scheduler Support" diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index d9ff226..dcd9fb5 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -164,6 +164,19 @@ static inline void __set_fixmap(enum fixed_addresses idx, */ #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE +/* + * Early memremap routines used for in-place encryption. The mappings created + * by these routines are intended to be used as temporary mappings. + */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size); + #include #define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags) diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index de32ca3..32095af 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -161,6 +161,7 @@ enum page_cache_mode { #define _PAGE_CACHE_MASK (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT) #define _PAGE_NOCACHE (cachemode2protval(_PAGE_CACHE_MODE_UC)) +#define _PAGE_CACHE_WP (cachemode2protval(_PAGE_CACHE_MODE_WP)) #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ @@ -189,6 +190,7 @@ enum page_cache_mode { #define __PAGE_KERNEL_VVAR (__PAGE_KERNEL_RO | _PAGE_USER) #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) +#define __PAGE_KERNEL_WP (__PAGE_KERNEL | _PAGE_CACHE_WP) #define __PAGE_KERNEL_IO (__PAGE_KERNEL) #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE) @@ -202,6 +204,12 @@ enum page_cache_mode { #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \ _PAGE_DIRTY | _PAGE_ENC) +#define __PAGE_KERNEL_ENC (__PAGE_KERNEL | _PAGE_ENC) +#define __PAGE_KERNEL_ENC_WP (__PAGE_KERNEL_WP | _PAGE_ENC) + +#define __PAGE_KERNEL_NOENC (__PAGE_KERNEL) +#define __PAGE_KERNEL_NOENC_WP (__PAGE_KERNEL_WP) + #define PAGE_KERNEL __pgprot(__PAGE_KERNEL | _PAGE_ENC) #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO | _PAGE_ENC) #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC | _PAGE_ENC) diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index bfc3e2d..26db273 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -414,6 +414,50 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr) iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK)); } +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +/* Remap memory with encryption */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC); +} + +/* + * Remap memory with encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC_WP); +} + +/* Remap memory without encryption */ +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC); +} + +/* + * Remap memory without encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC_WP); +} +#endif /* CONFIG_ARCH_USE_MEMREMAP_PROT */ + static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss; static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) diff --git a/include/asm-generic/early_ioremap.h b/include/asm-generic/early_ioremap.h index 734ad4d..2edef8d 100644 --- a/include/asm-generic/early_ioremap.h +++ b/include/asm-generic/early_ioremap.h @@ -13,6 +13,8 @@ extern void *early_memremap(resource_size_t phys_addr, unsigned long size); extern void *early_memremap_ro(resource_size_t phys_addr, unsigned long size); +extern void *early_memremap_prot(resource_size_t phys_addr, + unsigned long size, unsigned long prot_val); extern void early_iounmap(void __iomem *addr, unsigned long size); extern void early_memunmap(void *addr, unsigned long size); diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c index 6d5717b..d7d30da 100644 --- a/mm/early_ioremap.c +++ b/mm/early_ioremap.c @@ -226,6 +226,16 @@ void __init early_iounmap(void __iomem *addr, unsigned long size) } #endif +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +void __init * +early_memremap_prot(resource_size_t phys_addr, unsigned long size, + unsigned long prot_val) +{ + return (__force void *)__early_ioremap(phys_addr, size, + __pgprot(prot_val)); +} +#endif + #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-by2nam01on0067.outbound.protection.outlook.com ([104.47.34.67] helo=NAM01-BY2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dPrx7-0006KY-Sv for kexec@lists.infradead.org; Tue, 27 Jun 2017 14:59:01 +0000 From: Tom Lendacky Subject: [PATCH v8 12/38] x86/mm: Extend early_memremap() support with additional attrs Date: Tue, 27 Jun 2017 09:58:23 -0500 Message-ID: <20170627145823.15908.76242.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> References: <20170627145607.15908.26571.stgit@tlendack-t1.amdoffice.net> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , "Michael S. Tsirkin" , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Boris Ostrovsky , Jonathan Corbet , Joerg Roedel , Radim =?utf-8?b?S3LEjW3DocWZ?= , Larry Woodman , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Thomas Gleixner , Dmitry Vyukov , Juergen Gross , Paolo Bonzini Add early_memremap() support to be able to specify encrypted and decrypted mappings with and without write-protection. The use of write-protection is necessary when encrypting data "in place". The write-protect attribute is considered cacheable for loads, but not stores. This implies that the hardware will never give the core a dirty line with this memtype. Reviewed-by: Borislav Petkov Signed-off-by: Tom Lendacky --- arch/x86/Kconfig | 4 +++ arch/x86/include/asm/fixmap.h | 13 ++++++++++ arch/x86/include/asm/pgtable_types.h | 8 ++++++ arch/x86/mm/ioremap.c | 44 ++++++++++++++++++++++++++++++++++ include/asm-generic/early_ioremap.h | 2 ++ mm/early_ioremap.c | 10 ++++++++ 6 files changed, 81 insertions(+) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3a59e9c..a04081ce 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1434,6 +1434,10 @@ config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT If set to N, then the encryption of system memory can be activated with the mem_encrypt=on command line option. +config ARCH_USE_MEMREMAP_PROT + def_bool y + depends on AMD_MEM_ENCRYPT + # Common NUMA Features config NUMA bool "Numa Memory Allocation and Scheduler Support" diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index d9ff226..dcd9fb5 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -164,6 +164,19 @@ static inline void __set_fixmap(enum fixed_addresses idx, */ #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE +/* + * Early memremap routines used for in-place encryption. The mappings created + * by these routines are intended to be used as temporary mappings. + */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size); + #include #define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags) diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index de32ca3..32095af 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -161,6 +161,7 @@ enum page_cache_mode { #define _PAGE_CACHE_MASK (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT) #define _PAGE_NOCACHE (cachemode2protval(_PAGE_CACHE_MODE_UC)) +#define _PAGE_CACHE_WP (cachemode2protval(_PAGE_CACHE_MODE_WP)) #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ @@ -189,6 +190,7 @@ enum page_cache_mode { #define __PAGE_KERNEL_VVAR (__PAGE_KERNEL_RO | _PAGE_USER) #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) +#define __PAGE_KERNEL_WP (__PAGE_KERNEL | _PAGE_CACHE_WP) #define __PAGE_KERNEL_IO (__PAGE_KERNEL) #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE) @@ -202,6 +204,12 @@ enum page_cache_mode { #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \ _PAGE_DIRTY | _PAGE_ENC) +#define __PAGE_KERNEL_ENC (__PAGE_KERNEL | _PAGE_ENC) +#define __PAGE_KERNEL_ENC_WP (__PAGE_KERNEL_WP | _PAGE_ENC) + +#define __PAGE_KERNEL_NOENC (__PAGE_KERNEL) +#define __PAGE_KERNEL_NOENC_WP (__PAGE_KERNEL_WP) + #define PAGE_KERNEL __pgprot(__PAGE_KERNEL | _PAGE_ENC) #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO | _PAGE_ENC) #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC | _PAGE_ENC) diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index bfc3e2d..26db273 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -414,6 +414,50 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr) iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK)); } +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +/* Remap memory with encryption */ +void __init *early_memremap_encrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC); +} + +/* + * Remap memory with encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_encrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC_WP); +} + +/* Remap memory without encryption */ +void __init *early_memremap_decrypted(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC); +} + +/* + * Remap memory without encryption and write-protected - cannot be called + * before pat_init() is called + */ +void __init *early_memremap_decrypted_wp(resource_size_t phys_addr, + unsigned long size) +{ + /* Be sure the write-protect PAT entry is set for write-protect */ + if (__pte2cachemode_tbl[_PAGE_CACHE_MODE_WP] != _PAGE_CACHE_MODE_WP) + return NULL; + + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC_WP); +} +#endif /* CONFIG_ARCH_USE_MEMREMAP_PROT */ + static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss; static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) diff --git a/include/asm-generic/early_ioremap.h b/include/asm-generic/early_ioremap.h index 734ad4d..2edef8d 100644 --- a/include/asm-generic/early_ioremap.h +++ b/include/asm-generic/early_ioremap.h @@ -13,6 +13,8 @@ extern void *early_memremap(resource_size_t phys_addr, unsigned long size); extern void *early_memremap_ro(resource_size_t phys_addr, unsigned long size); +extern void *early_memremap_prot(resource_size_t phys_addr, + unsigned long size, unsigned long prot_val); extern void early_iounmap(void __iomem *addr, unsigned long size); extern void early_memunmap(void *addr, unsigned long size); diff --git a/mm/early_ioremap.c b/mm/early_ioremap.c index 6d5717b..d7d30da 100644 --- a/mm/early_ioremap.c +++ b/mm/early_ioremap.c @@ -226,6 +226,16 @@ void __init early_iounmap(void __iomem *addr, unsigned long size) } #endif +#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT +void __init * +early_memremap_prot(resource_size_t phys_addr, unsigned long size, + unsigned long prot_val) +{ + return (__force void *)__early_ioremap(phys_addr, size, + __pgprot(prot_val)); +} +#endif + #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec