From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753450AbcDZWqp (ORCPT ); Tue, 26 Apr 2016 18:46:45 -0400 Received: from mail-by2on0054.outbound.protection.outlook.com ([207.46.100.54]:55424 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752646AbcDZWqi (ORCPT ); Tue, 26 Apr 2016 18:46:38 -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: [RFC PATCH v1 07/18] x86: Extend the early_memmap support with additional attrs To: , , , , , , , , CC: Radim =?utf-8?b?S3LEjW3DocWZ?= , Arnd Bergmann , Jonathan Corbet , Matt Fleming , Joerg Roedel , "Konrad Rzeszutek Wilk" , Paolo Bonzini , "Ingo Molnar" , Borislav Petkov , "H. Peter Anvin" , Andrey Ryabinin , "Alexander Potapenko" , Thomas Gleixner , "Dmitry Vyukov" Date: Tue, 26 Apr 2016 17:46:27 -0500 Message-ID: <20160426224627.13079.90610.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20160426224508.13079.90373.stgit@tlendack-t1.amdoffice.net> References: <20160426224508.13079.90373.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: SN1PR12CA0016.namprd12.prod.outlook.com (10.162.96.154) To CY1PR1201MB1115.namprd12.prod.outlook.com (10.169.19.19) X-MS-Office365-Filtering-Correlation-Id: 063e571a-fd37-4c74-e5eb-08d36e249cec X-Microsoft-Exchange-Diagnostics: 1;CY1PR1201MB1115;2:Oo7vpO4MELReVQwve0qOA8QakxvePYF8eYEEyiRd2heI8E8WvOXw/ZvvAXL/3ciOBxpUyiICNlu2RT3ddSfLVvhTnPSsm9vZDykJK1wY7yvtf/DK3lNzXEjZ2B27ZKzE8IQK/UsVQeyDTgwiP6umlNn6qnodR/TWnSuRmC8fkDjRGIUMb6P10DDEMncpepGf;3:Zu0fecvKps5nMXI8HbAKuqjbA+yndwymoE1umFj232lip1wteqqCwVK+IgrNjN4XjHr5afML2g1lITfnuawpZ3gDI6kJEJ3s06fPS37L4aeM2F/qBEYm/hXxbpr0SE7Y;25:t8khr3pTJGCvdv1jjp7mXQzlszfh+hMsLVfHaoPa50VHinyDWYDtvT6og1ZAxw45potr9FHsf0C/TLP2oeCW/7PR7iOdfIi0VEJe0K9LcxSCAGDUd1pn0Mib4XoB4j1Q4rL44htGB5YdxE1tw2a85gBGI/yADg/O0xi2De7lv9iAMqd1K0RcdXA9VGilJ8xW6QP+TdAyEyF4zxWyTbiIigJLeCEQmzYdBR2TKEja/wKPUqdd5UV2H424dL6aRIaT2TqlaZ0lkEUq0TIijcXCmwFpzY5idS7oP8Jt3+i4azUUSXRC4FGJMBdOUYROaCZRtxNsJytr3Eq9AD72EHBnaQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR1201MB1115; X-Microsoft-Exchange-Diagnostics: 1;CY1PR1201MB1115;20:4AIY/eoiUCwQzhn/trCj2r4TuAHrM+RI04ViKiUErlRWPKAEwTwek+QrQqZXO5akD77e/6Zp3Wiq6gt7qyLNq4Xa/YoaOCi+7aYdyBlESm5EPAWWPB+J8YCLGvLJK0sEDRWjM98g/x3jfPUJmdsgeOCXnOR3V9TWBjYmewQ9hJemraHqBGgYt9tn7DykLjh+GrKQNaiTGPXfT+cIKqAQOn6Inm2dzPEih+uyyh7Anvh8s70kRd7U+bCu5vnDh/Xcnjp+pcQgDXjUUCaLEdpd2KdKKPNwHPF3IK+gkWX3RelRIePNAY/dr+hvCPo+H2wUkUX0HTNx2fzrgbOcvePCTu+SDDkk9xAVIt/Rt2FwWhVOZpNaRHQLg5KVFspiree1ZSX2MBWpKed1Hul2cc61kGvPe+3oAIOsm9/vnsZOt1udoy3D9OwI4J887n3GrUUz5jHL0ssmVwb6jvE+I65t+49XK57U57EmlqbzVDZoGIHEVODnXcwt4R4qvu6p9Ew0;4:eG+DhePON7UWrpGYXRYUWoAsn2jinN8bWiuq7KcYf5ESeZ9haH87IauxwAOQ59A88g2ZSRzL7rvz5X3tGpeujYod9BYPx1q8GqDuX7OkJP8vTaP7SIia+EgZXcjFras3M7x+ny+qUCvrd/EmL7fjWus3oosgDgbsc5iokhlYql/bdyIvoQml+Hp8t4Gs+uif3e9OSpMMWlLmB2P6PVc0g0ugHG0wQIoHAyzE2I3HkuNFYzI5Abi8kkDzGXrW0OYn68qPocwxMEnMRsQQ0ZlPLNNfss3NjungvhsCZst0nWAMuL8XIXiezizII31znHE2tleDuzAFRa7dXFAfsq8CJxKrdesUCm7Fy+MVOGpb7KZgxT/s2nfKlB9lYhwJbqAdo3bdUK87LfCO2kt6iscOXkgFiivbCsNYZDDcgPoBK3M= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(9101521072)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:CY1PR1201MB1115;BCL:0;PCL:0;RULEID:;SRVR:CY1PR1201MB1115; X-Forefront-PRVS: 0924C6A0D5 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(92566002)(77096005)(66066001)(103116003)(33646002)(2906002)(47776003)(189998001)(5008740100001)(6116002)(586003)(2950100001)(97746001)(5001770100001)(23676002)(4001350100001)(1076002)(229853001)(5004730100002)(54356999)(50986999)(1096002)(42186005)(230700001)(9686002)(53416004)(86362001)(81166005)(76176999)(19580405001)(4326007)(19580395003)(50466002)(2201001)(71626007)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR1201MB1115;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTFQUjEyMDFNQjExMTU7MjM6T0FMWXFlaytkaW1oZ1g3Z2I0TUIwOVU2?= =?utf-8?B?QmU0ck9NWlhNZFVockNvWjh5MmxjR0dyc1lrbGlkVnhYTkhSTDRvTzZjODEy?= =?utf-8?B?QytVTzB3a3c0ZS9QUkJUTHkwWW5SVDFSSXRna0J4NnVobm1RSjdGRThveGVS?= =?utf-8?B?UXdBcTZVeGFxWXExUWFweXQ3UUprUXdpdi8vWFo0eEc4QlkxM1dPL2N4N0hC?= =?utf-8?B?NGlJbVF1b0ZySVAvR0h1dHl3cXU0SVNwTE5GWDZzRzBHODdleUs1L0wxcUdT?= =?utf-8?B?b1JnSWg1VkZhNzlTTlhHWnliTFJ2NzZaWHFkcFIrWU1xSHJ4b3VibmwwU0RG?= =?utf-8?B?VXZPUkdHMFFqRXlBZnM5VjBrdWZtZ2xLVldLZUxiNnBnUUd2dU00cXJWdnNK?= =?utf-8?B?RDJiRzdKNzVWZjJ6NWtaQnB1R2ZJTzltU1hrYWNaQWJycFJvTVlJU1VsVElw?= =?utf-8?B?dktsRWwxMGFzNkN1RE82VmVQTnBXbjEvUVA5czlKTythVG02a3VBUWJ4RmVy?= =?utf-8?B?ZUtFWlRyUVBqSFBaR2xPMzNrUnZzdHJTVUhtNVNXMGxrU2ZweFJTWmxxTFlI?= =?utf-8?B?R3Z0M0ZFNHlsOVZKSnVVNUwvNkJJVzVEQ0JaNkxxUWVsTklyTkRuZW4xVDFU?= =?utf-8?B?OE9BbmJaemdzQnJjYnRmcVpwSnA0UnNvbTdyRkRXN3pBTXhqSXpSZXRwWFhl?= =?utf-8?B?dTBQd2J3TFBPK3QrclFRMFRaU2Fmbkh2M2NaTVlUUHcvSkpUK2xlVXFHMW5r?= =?utf-8?B?Rzh3UGVEL2tWaTdPRElSUU1EVzZRV28reE1xVlM3WGVxRDJpZHVtdXk0SDQ0?= =?utf-8?B?SVhiTFhZZGtzTTRPbFZPbmlEZkhWaHN1aHFGUjEzbFRPUXhHdWgwQTRyaDNz?= =?utf-8?B?WGdhWlFSRUNMOHJLYW80U2thS0FoWk1mL0o2aTE2SFR2QUFYakg0N1N6QTFn?= =?utf-8?B?aDZ0c1JEOVREMFZ6WWprVHRaVlY1UWV5c2pBeUY5SEIrMVpreGJZRE0xTTlQ?= =?utf-8?B?b2w5MkJINW82N290Q3Z4VjBvdFA5R0hId3ZrYUdZVzNGTmRacHFIL24rSmNu?= =?utf-8?B?WmV4clFDd0ZSRlQybnl1ZUxHZ0tYekJJcm5FaTlYMGFDZnRYL0J1djIwM0JH?= =?utf-8?B?TkdDWExxdXZha1IrelBPbWc5WWZROVd3SGlCWmVXMWZnWXA5QUNBUDk1NTgy?= =?utf-8?B?R3B2UEZCdlZHYnhxaTVXNEI1SWpsV3pvaGtpTXl4OHlkMFJzZ3VZSVZJRkZt?= =?utf-8?B?Yk02WnAzWGtsSHVHSkd1aHhyeER1ZUFzSi9Ed0dJMTRMR2Y0a1Btak8rSzhk?= =?utf-8?B?STF3em9qb1pxbHF1eU5oV2N6bXhhSkVkVU9sNXltcm92dTBVM1JHRjByalk2?= =?utf-8?B?N011K1E4QlVKUG5tQWJFbGMrZFR4SitUSS9XRHlSL3c9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR1201MB1115;5:01C9h96BZn6VnNlIFadK6UkjIhxUyXPobaUCP9KkJ3hYoxtAbJmd9Pdft9rbBRqdUVuyE9UaGBUGBqHllYs20PICIYfv7MBNWjAB9ShrKyDXEy5DOeYoPUo2wJJjOeJBLDxWIiDJ2NTSS+qgRfqBHA==;24:ethl5NYpLSrJAWjixA3Kbrl013fGdSCHLm9v+mm5S1S076Sko9lgLxx2oiSvD8uKDhoAYVSmkN5bC/Ky2NaXy96dPYlypyM/oBwQeWz+99w=;7:2piXeHlQIgv1KsyQg5c049QUBUusOuOKxBcIEe6C8c13jvup35kb40iA4yY/UZjq+HFniGgdew0nbs0kshAIeItA9z8R6emjZWCYiK04x8Nv2r3ogxgfmi04rrY4Y3SAcpJMrzomt0dWSmpn6nIPNdraOhvHswl21IpelOx89/Q=;20:wYzSfYjEtCuDv11CfI3t4tyq2RDHTK132QbhARl2Eil4lprckar3/wTPgloVbr1CmKeCPtJbjqB1Wa66b5gE+IN7vKWNVFz+NOE8yCmOSZaCFIvBJD/aMf90Kx3FSmEa5yCbNhf3kXJUjMkhN8nZhSoUofCbDBUY7QY5OhT4jv1EaeeKPXOYdrtUvICxak8ehRx0pMbm2OhPrPI7knBp0QA/uC7Tjt63PCsppMb/9PsHmowYUwh+DLMuKDKLkmSu X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Apr 2016 22:46:30.9395 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR1201MB1115 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add to the early_memmap support to be able to specify encrypted and un-encrypted 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/include/asm/fixmap.h | 9 +++++++++ arch/x86/include/asm/pgtable_types.h | 8 ++++++++ arch/x86/mm/ioremap.c | 28 ++++++++++++++++++++++++++++ include/asm-generic/early_ioremap.h | 2 ++ mm/early_ioremap.c | 15 +++++++++++++++ 5 files changed, 62 insertions(+) diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 83e91f0..4d41878 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h @@ -160,6 +160,15 @@ static inline void __set_fixmap(enum fixed_addresses idx, */ #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE +void __init *early_memremap_enc(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_enc_wp(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_dec(resource_size_t phys_addr, + unsigned long size); +void __init *early_memremap_dec_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 fda7877..6291248 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -154,6 +154,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 | \ @@ -182,6 +183,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) @@ -196,6 +198,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_DEC (__PAGE_KERNEL) +#define __PAGE_KERNEL_DEC_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 77dadf5..14c7ed5 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -420,6 +420,34 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr) iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK)); } +/* Remap memory with encryption */ +void __init *early_memremap_enc(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 */ +void __init *early_memremap_enc_wp(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC_WP); +} + +/* Remap memory without encryption */ +void __init *early_memremap_dec(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_DEC); +} + +/* Remap memory without encryption and write-protected */ +void __init *early_memremap_dec_wp(resource_size_t phys_addr, + unsigned long size) +{ + return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_DEC_WP); +} + 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..d71b98b 100644 --- a/mm/early_ioremap.c +++ b/mm/early_ioremap.c @@ -226,6 +226,14 @@ early_memremap_ro(resource_size_t phys_addr, unsigned long size) } #endif +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)); +} + #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) @@ -267,6 +275,13 @@ early_memremap_ro(resource_size_t phys_addr, unsigned long size) return (void *)phys_addr; } +void __init * +early_memremap_prot(resource_size_t phys_addr, unsigned long size, + unsigned long prot_val) +{ + return (void *)phys_addr; +} + void __init early_iounmap(void __iomem *addr, unsigned long size) { }