From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751875AbdCAAa0 (ORCPT ); Tue, 28 Feb 2017 19:30:26 -0500 Received: from mail-bn3nam01on0053.outbound.protection.outlook.com ([104.47.33.53]:38124 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751451AbdCAA3z (ORCPT ); Tue, 28 Feb 2017 19:29:55 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Subject: Re: [RFC PATCH v4 16/28] x86: Add support for changing memory encryption attribute To: Borislav Petkov References: <20170216154158.19244.66630.stgit@tlendack-t1.amdoffice.net> <20170216154535.19244.6294.stgit@tlendack-t1.amdoffice.net> <20170222185215.atbntnyw7252kkbk@pd.tnic> CC: , , , , , , , , , Rik van Riel , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , 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" , Andrey Ryabinin , "Thomas Gleixner" , Larry Woodman , "Dmitry Vyukov" From: Tom Lendacky Message-ID: <409ec9f1-896d-a9f0-0e4c-4d102cbf86cf@amd.com> Date: Tue, 28 Feb 2017 16:46:15 -0600 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20170222185215.atbntnyw7252kkbk@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BY2PR11CA0037.namprd11.prod.outlook.com (10.163.150.47) To BN6PR12MB1137.namprd12.prod.outlook.com (10.168.226.139) X-MS-Office365-Filtering-Correlation-Id: 6e6c43e6-61de-4c2b-ef70-08d4602b9efa X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:BN6PR12MB1137; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;3:fxCeqQyzwjZ45rtlMoJo57fFaG22XxSjSkULX2OWxP/CeFh1tpcJDPHdmWZqEYJ7MP1h5yzw5Yd42u+WVg6ziPoh83TaGSfoZUwHtfUXfckR9isJxRwVxMEok2tPD4VCb9n4GUs1ahIUronUSQ6u38BCH+qCeyXUYnkttZwhs1hflaeNqbIWB50eLpu1ZfO8X6BQpqm9uN5kW5zflO9iJoC+cO+K07wyHbb/eBau9ThfhV0TG4Nn/YTrUR6TaRTLc34Ih4x9e2i/UZhB0l2Up1CynUp+d16ILHcrzCmQjSs=;25:eBLerHSHxaVkU+YpmyEkmFgRuaivwZ5xzKVKtljNrvITfEmJKIXDR7bTTR6y+0mP055E384UZU9fb6J0pbyM7u7JvnBcb9SEcdv83MkddKmMcD7fNHtlV0F0OwL6F0pzrIDuD/r8YRFBZbXCGjBSO0//1M7gvx84gGBqdnd6Ggs7Vzssym4j1Z34Wkam0znapCEIrFsjvKn5l/Zg0CIsY6sFXxGfcIwmJsJF46nsTGg8CAg6d1ewqp+oJYPgRsJoWZeyc0/BcxqTDoBMyisghznK0J4OO0u/0G0J87MK7B0Q4mi5BqLAOYV19v3hbpV4GSSkI0hET5e41Om5t+0ZZki0hK0Hvi3qrbJbUZlzenvgVrSq4cav75GqFBJ7114mxwUPfTv8HyDRxGz2OMoY6WT1FNYePkvHk24eJmwA+ejEUiLwfl8cjPZ9y5YTnLUshlENYXTduN4IT2XGj/gBFw== X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;31:Itv1xh4WCoBD+9Yo7qu5U8P2pEUoIe3pB7wc61VYQLt6xV8gQEtGezS8ucrF21RpYZKCQrDYdgW46W8fEQqOl351RPAhY23bk4dbBIDi5GxztImzlD3xkw5WX/Ciebo9Rp321ie9vVEMpUVtYjp6ccudMApZJpy7wsQ7oUwj5i2TUU4aYO0P0rxiBY66d4+Rh8Y13SHLdZWhPh78+1UB6Dl4h6qa85RR9RZo8QCv7ViVvcrpfeWKZe4QWRxF5k95;20:JZg5tx6lBXL+Ss2bK8G1gqeE0KrDdr0QYXaVSkSha4qCzWo+Iaz6nz4Ju5Zf/O/Qa716hBboNswh7iBVrz+bEK4Bo8FiNoaM5m6QFVvP/tDc7THIHkRhQ1I8LrrxCXzIGBQGPyqPfH6dKgqXx3GmLhFM8jrqFl/q+I4xnMTZUw/bh4nq7bCywjoDz8NfBjiyZ831ULA32OqWAJDcmWOkRhj6vMc8rKR5h8m8W6HdSH7ajjlurgJerJEKphux/ejMjNQHRQLbxCadIwam6dyShbUFI/ml5nGJdaRokwCbgWq3u88+BL/NJyui+WoR9ydIjZX3LFCNM+Odm6GOij8nftLeBk5fY+jArgDehKqNx0F50uzweJ+RqJ+m86wvFi+BZPmuQPswoIbKozudHGhf9Dx6gJn2Ai/TbbFirna5qp77O/zcC9QzacztQLOYTlw2l4AxLtSTfbrW+WFVYV8YSck9tgiAR3g031Dp9726Ri5nxQSx2G0BXb4emw3IZyVu 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)(8121501046)(5005006)(3002001)(10201501046)(6055026)(6041248)(20161123558025)(20161123564025)(20161123555025)(20161123560025)(20161123562025)(6072148);SRVR:BN6PR12MB1137;BCL:0;PCL:0;RULEID:;SRVR:BN6PR12MB1137; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;4:QmoTU4LXuhQLBiTjMxWi4fIXonHTGwZiuVN/cdTJZCvzVZu75NV2JEQjPi6IcxHDuZ7JaEs0kXtOwAeCEPZERCcoBjFsoef+la+MafTfa6BdFW7TVQciomwUQ1Qck1A0T7bfRKYEkPCIJkP0dte6tMI0ooom47gWp8RxBkSS3d2MC/i3wt7sVT9iEdIKeW9FS+SOJXZmSaLaYzegGsVTJjDmOCryHzMNY3FcVSn99ZZIrIkGNFmjadAOz5m/jUFgSTrk1ggyv7JtQWHvuFWjfg4KaIBMYX/TiC8oCSa1bR33nd8WIMhhfnVOAbvmgPMvpHbDtFgsdqcJIAP0PbX/uejflsSJegkCBUIqZsCKBL2gZSMwO/N8S+Gv7KlfmGyJtQTUWk4K09bZp84GIEL7oLbXIMS69fYSkqZ5aGqDUVOZjRQG7xJbAY9Cl7bUZwyXJBIyCuYTbXJ/kmjskvWprj8PZqn4Kwa6gzv136yoXTpeulphJlcprGZe5G2yKJf5r/ehJgZL7VqZ72cvwkiVPj/+sCExhBCJm4XccApXxDBy8eb4kH4abTrVzY1/ViBTHcZgWFxO0nu1xr9gmYqNA59G80/uxA3De391XDsWZOleKfwGqhz/1bg5nMviOYirhEuduLyK8SCJPeQ9vEJ9Pp7tdOhLNqy+s1LF7inbClM= X-Forefront-PRVS: 0232B30BBC X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(7916002)(39850400002)(39450400003)(39840400002)(39860400002)(39410400002)(199003)(377454003)(189002)(24454002)(66066001)(65806001)(65956001)(90366009)(77096006)(106356001)(101416001)(229853002)(54356999)(76176999)(47776003)(86362001)(6666003)(25786008)(50986999)(105586002)(31686004)(31696002)(189998001)(5660300001)(6916009)(65826007)(42186005)(4326008)(4001350100001)(97736004)(92566002)(33646002)(54906002)(2950100002)(81166006)(8676002)(6486002)(81156014)(2906002)(53546006)(110136004)(6246003)(38730400002)(36756003)(53936002)(7736002)(3846002)(64126003)(23676002)(83506001)(6116002)(50466002)(7416002)(230700001)(305945005)(68736007)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1137;H:[10.236.64.179];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM3OzIzOmIycGhaM3pnTWJMeWw4ZzhiM1FVRnN1U3pE?= =?utf-8?B?dXhSQmF6d1YzM3lhM2xlY3JxUURHRkhGMCtYdktkL2xUZDlNSS9jci9PUkp0?= =?utf-8?B?bm1EQU0rT2IzYXlweTNkbXVlQlZTZkkxNElwMDlGbDQrNlh3UEdHbTBOc2FI?= =?utf-8?B?VHg5eFdXaEprcFlzYmZaRUxFK3hTNUNlZy9jK0ZnV2MrVDA2MWtEVzhubXVn?= =?utf-8?B?S3NVeE9TZk1ObndZL1pTc2VhemFhK2xkcEV2aVJDcVRseXlxMC9ZQkRkckxr?= =?utf-8?B?djFXUm1ZeGNMS0l6TUVvWHVjcyt5MnVIWkI1WTFqMlVkUVVIYkNFaUpDTVZn?= =?utf-8?B?Y256SjJRUDlPbW5LeHZMUEhnYWwrTW8vNTl3NGdBbTZmQ3liQkZSNG5xWEtj?= =?utf-8?B?MzFFclJhZGZUai9tUlp6Z1E2WVFySk80REkwbTB6QzlGUnppN3FHNTZ6Tkp4?= =?utf-8?B?L0pBZks0Zjl3aFpyOVRYTUM2ZkZFQUJ2RWhCUU1vVzhHK0tCU0EzdWpFbXAx?= =?utf-8?B?MlFEZXVLTUV6TTJVOGtaNHJNR0RnajJmM0Q1WU0velR4SzF6MWZULzZtN3oz?= =?utf-8?B?bU9WM21GNUx6NFdPRVZKV001NlpYMHV2TWZ1QXVYbFZEWmdoNEpqdmx6ZDF1?= =?utf-8?B?NGY4NU1nVU9PT28zQlhOd0Y4Qk1NNDhITzcxRTJON3c2STkrVnJ6VlZ6UExK?= =?utf-8?B?NGF0VGJTU29lUVlQL01UazZsVk1GdzdITnV0R0l6c25TeUZjSWd6aW1hQjFt?= =?utf-8?B?S1lJS2h1NEZIRU9HNTVNaWt6cGU5anpUazI5cGVpSmFDdUNEQ1NnWmQwM2ht?= =?utf-8?B?WDhoWk1MSzZLc2YxazZJWU1tV0Y4ZnNyWjA4VWVnbUxCbldSVGlZWXoxYzd2?= =?utf-8?B?VVN3KzF5aTdyY3RBejRyOTd1SWtuWThEN0ZxQnM3M3FpUk1jTTI3aS8rS3oy?= =?utf-8?B?bjBPSHRhWkN6em5Tb0lET2xYeE91d3FxajVMZC8vUnozRURTTXk2ZGJ6RDd6?= =?utf-8?B?NzBza1pxbFkxd3RDaVlJcGF4d0g1N3poSE9WbXFRU2J3Z3Ntb0V5anhXOXND?= =?utf-8?B?aVJldjU3My94NU13R2R2emVMMXd5MUsrN2hZNnJtby83VCt4TWFaUm5yLzMx?= =?utf-8?B?WGpNNWg0eDJhRG1HK3F4UVJkOWluVDhiNE03UTR6VW1qTWl0SGdXRzNnVW95?= =?utf-8?B?VEFqajVJQ2g3REc2a0wrdVFFTzJxVXdCMmFtdnJHNDBaaW5tU2dNcHdjbnZZ?= =?utf-8?B?WEIwVnN3TndPb2JIek9XS01KdUloaEk4TU53QzhObzlUNnpIWmorcEdBSHVv?= =?utf-8?B?MnpYcjNrSWRmL244YWkyRXZTc3Z1WWI3RmQ4YWFRa2E1cVRTNmN2QTBjUDJz?= =?utf-8?B?TGlVek8vell6c1dIL0xQL1ZOT2Q1UU5yVVhuZnhsL1paSS90ZDVtaU43dWcy?= =?utf-8?B?eFVHZEc4Q28rOS8yYWxzOHByOHc2U2JUYTVURUM2blBxbW1TVmp2WGdnU21a?= =?utf-8?B?dGVIM1VkZnRkRWlYUS9LYWJBQ2dJbnJkcEVPenhKdUs1T1NCMGVHenh0akFF?= =?utf-8?B?U2h0Rmh4ZWV0cUtCSzY2QmV6cTBqWlRET1JnMjFTSmpSUHFhZmc4eHNhZWhn?= =?utf-8?B?eWxMSHNqUzNkbE14a1NDVEFZbkpYZWtDK1JHdjUwSjNvbnVXaXI4V0ZXMExU?= =?utf-8?B?dkZSbEhDVCtsbVZwdUVsQzdNUnUxd3pwVW5RNDZ2N3N1Qk9kUk9zcWxRUUJF?= =?utf-8?B?Nk4ySDBjZU5HVnhhZ1ZJNkVGL2l5OUVOS0ZwalBwUHJLbXUyVkU4U2FjQVJm?= =?utf-8?B?cW8vZGkvZmxRL3hwZG4ydEN0OUtsYjhad2pKdDRwa2dVU2R3MCswdmhSTFFZ?= =?utf-8?B?NGR5UUhDMkViUkRtTmRPbVhpOGQrcXl6VWJZWkdZOVR0VzI2SjU1eGNja2Jk?= =?utf-8?B?YlBkbGEveVRlWGhxQ2N1RnZUeXh5K3lyWHFMWHYvL21GdjA1K1Yycy8rY1Rr?= =?utf-8?B?aFBHT1hzSUFXaTBmdFVnMW9NcERRMjRCUUZ5bDJIZkNhSWdnMHRhNld0TEZ3?= =?utf-8?B?Z0dVcHV5SGtVRmhTNUR2bWxwMDZrVVNnYVJBU2pvK2dubDNTNkFkRi9kcU44?= =?utf-8?Q?FGqOJlphrAUdJ/Gj40Ha5N0=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;6:LvMcRCnLwlRZEMEsbZzWTt+ngiMDCuhRzMBKKqq/iCdJU1bAKNGqEbF9ul2LFcEmsXnHjQRHq4aT2c8DWf3XhGhX/p1iNc4JSdGUI4BE8yDeRGS1s4nndYbtBZmQKnunRBO/KhpWU5UpmuER/5GvWJIR4E06aq5jXeQe/YqPrjWHrSkdetWfglvoU6aLkRHBumK09Bw4zv9mLHXJPi0RHQUd36DGqigiIQn34v3Ohxv1q4PmpEFIdQ08VKOer7DCCbjCO4wzpTtFvoZ7zCym/hYJQWxZy1ZChxp0UF1PpGOLGXMIwubxBYFQ2ArC3xYDI9YDXo7UA0+2vaR7IXyrJ/BPDynNnupKbC4NFQpDqCiDQUrF23oZ42cctGd03RtOchpN8ygZv7jG3nMU0/EKmr/4HQgFUkcPPhdTqJquKEk=;5:2upHk38Ow4tH/kqwpVzld3JEgPZPx7jSJFaSmQBn5+Qv2TSSu019y2+V7JKPR2vufD2fZKqhj0rBrVET6n9nVHszE34EXh7Gei7JzJH901NCwm7PLQ6kHd7A8TNxEd2Pw7HzC5nhRYs2zuOv1k906Q==;24:wW1RySgBVT567qMc8peAmvrDMIHHXen3JsEJsM7ym2PxwN8j7RRGLFxNxhjS0+bnG/lfeHUtEbI5SVWkwd17D9bas/TQlmTec1FpclIJ1kc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;7:kM5SN7oGDKP9GTlf4zvy/SVTOSMfY6cs9lgLGY9rVfuDUGIRKNRkxRPqrntIXUbX9EBv19+oGE5znRkZFKIpbCbvud7IIU5nmAHRsCSR356L50x+7mbgifmmmtctfOBaNYOui8SNIQaK3U0RxxW30ZuCnJv4JrmMGYa0rez9RMqYgMZ8b1xR6Nz/pcWv3iIYilKecQkL5zSMk+Cn71ubvto77X6fvr175deCcF6YUbItUn5vtP9+OGINcRYVHzIFf0JsaPRiNB1Y4UptcSYGpIEuDr6amMWI39Fd/MvRHOMWodZn+n6V54qLuOTbIXojShcnJEa/EwoHLJp6G8aRSw==;20:za3BrpcEEmwLtzlMbvPfjLsNrbKH9EaxBr3oJzMchlBT1CyYTO4wVKLaJuXndC0ylCwfsRfCyzD49PtzNsSzfE+9fh56nnrVGdHpO1fxRinASmmwMS4GMIHojA0ChEUkDf3600jOz6jZXgD2P5GoB2sYgfKR9dd2XIFr/7cUGkErSf17Oz+MpSY0NRSPq1EBCj5MsM1tSDPQG3KB1xFp6N3eR33+8/SBlc7+GKn2XijuUmOa5dpQXFKNOlptd8uz X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2017 22:46:19.9594 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1137 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/22/2017 12:52 PM, Borislav Petkov wrote: > On Thu, Feb 16, 2017 at 09:45:35AM -0600, Tom Lendacky wrote: >> Add support for changing the memory encryption attribute for one or more >> memory pages. > > "This will be useful when we, ...., for example." Yup, will expand on the "why". > >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/include/asm/cacheflush.h | 3 ++ >> arch/x86/mm/pageattr.c | 66 +++++++++++++++++++++++++++++++++++++ >> 2 files changed, 69 insertions(+) >> >> diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h >> index 872877d..33ae60a 100644 >> --- a/arch/x86/include/asm/cacheflush.h >> +++ b/arch/x86/include/asm/cacheflush.h >> @@ -12,6 +12,7 @@ >> * Executability : eXeutable, NoteXecutable >> * Read/Write : ReadOnly, ReadWrite >> * Presence : NotPresent >> + * Encryption : Encrypted, Decrypted >> * >> * Within a category, the attributes are mutually exclusive. >> * >> @@ -47,6 +48,8 @@ >> int set_memory_rw(unsigned long addr, int numpages); >> int set_memory_np(unsigned long addr, int numpages); >> int set_memory_4k(unsigned long addr, int numpages); >> +int set_memory_encrypted(unsigned long addr, int numpages); >> +int set_memory_decrypted(unsigned long addr, int numpages); >> >> int set_memory_array_uc(unsigned long *addr, int addrinarray); >> int set_memory_array_wc(unsigned long *addr, int addrinarray); >> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c >> index 91c5c63..9710f5c 100644 >> --- a/arch/x86/mm/pageattr.c >> +++ b/arch/x86/mm/pageattr.c >> @@ -1742,6 +1742,72 @@ int set_memory_4k(unsigned long addr, int numpages) >> __pgprot(0), 1, 0, NULL); >> } >> >> +static int __set_memory_enc_dec(unsigned long addr, int numpages, bool enc) >> +{ >> + struct cpa_data cpa; >> + unsigned long start; >> + int ret; >> + >> + /* Nothing to do if the _PAGE_ENC attribute is zero */ >> + if (_PAGE_ENC == 0) > > Why not: > > if (!sme_active()) > > ? Yup, it would be more clear. > >> + return 0; >> + >> + /* Save original start address since it will be modified */ > > That's obvious - it is a small-enough function to fit on the screen. No > need for the comment. Ok. > >> + start = addr; >> + >> + memset(&cpa, 0, sizeof(cpa)); >> + cpa.vaddr = &addr; >> + cpa.numpages = numpages; >> + cpa.mask_set = enc ? __pgprot(_PAGE_ENC) : __pgprot(0); >> + cpa.mask_clr = enc ? __pgprot(0) : __pgprot(_PAGE_ENC); >> + cpa.pgd = init_mm.pgd; >> + >> + /* Should not be working on unaligned addresses */ >> + if (WARN_ONCE(*cpa.vaddr & ~PAGE_MASK, >> + "misaligned address: %#lx\n", *cpa.vaddr)) > > Use addr here so that you don't have to deref. gcc is probably smart > enough but the code should look more readable this way too. > Ok. >> + *cpa.vaddr &= PAGE_MASK; > > I know, you must use cpa.vaddr here but if you move that alignment check > over the cpa assignment, you can use addr solely. Ok. > >> + >> + /* Must avoid aliasing mappings in the highmem code */ >> + kmap_flush_unused(); >> + vm_unmap_aliases(); >> + >> + /* >> + * Before changing the encryption attribute, we need to flush caches. >> + */ >> + if (static_cpu_has(X86_FEATURE_CLFLUSH)) >> + cpa_flush_range(start, numpages, 1); >> + else >> + cpa_flush_all(1); > > I guess we don't really need the distinction since a SME CPU most > definitely implies CLFLUSH support but ok, let's be careful. > >> + >> + ret = __change_page_attr_set_clr(&cpa, 1); >> + >> + /* >> + * After changing the encryption attribute, we need to flush TLBs >> + * again in case any speculative TLB caching occurred (but no need >> + * to flush caches again). We could just use cpa_flush_all(), but >> + * in case TLB flushing gets optimized in the cpa_flush_range() >> + * path use the same logic as above. >> + */ >> + if (static_cpu_has(X86_FEATURE_CLFLUSH)) >> + cpa_flush_range(start, numpages, 0); >> + else >> + cpa_flush_all(0); >> + >> + return ret; >> +} >