Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933060AbdDRV0m (ORCPT ); Tue, 18 Apr 2017 17:26:42 -0400 Received: from mail-sn1nam02on0062.outbound.protection.outlook.com ([104.47.36.62]:56544 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753561AbdDRVS3 (ORCPT ); Tue, 18 Apr 2017 17:18:29 -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 v5 10/32] x86/mm: Extend early_memremap() support with additional attrs To: , , , , , , , , , CC: Rik van Riel , Radim =?utf-8?b?S3LEjW3DocWZ?= , Toshimitsu Kani , Arnd Bergmann , Jonathan Corbet , Matt Fleming , "Michael S. Tsirkin" , Joerg Roedel , Konrad Rzeszutek Wilk , Paolo Bonzini , Larry Woodman , Brijesh Singh , Ingo Molnar , Borislav Petkov , Andy Lutomirski , "H. Peter Anvin" , Andrey Ryabinin , Alexander Potapenko , Dave Young , Thomas Gleixner , Dmitry Vyukov Date: Tue, 18 Apr 2017 16:18:04 -0500 Message-ID: <20170418211804.10190.34358.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170418211612.10190.82788.stgit@tlendack-t1.amdoffice.net> References: <20170418211612.10190.82788.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: SN1PR16CA0020.namprd16.prod.outlook.com (10.169.34.30) To BN6PR12MB1139.namprd12.prod.outlook.com (10.168.226.141) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 18a9af8b-7a76-4814-9f84-08d486a069b7 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(201703131423075)(201703031133081);SRVR:BN6PR12MB1139; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1139;3:wmIBHuvE8V82IB3LGfIJYelNFBevCtbDP/OPyfsxPEALjgbkgh3L3ZGzM8iR6WnqRYu6sQudiaklfO6bO8ttlPLMsSUf4SAwV6A0vNsbPoWhlddfZoRXDLOnyGoJleTBQ8p30gRhAH2tVIniJWf6CWailEQNnraBsui4DpleLZUqY2fitaRZ0PGj+pDQq7R1ERHrg8q0tfYdnwAD05sWo6yX9ACPvVknNPiDaFPWOdL3ZpQzYeL5/1+PKTFZzHuRbp96w+r2F45lG9KrCJsQNua+d2esWIgI98FefG6OcQNkX9vLy+oR6rH6QCVoJCyVx8BBltsReEdpbd1ANMfcramZFWvgvJDYGFYo91Z1Yf4=;25:gZAIdTNPWv2L4c2G5ThzLmrkJbAc5cA7kS7PzDcYKVfeJfNfZfOA8wtGgwDWWCXIRdo347UGo0YZXcHXs4k5gseqSlsPs6oH8ygVt7orwsDH4vl9lmEQMsbxJe195Ll3hMtBJkOFQ5gVMY0s9gyvEiMjC4F+k/wnQd0pL16SYO+O9iUr6FOazrVCDDr6ur1K5Ve8qhrmEK4jjWV9dWOmpVLP2fAs3XxM/cLrbQHstIvJHSasUpNAWXFPY+Sk3t0T/b5QQJldFGxYsM1ZgQw0VUChdUpgBPNdQLPH5jgsG3mQFSG8QxYA/qvOaoFwaCRQe8hVZdWfjZtlY29DBsA/GuEJvraWX9Z+uulxMFZNZBoE1klFogi2SYaBKw1gjmjiGMpMEAIcwc514kswcUz8fpvxCCX6081AXYH5W2Tus+5TT/ZQK+Ew3/PQksBRv4gVV5rDWEjgFfSnU9VjT3CcMA== X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1139;31:O9cC2qstDie563kjQpQwMnJI0/d3FwfVUzCf3VBzzcJ14DXy0jBh0a2e34It5hP/MOQg3UqDTULszvJBTnpn7B4zQaDgOPT9+oxIjL2fDV1njAVEe/W+5cEqucKEARbAkHgmTb9FPbQH4zLvJ0WHVc6cGGi/xajrjgE+1rL3hl9a14qfPvjkALZQ2FYElIfq5eFz2rSTrZ7cTDz1fCaQ8qo0tzp64k74LGPJP70/y60=;20:/+RhSVNH4vHMn8Hx7gg0P7Qy723DyA/FhXT6s/wGxleIX0PXRir3MoS3TnCp2dL4smfsBs/bSIFqmjXGXndW/Mt87Iukk6YzH9dDnsymX9dSdhXPx+bcznZUnzG6OXA09/OeBhh3rwjcK78mr+tIBvZ/KhNMkqfJiqRVH8e3qjQTAGMOTsZUKNg3yrDi2hFRcvRqQJ8wEJfDdOUtmek2/KD8u61gx35PtfmSk1twDyCcu9bwtpIgTPc8bg5l/Cc/QcWKnjSITToVR61eKbdOK1Vgdb0rjFZ4MJiFJgAMP2Bs7uIuI+cBuNb7wELPnwh2D1kNsZdNt68iilDkFkxxQQpK0fkSPP+S9ZgDNC53e+fcTxyGXPr5f9Cl+fv8ECER4OyOgMJxorNeIfxdSov6hLSzm1HddUL6koQHi5pP9LjvQZEmRRgKTEl/SUmCIjr9thXX3rNzgE3/PbrIJTjWQlxzPgTSFT4jCFlR6MhsNHk/HvBK5IhG6qlOjXLiR8jC X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041248)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(20161123560025)(20161123555025)(20161123564025)(6072148);SRVR:BN6PR12MB1139;BCL:0;PCL:0;RULEID:;SRVR:BN6PR12MB1139; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1139;4:AMQgdQg56+z1K+ku3D9fTmCfer+/CtgBcMDo18MMBWGbayTn2sOXDzRZfOn0kf77y098JLWqICCA+ZwpogX3mmku0ywSV/0VUp/0OXaTBnLoE7wOgAMWVJG6pMWt2gpTersxDD5P8mwn4UHq2yq/lEKgrYy7niybRzx4WZ5uOa7frXn8wRNeMCWrJhaKL5Dn6hWpAQfAHJ709T1Y6TYfoVNQMiU6xUl2ldlNOxEK3UEnIYr0B7O0b/+UjMZspgHh0ndROsL/5cc+AxHxyWVTjJZKbPzccqkqB/JTTT0wUMaz0Q3e3HmkQ0LGq1Qhb5D1SmMAJ1YfnhbHWqm3o6Th1V+NaxAAsdo1jMX7qkC4BiF3OXcXsPdZVrjvp73UTdVwSj69kKXdaDSety0SD0HLWsvgR2T3rJvIJME6GvwFRBKxymr89rnoSLJezDXEFOoh6lHDeFwvkNgFL7rgcgtg3OC3wsO/MpM213H/A4BwGLuLaoB2uhXfXCNcv2pJDmLTx/xbUiSce4rUW2rhvEdkjh+DWCFZioqH81lWOUid6LH85KMBTl6zsfNuycQkNDFTgXVEFblvTU7WTh5Aw75SpAMLCR1/l2MHtTFArMTz1Z0d2Tl4epfaEFIJDP25MzXQ4ZA/p7gQRaqxL4lLX1r8yuOT2LNIQYULQhpy9eI4IMnUu+4DIuBeh0OBkMOj8XvijD300iMNCn9TTLS0CEAUxh53A4vECrdZac+C+iELvwGcFxcmcV0x4LUXSpxJh9VfNqAkjZ+Y4LOOVRayjvN0/Q== X-Forefront-PRVS: 028166BF91 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39400400002)(39850400002)(39860400002)(39840400002)(39410400002)(39450400003)(53936002)(4326008)(2906002)(8676002)(4001350100001)(2201001)(103116003)(81166006)(54356999)(50986999)(76176999)(86362001)(575784001)(55016002)(189998001)(33646002)(42186005)(50466002)(9686003)(230700001)(54906002)(23676002)(53416004)(25786009)(7736002)(1076002)(6506006)(38730400002)(305945005)(6116002)(3846002)(47776003)(66066001)(83506001)(5660300001)(97746001)(6666003)(2950100002)(7416002)(7406005)(71626007)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1139;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM5OzIzOjlJU2luSWxhVmlJbnZRa0dzS0J4ZGN1ZzFj?= =?utf-8?B?SjIvdEF4WDhyNkhQWkhiT3pLc2o0SEwrVGM0V3k4VlBCUzdwZ2RLaW5QMWsz?= =?utf-8?B?OWZQUTNmclJIWjJQcVNPUEdNdTVuckgxSE5lTGFPYythSXNjNU90d3BIa3RS?= =?utf-8?B?NktSdldEb3VuNU0rLzBORFU5c0krRGpCSDZaWk9vcWtDL2xaR25Gc3lIblMy?= =?utf-8?B?RC9Ia0JvN3pPUm5xTjNkekxaZXNZdWQ4M0o1cnNhc0NsUTVpZitWYXQ4UTF4?= =?utf-8?B?MitkZWM0QWs4NW9UbzBYdmxvQVQ4R1kxUFExb1liMG9VdUhXRTZLRlpLN0Fp?= =?utf-8?B?bGQwZmw2bVRWc0FVSDJOY0NsYnNrNjVuQllOMkJERWpBT080MlEyai8zcEV1?= =?utf-8?B?OXBjNU8zMzVjd21ERnMvWm1xaDNITlFTeDdGRXFKZE5lQzZxRVhPNzBxeWdH?= =?utf-8?B?MWxMWUcwZWl2MWkwQ2htTDg4dGxvMFFKNkgzVlpDMUM4a3dhSTAxbXIzUXU2?= =?utf-8?B?TThVdktZRlRoRjVld1ErcGdST3J1T0lqb3N1TVBUcWdVbzNGNzM3ci9TYkRx?= =?utf-8?B?V2JhbUY0QUh3NU4ycCtQZEVXNVptTTFWenRTbkdPMm0rbExqNGhlaS9LbDFu?= =?utf-8?B?bGZ3T0hKTnkrK0lqQjZPcXBOZllubkxkZWJzd3kvNmtyallHMC9pQmJyRW5m?= =?utf-8?B?dnFxUlIxcUF2RWI4MHZKTi9IVGQwZzJYU1FJMHpnK2t1WDNQVzZ3eVZaOE5F?= =?utf-8?B?NjI1QnQ3bVRraW1XN1VQN3ovZHovNDRJMk5sV3Via3NvejBJUFdHNTdMODRN?= =?utf-8?B?R2FtV2tDbTFUVGFQRkR4M1BiOCs2cHhEamJNbVh6cFlOSE50VmpBdjd3OHJH?= =?utf-8?B?WHNyWitsOXNLL0FTQ3h6ZWNGcUV3cW9wRG11NkUzeVE3K0Rpb1JPcU1rUEYw?= =?utf-8?B?TnI5TEhITmd4VlJWMWtZdWNkNU9DbzBGdndZSnU4T1BHZmpzOG81NWRRc240?= =?utf-8?B?MlFmMGM5Q3BFeFVXaWNmTWZHWkFsNHBkZjMyMGJ0Qlovbm95NDRhUU9QRnZu?= =?utf-8?B?cUxQa2Z3T2RFcFdFOHdRSldFWE9BUG5GSFBacW9QejhSZlJNdExUOFpUSWhG?= =?utf-8?B?R1FCYTA2VW5BcExxRVQxTDdwTWdlcjJzcjJsQ0tEUWZ1c2lWR1RpUTM5OFR4?= =?utf-8?B?ajY2RVlScW8vNFZRclBYdCtwY1hRSWpJdTQrZFdRMEhrMmlhcGhuRHBhN0Z0?= =?utf-8?B?TnA5ZkpWYmxWdWkzMDY0dDRjOXRXN0duL1NZV2NRaWxwZzZ4SjBPNUJNMkdB?= =?utf-8?B?QVkwYkI1UDdscFZWZHl2RVA5WjJJVlNnc0s4TGhIZmUwWm9Id3hSM0V4ZUlU?= =?utf-8?B?N1BzdDMveGkzMUZqQWZyWXlDeWUyeEF4ZWhacGlpd0RYZllnNWM3enhicEJx?= =?utf-8?B?U0NocTFRWUc2N0RDK2UyL3QvZVp1cXZvVWhpZy9FaDdsTDlaMWkwUWd2VUNM?= =?utf-8?B?cGZJNVdrSWhSZVhEck53RnF0VlZJSmtmZkJVaGxzemk3UGFsY3N6WHZCd055?= =?utf-8?B?SkVLRGVWdWRaN1NMVmswZEY4SDd3dHBSbk5kcGlXdlgvN2VMakpaNzRjd1BE?= =?utf-8?B?MS9ycW9vNm95aE1ZUkZ5WmxtclFyOEU1OE5BY2ZIZDVmYTBqMU9lQk8yQTdV?= =?utf-8?Q?7SxWJRfarocQxLDn2U=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1139;6:V3dJtDKbu9JqfNhIK+TSCi6zUFtKlIF33jt/tuyXTNdtQHl1V8GGweqIdO/ubZMYi5KFfvM6ZwNU4g8DwMNjRSCYeOMZQgnKv5CN7wfS0MovVTB/VETgti3SZvSX+tnaFPYr+xEsORCV2JMdH+axppibMcuryPJOIV8A7om6aaJfqHeelmnTGGwksO+7rf2ktJrsdSCcnLa7nSwOxYA/uLNuf5szBtc2UKRsUWNXrx0D8EprSeX2tSx2NVKSQNaX/M3/MdCTWyfhRhV7AwngdfFiMSIGIWEHp3EC3WipyvgGel16uhW+qiUANIiTz8R8zGwH5xnX7AdIXfnqG6DtWIb+U1SuTw4KparZnDFisfn+B6WS+KiGvuMw574wBzgbjLQHUtj586wedN6pi4krmam3x29P8YaJaZpqePcCtsPGM5xWxcTrbc3DKr4j0YNCj+DGeW7U4GrSzntw/Z/R+LVPOeY/uJhj1awYQ7NmzTw=;5:yaRKpyCerr1J38B/5CGIi+7qKfCIkA1tiNwOZjCAb0KzB9q2SnNe/qJtQ94DMqr+7+PWStUoiwiy+kCo071UHMspIpZ29Ob7QZQmaywvqr8xYrCPARAoOcxSC/8tIboCQEyJPMnjlJGqmw5TsKLyXA==;24:mXp3MYuaOUAyxpgPpPz6XLe57dkN76F4hVb3k1Z7d45MauOZusBSVbgDnSxyIp/xjO6kQm5ddB2nNdb9NcXtx/+RDSALGjKzxg+DgLlvDMs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1139;7:QL9wsYq663jsSy+va6VBxUasiV0kiNYl8pSCFh8t70t/2WzvyfuKbRdIV1SYA15c/MRu3BI8hANpqwwLMl6/sTnaBEkdgu5NLK8EYBteUo8bdz7oKXCK9iDIvaES/md7kKn1lh9d3pl2U2BnmhQyiU5dUg0hFwQVagsGB9CrRgQx1CMRlM5v2U//bNY/fXVxezTllp1011Gra9uVTE5xpDybAZQ84DFQ1yDiw28e0lUnYYZJXhgmC6XxpNx4FLGI4PdbDMJRIVA7YvE0N8ZvJJKfZmkNLje9Xzhq8Hei4zj0vA+IxGDBhEM6DrUGHtfT/J/hu6//U2zQbft3lRrg/A==;20:NXj42rmPYlrfslyjIZb+6RIsqmESMmo7VnjmK2cdJYaiKwnhVRYSLjAObDMVTXo7WItnuYQDNqgSxde90vpPwpyRsrlgwfQ4QkRDPmlMIRhHKkBhA9RFI86dLBA2iIA/2CR748P+StXv/9mWNINQAtXfIEHYIp860oM5SEfbn/ER36xgoSYCL5k3tjhN/ZT6mpbKK6rIQVyfWGBa4kueFXuvTp/37n7c+Y+2//x8nItmsx8e3o5NAorK4w7+e511 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2017 21:18:07.7791 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1139 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6852 Lines: 178 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. 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 cf0cbe8..6bc52d3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1429,6 +1429,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 d3ae99c..ce8cb1c 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 e4f7b25..9bfcb1f 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -419,6 +419,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)