From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932859AbdBPPvu (ORCPT ); Thu, 16 Feb 2017 10:51:50 -0500 Received: from mail-sn1nam02on0086.outbound.protection.outlook.com ([104.47.36.86]:62656 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932359AbdBPPoQ (ORCPT ); Thu, 16 Feb 2017 10:44:16 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; From: Tom Lendacky Subject: [RFC PATCH v4 08/28] x86: Extend the 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 , Brijesh Singh , Ingo Molnar , Alexander Potapenko , Andy Lutomirski , "H. Peter Anvin" , Borislav Petkov , Andrey Ryabinin , Thomas Gleixner , Larry Woodman , Dmitry Vyukov Date: Thu, 16 Feb 2017 09:43:48 -0600 Message-ID: <20170216154348.19244.11884.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170216154158.19244.66630.stgit@tlendack-t1.amdoffice.net> References: <20170216154158.19244.66630.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: DM5PR15CA0023.namprd15.prod.outlook.com (10.173.207.161) To CY4PR12MB1143.namprd12.prod.outlook.com (10.168.164.135) X-MS-Office365-Filtering-Correlation-Id: bee98155-3bf8-4d97-bdc3-08d456829ad9 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:CY4PR12MB1143; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1143;3:71wbfkWLC9YGsSOSd09Q2fmmUYuGQXE5uY0QlKvMGDNOb1ViBGDhc/r3BPddS1yPvyjr0yzYTydt4fIRTZ725smti6n0z6HkNsjDU/EuNEr36zcghio710lMViPOtuT7ytqlMkBrPHAkGer2d2k1cQLtj6C1WSn4eps4MWjnfs7j8m8MOOtOxrKEiuBILtyRlmS5VFf48CPEcRZLLZ1AePiupEId4Gn/WD9/9pMto35OHSDRpPsqO+CU3nz/aKN6tHXOwS1RzmLLWwaNGgZxz8xMzRkB8yFQJvngDLwHR9I=;25:LxGRQT0NcuvaX9WIqjpK0MChjWOIkhaZgRvm3uf9+f29VQLGiTDuG8e1MqGkI4XK4xlsGVMi0gFDX/xfWgA97STSDhSV9jeQ5Q5Y5Cxu3dLYRepOhkaJN7/cTfklNK5tH6vM/eVUgUW53gwbrccFSKwqyHzdTXqO6cOA8cvpyd8rPsrm8+MPPfqFnGiYOZy8C3kzBRsIKxwa2kLii757hFgmle03w1PziyOZVH6ZQJiiK0xlSGiNIb1dgcOv6t88wguDGKcCkGZOETjVvCSb2PXrffgm0Yskxa6CZT+8iLN748z8P0SFLjrBLE/2qH2RXZWUW0eitaM9/C88Ilx3ihLH3IxlONmdYM96NNyqtsi3eb+oAF4euLOADwTVxJiY8vL2CDl3gSLji1ZlHtEVcPGti9VSSym08q+eeJmb9yV30aDCjLkQr3NYRmlCima4+7FgabH6MUfgQUzTZ6kU8Q== X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1143;31:gQUefmfQz2XRZSs5/8iK5rbNITHRSq/kSAFmB9vELeC38KVoGmZGT461JEGaYGmXvScr4VCu3T7JK+KrZMlY/DX6ETaEY9y06EWdHWzcppOeQgz98fqfRujOCe1bbjIyl+bxC9z6fTRD0W98kxaUZITjTHA6KZYT3ZA3VRSZsSJl9y3z/NoY+ytjBW2/ipiHlHrZTqNKa/eRjr6BpBdItdSPno5ycuBrusDt2d8akbU=;20:xBWi8MloPaAPEDL9AiM9Tn3UcsUxkchs18FOwPsy2bXE55l7XSvmeWAV2yCthSXR69X5aompexjDwTaopF529/zw3ZBPY9jyP45HCxD1/NTP8kXUGRSfDZMctzucZ6rwz+EEQdseW6e7kg9zLuhxe203iN5pkMj1eEmFkRLiJTWpev3cs2r4u8/faKVZWFEZRPwPWgwfXJmDU9b0Cd3XNOnQRPm4XXt71bnFdu3Fo01OreaRy12PlzGtCNdh8fWWWwSO6BWpfiiUZaqpyuJ7nQYPjK6SgSY9eaYs42jy6tOODvkxGNI3W2xu1fcYpdrlqQDEBQYPryIbJQJqXOPwAeOQLlZjh7H1ojKXkdBiQRxYhWpR4en5SAsJc6qD0lUfMNYY7sD9GfcRW7wVm9EUxIjzShcsVD7amTtvPGtgmdLTvVCCUOx3vT33rTwoh23dun3uxwIFpZPqtA5vOT6r22RDVzw7gBIPI8LK+X56WGt+eoFkNceOO16A4/5GPx1u X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6055026)(6041248)(20161123560025)(20161123555025)(20161123558025)(20161123562025)(20161123564025)(6072148);SRVR:CY4PR12MB1143;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1143; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1143;4:jpdRvSqLgynWhYbaE3+oxaDMXKLq6CfTon52QzNsHVspjbGC5zFaUG09n1VkeNQPRvnt9wjxbvG0poZtv5FVIhoWQyTBUanQlBPbuuFCodBuqzYOlhX27AfDrHQ6GuMsywRceZuRAnGqyojTGMXLsTj8V7MrcjwBLuP/qgNwnTKlWtG5K+8IdtZEzAzFwkzm1KaEYy+ZVaZwLiPV/BoVvdA4gHWzWHl9XEHB2c6HsX2MwGq5VTqde7WUATqjJU7gx/c+65lARfWdVC1aUY2tFhnHHmdLNDReSD5/QzY8unnOpNixICTRpc5dNa8tiRjljh35RhFbtGbpSB/9OsRhn0lpkqwncAvSP3JokL4a3cCHomXKfmXcrf4V9b7am5FqrLvytIT18k1ncDa6dtN8REJHcONpx/sc61moCV8QGW23N1npWHeVHOY50P5jXPJ13WqjHJHy8yBkmWgxIRDg/VXUeRnMxuKQ1F362G1RBCSfvm/Ye/rPHtNmmoRL4COD8RMZ2GRQOhuom0L4aGLGcMnVQUz8NDo5+0yGg+DrHHrGxRB5H+q7BGJcx1cBoEwrImKopkCF4HG1gcHI2wlQobmm76eWJKpHvkruhGlywJ4TOIz8epw+WN9DV+bGImlddZvLgaljObt7XUX20RQ5i2viGqN+bG7WbWatox07IeE= X-Forefront-PRVS: 0220D4B98D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(7916002)(39860400002)(39840400002)(39450400003)(39850400002)(39410400002)(199003)(189002)(101416001)(7736002)(83506001)(76176999)(2950100002)(50986999)(7416002)(103116003)(81156014)(81166006)(5660300001)(97746001)(389900003)(54906002)(55016002)(33646002)(9686003)(8676002)(54356999)(305945005)(6116002)(2906002)(50466002)(92566002)(189998001)(25786008)(23676002)(47776003)(4001350100001)(66066001)(6506006)(38730400002)(42186005)(53936002)(69596002)(2201001)(230700001)(3846002)(86362001)(4326007)(1076002)(105586002)(53416004)(97736004)(106356001)(68736007)(71626007)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1143;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQzOzIzOmN5UlFtdHJXUGt0OWk2UUl3Sk9odnhYWVZI?= =?utf-8?B?WkZoTDJWNEhKcHpnY1d4eHd4ZTVSZnhRRFlsS0xFZzFmbjRKVUZmMkE3L2Vh?= =?utf-8?B?RVRNTXRZSDc3cWQrNWZMdHd0R3JxdUQwZjhRR0RyN0RPOXNrVDlEM2V3ZnV0?= =?utf-8?B?L1d4ck5LK2I0am5GZ1ZrYkdDenJ5YzhCc29SS3E0bFhOYWYyRlFtZlE3YWl3?= =?utf-8?B?WGhoYnJyZlFsTDgwOUQrUUpWczU0M0JBZW5XUDhHTEw1c2ZoUDhmS09CYWFP?= =?utf-8?B?NndTMkhFTHpybE8wWit5VlY0ci96azNYM0kva0thR1RMQ0FHN0NHaUR2d3Ns?= =?utf-8?B?TnR2REpTVmFML3RSY0VPMTNpZDhkODlFS3NrcGxncW45ZS8ybzJYZTFneFMx?= =?utf-8?B?VWd0anRwemV5bDdYK3ZVN2tnRytmTU5lci8vUzFxczRwcUo2Q056dWNoQVhF?= =?utf-8?B?SW9IdWVyWkcyR0Z3QitaMUJJeWRjTE92eTlYMUVQNnBUTkRQSmFPNDlvRTc2?= =?utf-8?B?U1VWcWw5V1YzZlRwd1g4K0hDeDUvV0tzT2tOMW1VeU9VYTNWNFBLRlFra1E4?= =?utf-8?B?VmZSQXB2WVJ4RmZ3RU1WaGJjZUdWdkpVcWo0VWtrUi84SnF1NVcyam5uakVw?= =?utf-8?B?aWVZYXdSNWVnMHNBbzdyR0h3RVVPakhsbmdibTAyZk13U3VoV2thbWJIYW5a?= =?utf-8?B?R2IrTTd2bzBnaGxHbVZMejFHQUZrYXFtQkRBbUNBVmZsOE95alZ0Y2JGb3Nv?= =?utf-8?B?OXhnS2s0NzZVRW9GWnh5bW5tamZmUit1bXNrVmU2U2V1Y1A5VXJiZUdWSFgz?= =?utf-8?B?Tzc3c0VTT0NhV0dZZnJ4ZkhWMWpBd09vOXdXaUt1cG9pNHo2eFpFN3ZmL3lP?= =?utf-8?B?QWVudWJSVFM0Y2Z3dzVyb0MwRTV1SnFJd1BzK0poM2JXdytnSFJTdjZUWVdP?= =?utf-8?B?ZWF0VHp4Zy9NNE01dG9YVDZmQ0gzVnp0V2FSc0tmdWtOUFZmbytyaEhReWw3?= =?utf-8?B?a1h0UWoyNnpoZFZIT0lETUVHS3NxWlVsS09veTBnTzBTa2VBb3FJUVpSa3lB?= =?utf-8?B?c0xKSFhSYmJ0eWczeDJZMWVHTUUrb0ZFNndDWmovMFppay9pRWJaUzVaUHJK?= =?utf-8?B?ajh1RVJTanRuVXg5WThRNzBiRHdGTkIrQ09wQnU4blhEZFM3VWJ5aWRDQy9l?= =?utf-8?B?TmFmYWlLRzlrSWZKTmFxeDRrWkNqSVFhRG0vQXRmUjZyZGgyVndFRmRWUVVN?= =?utf-8?B?cXlrVTJkU3JJTk1yaytXR2wzOTlsdEdyemN4U1NtV0pxbDc2SUNJM1JweG0w?= =?utf-8?B?RVZHMHphTXVmYktWb3BVdVd2dmZHZlhvQnp3RnJ5ZEl5QmlQM1RKVk9SSUFI?= =?utf-8?B?bDl0bzJjdDhva1AxVXUxUytDamNUdkRWVS9VT1lmTDZldE5NVHhzOENvVnZ2?= =?utf-8?B?YkZhSS9rVS9hL3NDVmN3K0FTenRCeS9jdThZbmR6bE5FTGdoT05VTVhzWlJw?= =?utf-8?B?Z0JpL3RwM3EvWi9FYzJGT0NxL3RZcHlTd0E3ZXBmMk9xRU1BNnQzVXFHSVIx?= =?utf-8?B?OGs5THhiNExPSUFvLzVhcHFLbUZNZE1LcWcwUnlYcEdLMFdzaDlPNFBvT0xv?= =?utf-8?B?T1UzeHUwdHF0QTBQQmxyTnhiOGpiKzRaUGRxWDVrcU5BZFBCUEg0WmNmQ3l1?= =?utf-8?B?dVRUbHN0Q2VUeVVwMW1uM3UwVFQwbUR2VWMydUliaWNnU29Qc2praUtCVlJX?= =?utf-8?B?L0JqSDNPaE1IQ3FoZTZ2VUVVZlhKQVFoTVB3Z2MvdW9OZ2ZXazNvcVpFVVhQ?= =?utf-8?B?UnhlN1M2bEUrYTVaQWNvYlBYajdLN2d0a1VjR283VFdFRmZlQVJwWVhKQnQv?= =?utf-8?Q?ikVu/p11mQMqA5Wscc6v1wFyhtAo///i?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1143;6:EBDkcVOUu5SfFsQaTPReFc4UBPO8yXxn+s12G1OAHFW8JFyoQ4vS86FJFqnOlz9CJZCBWu1RTz5KlhO2VbCEZyjg2l4NliEydkj27pwVZQrG+6wpBaK+pYRUR/HjpOaivODl751AIoPm5658nIhZL4HYQrJr0Utp0RFsGxrALchtIAj3i9qtpGaAucNpLxGQioq2x7wkogFQ1LLR15EIrPJbW4dc9KQFzC97bZsNzHVvdfYYI3d8JIjkGt0+YI+SsuIiSbCMJlc4miRzw+JtcmY22yJq0LR9TieEK8SfqfxNX1JEHMesksO8PciD3IhvdpvaqK4Jiavo8hokbZl0XZrp/mDMhgxivWTCR3UVvPZOYCFCK/jZnSOzEvT8BVPKhD5o4aEZClKD+O6kvipRMCgQd4MtrPvRSy7RZ6x00fI=;5:5HrOCJ1Oz8VtiwA2dod0GP+K73eEbPXAZuTZySRPgB0VxjipN4vSJRrlNrTcLCnixbqTr8wjJWFOXIbISOz+fLAe1ClJ+sIaLExLITbadpA3q0Xeqa0Sxml7QPlhQvBjv+Bjg91GpWi4uQrY25nLEg==;24:AA7eZCYLic/oI2/DKXwgptNr2qVWFCtnZJMKZpUJOn5F+I4UH8sKHvNf5k4hzjdQ37djvm35bpW7f+9DLvc8OF07xkTUV6kKZsnq7HCX9PI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1143;7:e6bdVOyL9miQntk/lbKY09IIdP3t/Jlus+zgQlYw/n3l9RTew8MO3OgCFkkg67kGkizSogBRYKXhigxVXxcZ7izbR3FL2je7Sa/ncXee5jp5IhsBNTK65A2pt+gO3fNyDdQljPLMG16h2WkD4pLI+ozEZfFPXj/hKnUdNqc45TD3adMYkjq5N/1lVlo/Wq3GHvuznwJrh11q186ZgxKIlRfwuLETnP20jStDFh9vnBIaAiI7nY0zKYeor/tRCy8US9ZNYp7TqlV26rSy4lvUlepbiq9I/gZjii+gacBN2TG0EVqGZYmdEIqZGcoDKHr9aaJem1+UOIZA4H7qiwrMng==;20:ShApHLGlWWjpiZXnKQvd0IC3ZR9i2pZaIooKzKdXmq35HUJNWmnj8WHgxhAqnocukUkHdPmjv7gwVOs8z0kE4U+9wiBxS/l44qltHlwvBo95mOOtp9PolHjuwbHkIXi66WHyS3YXW63SxGVr+ceFVvH5SG18MN29iPZ9ThwXWO50lZSWoGmw1i47L4rn2RekLSfZKLLio92LHdZJTjEXTnuqiPaJhbiP7t3gWH4lKcynPnCJENiq9qg3vF7apT6Y X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2017 15:43:49.8041 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1143 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add to the 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 a3b8c71..581eae4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1417,6 +1417,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 83e91f0..8233373 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -160,6 +160,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 500fc60..f00e70f 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 c43b6b3..2385e70 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)