From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932935AbdCGQIR (ORCPT ); Tue, 7 Mar 2017 11:08:17 -0500 Received: from mail-bl2nam02on0089.outbound.protection.outlook.com ([104.47.38.89]:28452 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755864AbdCGQHs (ORCPT ); Tue, 7 Mar 2017 11:07:48 -0500 Authentication-Results: google.com; dkim=none (message not signed) header.d=none;google.com; dmarc=none action=none header.from=amd.com; Subject: Re: [RFC PATCH v4 28/28] x86: Add support to make use of Secure Memory Encryption To: Borislav Petkov References: <20170216154158.19244.66630.stgit@tlendack-t1.amdoffice.net> <20170216154825.19244.32545.stgit@tlendack-t1.amdoffice.net> <20170301184055.gl3iic3gir6zzb23@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: <7e6c308f-3caf-5531-3cb2-9b6986f4288e@amd.com> Date: Tue, 7 Mar 2017 10:05:00 -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: <20170301184055.gl3iic3gir6zzb23@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM5PR18CA0046.namprd18.prod.outlook.com (10.173.208.32) To CY4PR12MB1142.namprd12.prod.outlook.com (10.168.163.150) X-MS-Office365-Filtering-Correlation-Id: 64805a34-4394-417b-172d-08d46573b790 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:CY4PR12MB1142; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;3:NdIGIHE8jMbOzZlRWdN9ZfqB7f8an5HwUE3ni7TWAnlXDhyAgyX0DSPIfnSkQd+QKYFBE2PqHe7h+zPO0+I4Jt/j9Plz9Lk6EYNDpuP/AlQTtzgMCLjJBDcRuX6JQQmV0obD6NOrY9Osugpuvl14cVEoQAPtLXmbq4YfPPCLdoiDqy+WEtohqM20ryfUQDpHSqtRUZ05dxC9v6Zak7ibaPOfAedOe1G2+9Pzugry9eWdeC7TbQt4BWRavCPm276G3CGOb4sDw9SMrqQWkgModx3aTTQ0eNLiSaA3gOL8iq0=;25:EAeouBZMjGFXZst4P6Aswe1p1j+cN68XUHOIv9aabc5xsDyJqvU0H7/ECZT4jLEjkd8WfCGXp28kv4Ar0z7cpOP1VLOajqHPgmmeDhmNngsmadxOkgPgEqbVud45nnnOYDnspQ+U/SdUa76jEFRBjt3AWsXuLh/wJePVcVTS/9+qCoCrrXUx0laq4PwfGYKhVxP5WKjEGHDj1uVJYaIcVDXZssrB17gAfO1I3vy1icUfcnR78hF/+uOvDgypVuwxRlBx6nCCLrHF6a6iCyS8tZTZxJGM+/0+4Nn2a4PPduiomt/ePo+jyINzKd5eTHnnNDJJrZJy+dW18Ey67RO0t/UjZYtrLoKX9s3ZlddOhqmdOLcSkU+YBWqAPJrTQxOeC8X3AjxMRyCkzjnjUs9oB13iel8XMZ9Gnucs36asFZLeeODwB+rV7FMIb/KhTtYrVSURysqWU064JB3L/JWhHQ== X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;31:7mCnRWM/IJz9Wb/C1RPT0v6VB3KX9eNoK1+1JVUCT5JOXKoIJS/N1mwVEC5kHd0OTmEkckyxYkY5qEkQLIjho7PN/xR0Ct7AQvGUaMIrXQa8qzl65Zi2vG0Q4mnnKtu2YlP8fymaInvK2Rxt50/ONCmenz1EPQ/XsVz5kLqvINViGb+Ae3uwYdaIyaSQf6wVj5QcPJq/d9aWHuhQSeSKK3UuI5bVuwqPaMklIR05vA8=;20:0ySuFM/jBmONSGRYxLSaENAFsOlZMo/kFGy5E7aZm41/JYLlOsF7UgkbL8r+TJV1ecYvKHUNltcFRHtdBymy9j7BHOXyj2OQva8UmchhwL6P/oAeOpQey8IWFYuLdFpOAjN8BSz7r1gLfrkoK3ERFV25lUZ3h5YsOZ40AeN+3ahsMnWnwikvYGmUxC1iH+oUP7OxSGQSuc15jTta5Nrrp+VrmGfPjWLgWoIRCd02FYfXq6rPpKUqrqF2A1DV8KQBb91ez3fG9K/RVBoYcS9ssZ+JgbSa4YFsv0GF6YNP1IWNu/qDsqxZAq6nGrtOea+rG+dB6c8YTi/QpeqYjzTJE9cV0GiAE/Az8+1Egk7bLz8DI+bgF/soR+oJaowxhcZS9yAUd+gbUMadSlzHpA4ylL0l0oZFNNl+GsG5x5fIo6NDToeHsz2IL0YRAOOMgAVnUTX562bysWThgRN/J8C3etHnYLKzJjk8hyPO/NXoa/XSwUfebnJeBDB2NWof9zf0 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)(10201501046)(3002001)(6055026)(6041248)(20161123562025)(20161123564025)(20161123560025)(20161123558025)(20161123555025)(6072148);SRVR:CY4PR12MB1142;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1142; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;4:4yxJhnaNuxcgduZTCdVZ2k6yczq1zI/SXA8/1fvuVxI34xhasQY+QG84KHSziN8j4QpGPY3o4FV1oS+TERuLzDwqirbX18JDewN+fH9X5tr1lP9n0NI3IXIhYXEm3DpcmLIGOYvOFkLygUQgwvimQsnZ/7DcEUN3Xfs5AYBR2Sl7ZvyGcQd0+ezPqjgHypxAvPZHUbcI4NkH8Kdq2zWMeqvihOdvAOPSJYQShcu9htE9Pjd07sCzjapwU/Vx7rDVViYMht4nCGmipXGI6FHM2sv1ej3knIjtaqzUmDZ6sGBY6C+CcW/s09xyrHcIAsVXVDjIVqvzm5/MewIJh22iCo6okKuMwrLRDEukDsmr1e1E5npz2JGGrQbcFe/THeyO75Qty5e1dzoxtxyKpkucfpI2q75iMoKhUwtT6nc/PtmrMOzJcR54vViXA+h9+oomLZf9csLr6KzLxmss1/3Q71n9q6Fh7guiot9Tgi6O27BEsoywUfLoDb4L4O4hd7sBL9RjTe6T3HPjfRr1pSvfH8yupdFM5EgAfNp4LIyWLmc+1ceNesz0e9IW5A6pidbADWqrHs2uwg2RUtVSTK2rZhqYeRrXR5hvikwjWcVXnaD17/zmvtYvXetliJHZCLaifTbSQXYDhAseYMefvPwCVWcKnRkiGBNrXAweJ00LNnw= X-Forefront-PRVS: 0239D46DB6 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(7916002)(39860400002)(39410400002)(39450400003)(39840400002)(39850400002)(377454003)(24454002)(38730400002)(189998001)(33646002)(110136004)(7736002)(76176999)(54356999)(53936002)(6486002)(83506001)(50986999)(2906002)(230700001)(8676002)(86362001)(229853002)(3846002)(4326008)(23676002)(2950100002)(77096006)(31696002)(81166006)(6916009)(6116002)(90366009)(4001350100001)(54906002)(53546006)(305945005)(65826007)(31686004)(42186005)(50466002)(6246003)(36756003)(5660300001)(64126003)(25786008)(7416002)(65956001)(47776003)(65806001)(66066001)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1142;H:[10.236.64.195];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQyOzIzOmhFM0xJWGtzWml2RElYT1FJWGR1VzgrWmg0?= =?utf-8?B?T0hlTHhPNllNUFY0VURMNHM4VmVkQTE5Vkk1blplVWNtNDVJSlQyMlJ0VTI0?= =?utf-8?B?Ky9VaExqOUx5anlYMWNjSjFQeWt3M2tCYk1tMU1DUXlyL3JYQWViRUtrTjBu?= =?utf-8?B?ekZ4QXBIK2J6N04zYzZQMHpZQmhtQUR3eU5JcUtBcVVWRnJZY0JlWmVnZVVw?= =?utf-8?B?NTRaYW5kYzJ1L0ZJUHl6RHU0R2tQZU83Vm9NNnRWcnloUi9hS0ZTM0s5cjlZ?= =?utf-8?B?NzErc0VpRjNpY0tMS0x3NXNoMEQxMVlNdERaVEs2QTdXVGdrbTg1eW96SkVL?= =?utf-8?B?R2krZEZ2c3lvMnFhRTBKbElEVjA4a1UzN1BWNVhDdEdnb2xhKzRSQmdSaE9z?= =?utf-8?B?aTRGejlERDRhS2hHVmZmdVB6YzBVbTdkc1JOWFFjZFhBZWo2SXlYcFJwb1Jy?= =?utf-8?B?N1lLS3FYa1pHYkYrdzBBN2VDbWNLVzZyR1EvT0tIUUpYZzRZN0E5VzlkWEhH?= =?utf-8?B?dUxWZVp4SEJDVkJZYlVpUDk2ZFRkdGpSdFJNT0JxdTZjdG5YUG90TDJVZnFS?= =?utf-8?B?U0ZjSGd0TW9kMUI2VEhoM3dLRWlRNGM2Wm55VkFvbUNxaTN4bkdZdFRYTTd0?= =?utf-8?B?eGRUeW92S2JjVnVIcDVNSFNVMmgvWUZmSkhDQUFNdDZUSlpDZW9EY3hxVVdU?= =?utf-8?B?Vk85Wmkwdnh5SjI0eVlPTEdBSVVHaFNBbE9mOVNtRFl6c1pWL2Ftc0FFdm9Y?= =?utf-8?B?TjBtZnUxY1MrdEd6T0xId3FnYnZ6OUZDcjdJT2VTcjFoY3ZRZHRKOGpqdllu?= =?utf-8?B?MFZtUit4RWlDQlJzSWs5MGp0UEZZTngwWENpNmtBMHFMOUZVMzh6OTQyUHF4?= =?utf-8?B?cUdCbmpyelJrbTdOYTlMWmlqZHVKbXdyQmVneFpiRUhkNkNmQXBhNU9HdzZa?= =?utf-8?B?MjFvV3V0VmRTMUdKM3pscHQvbkRPK2JhTFZVR1M0c0pnTFo2dDJzU1FxT1Bt?= =?utf-8?B?Y0xSY3pWUllxbUpHK0JEYVNaUVNYS3pneGMxRjlrYnZHQzBwSENZMHZmd1BN?= =?utf-8?B?MHNWMi9NbFVxRlJmSVZJcnlpRG9Zdll1S1NGL1JMbmpkUnJXNWJhYzdYVG1F?= =?utf-8?B?c0M1Y3JrdGhQTWxnN2FNL3RvQmdTYzk1S1hGVDRnMUhVR2VVSDR6WXppOGpY?= =?utf-8?B?bDk3aGZDOEpuUy9Qb211clJHOFdWYWhUMUVudEFPMjVxdDlaN3pqM0VMRG5q?= =?utf-8?B?U29udWw3OVA3YlRsL3BTSVc3VGNnK1hIeERpOTFGamFmcEtVdXRBc3ZEMlJa?= =?utf-8?B?YnJhYndFL3RraVk0UWw3dDJGc3ZYUzFlRWVBYWljT1VHRFBHcTVjck9vQ1p3?= =?utf-8?B?c1luMnkwVGUvM01jalNjc3FuNXpwUnFJYVd1VjhyWlZKSC91YnpHbzJCZjRY?= =?utf-8?B?UHJleDRiRXY5QVp3WkhIcWZLRWVaZEJrQW93STJuWitoQ1FOQzl6T096eW8r?= =?utf-8?B?dkdKcFBtaVVDaWdPMFdyWVRDMEFGdTlYTTFkbU80cDRGYUlRdjdydFh5dHRD?= =?utf-8?B?Sm9VOW9IYmMvczRFNkRleEkwQ0ltZkZXWEVEcHJoK3k0TFNsQXVTY0RUb1lZ?= =?utf-8?B?Mkk1T1VlbC9ZVTZMNlJrMDNhdWdEREdRNVdaTnFQK0RsQXZqSDFabDFFNmk1?= =?utf-8?B?bTE1VnZoU3UwUUVZS3JhVHlkYU1lV0VYendOMlRUVDFxbDBwZ1FuNExrZUdy?= =?utf-8?B?YUwvbUlqT3I2cFZzczFVd1I3OU5oYUJSM3E0cTRKckZYS3VhVTNya1REcU9X?= =?utf-8?B?VGsyemFhQzMzYVZvMkJzWG1VVENnN001MDlWT29nczVyTUVWWU4za2dlcity?= =?utf-8?Q?uDpeo/WV1so=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;6:62Q58sArTn/ANUT7tVAPebbVQMEnsKQERJDYFKudQLG4DpVhgeJZG/PZbY7wJHw9Boq1nntm9UR8pNoLzSgD/C0dBoMETz9dGrPRHaspy8KWCYZbj/8A+l3iA+u1+Aog4NJrzgnYYTWT1GyLPfRFbNW3G/jUc1/5BJBP8VzXeYeclRtJmv3Qz1MRx5+82zfufovep2YFpQLWK14vFqH+znA02SEH1cCq1AAkjWnFk9wzXiggH8rGNYliQDF3Q2zU8eLy5YZF1OHkrFZkw+yKDqHibiJlBx/oenaZf4ngUnQ+Pt3bIZ7FpJ5N0dJ34evOtzu2yTvYkZ+buXOFQJsi1kKvPlQahd+P9pFVFFzaXcOa8nuqq7dgQsR8bSdvQcZ55SGOA31RG2OZFWJU8QhxWVtABukxmOw/rr3zuM0ktMc=;5:g1opmUZAJlZRETWwxs7Akf7T+JiHH3wxaPHnaEiDLhG3KWIiZV4GQtlomeJO3uEBSx+BJ9BZ+lKnr5RwUsNAboI8GeA8JqYBFO7Jsrew6zCf+MsaYyBMKJEt5IzcZHHjPdIN2SkT9tRTRL2E51BWsBPrGdRfKs+mrTd6wFe1Z7M=;24:tSsF1QVhAUgdP4HutZeuV7nBkcy5QzcGWb4/Gr/JLi2xYaqfFMlnIe5FjmMtS0khrvSPptnPMcWhHkvrlT6S005mmyQEFmnAYPGXIdJqrfk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;7:N24eiLZ51EV5Dzx7l+7kD87CEs+aA6UK6/xmp3jv4w7GDru4IH906Pn367qQStrccF6X6GEwN2XF88WAN1hvcbB6WwmgNNnhVr8oeK6k6MgW+Ytn1+yElhnsiswKO62IXZkIomj/uhKJ7BLSp72lP+ADzGLp4JOdDuhyAB/3ZAe5RiiLWbL0hNApSWtNxKICSJMguvCHAQbeLhuCexuR62I5WpzCeCjqNKkSvU4Gjk3w8+Et8SNadK0nSwHsbJtPefj5eJvop5utZ6eToD9FAlS739nBHnAm8Tv/ycFhoMO4Disyo7NQrNK71kGIEnuQOtXxSuxKkBPQVkfbfhiHFg==;20:ZfAJ3BbnS8XPIBQBVuc3T+7wACz8n/RXGcek3lYMlkX2kUkEwyvOIQtLKzji2LVJujmXGU55yJdMjUPtXqYqgsRZHVuXWLLp3UfaioPVXRL2sosXF2HHnI0N5eegqDGAjxhVS1R0xTBbrbU6gKi4WTtOwmGi/ktfTAI0czi24A5fe8hPo6xS5dghHhylXzDm5c1J+iooHYLwhc6huDQ8Cq58OEUY9vRlNug2SDWebSq01xG+3nkG/9fI9fj7qcml X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Mar 2017 16:05:02.8089 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1142 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 3/1/2017 12:40 PM, Borislav Petkov wrote: > On Thu, Feb 16, 2017 at 09:48:25AM -0600, Tom Lendacky wrote: >> This patch adds the support to check if SME has been enabled and if >> memory encryption should be activated (checking of command line option >> based on the configuration of the default state). If memory encryption >> is to be activated, then the encryption mask is set and the kernel is >> encrypted "in place." >> >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/kernel/head_64.S | 1 + >> arch/x86/kernel/mem_encrypt_init.c | 71 +++++++++++++++++++++++++++++++++++- >> arch/x86/mm/mem_encrypt.c | 2 + >> 3 files changed, 73 insertions(+), 1 deletion(-) >> >> diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S >> index edd2f14..e6820e7 100644 >> --- a/arch/x86/kernel/head_64.S >> +++ b/arch/x86/kernel/head_64.S >> @@ -97,6 +97,7 @@ startup_64: >> * Save the returned mask in %r12 for later use. >> */ >> push %rsi >> + movq %rsi, %rdi >> call sme_enable >> pop %rsi >> movq %rax, %r12 >> diff --git a/arch/x86/kernel/mem_encrypt_init.c b/arch/x86/kernel/mem_encrypt_init.c >> index 07cbb90..35c5e3d 100644 >> --- a/arch/x86/kernel/mem_encrypt_init.c >> +++ b/arch/x86/kernel/mem_encrypt_init.c >> @@ -19,6 +19,12 @@ >> #include >> >> #include >> +#include >> +#include >> +#include >> + >> +static char sme_cmdline_arg_on[] __initdata = "mem_encrypt=on"; >> +static char sme_cmdline_arg_off[] __initdata = "mem_encrypt=off"; >> >> extern void sme_encrypt_execute(unsigned long, unsigned long, unsigned long, >> void *, pgd_t *); >> @@ -217,8 +223,71 @@ unsigned long __init sme_get_me_mask(void) >> return sme_me_mask; >> } >> >> -unsigned long __init sme_enable(void) >> +unsigned long __init sme_enable(void *boot_data) > > unsigned long __init sme_enable(struct boot_params *bp) > > works too. Ok, will do. > > And then you need to correct the function signature in the > !CONFIG_AMD_MEM_ENCRYPT case, at the end of this file, too: > > unsigned long __init sme_enable(struct boot_params *bp) { return 0; } Yup, missed that. I'll make it match. > >> { >> + struct boot_params *bp = boot_data; >> + unsigned int eax, ebx, ecx, edx; >> + unsigned long cmdline_ptr; >> + bool enable_if_found; >> + void *cmdline_arg; >> + u64 msr; >> + >> + /* Check for an AMD processor */ >> + eax = 0; >> + ecx = 0; >> + native_cpuid(&eax, &ebx, &ecx, &edx); >> + if ((ebx != 0x68747541) || (edx != 0x69746e65) || (ecx != 0x444d4163)) >> + goto out; >> + >> + /* Check for the SME support leaf */ >> + eax = 0x80000000; >> + ecx = 0; >> + native_cpuid(&eax, &ebx, &ecx, &edx); >> + if (eax < 0x8000001f) >> + goto out; >> + >> + /* >> + * Check for the SME feature: >> + * CPUID Fn8000_001F[EAX] - Bit 0 >> + * Secure Memory Encryption support >> + * CPUID Fn8000_001F[EBX] - Bits 5:0 >> + * Pagetable bit position used to indicate encryption >> + */ >> + eax = 0x8000001f; >> + ecx = 0; >> + native_cpuid(&eax, &ebx, &ecx, &edx); >> + if (!(eax & 1)) >> + goto out; >> + >> + /* Check if SME is enabled */ >> + msr = native_read_msr(MSR_K8_SYSCFG); > > This native_read_msr() wankery is adding this check: > > if (msr_tracepoint_active(__tracepoint_read_msr)) > > and here it is clearly too early for tracepoints. Please use __rdmsr() > which is purely doing the MSR operation. (... and exception handling for Ah, good catch. I'll switch to __rdmsr(). > when the RDMSR itself raises an exception but we're very early here too > so the MSR better be there, otherwise we'll blow up). Yes, it will be there if SME support is indicated in the CPUID result. > >> + if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) >> + goto out; >> + >> + /* >> + * Fixups have not been to applied phys_base yet, so we must obtain > > ... not been applied to phys_base yet ... Yup. > >> + * the address to the SME command line option in the following way. >> + */ >> + if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT)) { >> + asm ("lea sme_cmdline_arg_off(%%rip), %0" >> + : "=r" (cmdline_arg) >> + : "p" (sme_cmdline_arg_off)); >> + enable_if_found = false; >> + } else { >> + asm ("lea sme_cmdline_arg_on(%%rip), %0" >> + : "=r" (cmdline_arg) >> + : "p" (sme_cmdline_arg_on)); >> + enable_if_found = true; >> + } >> + >> + cmdline_ptr = bp->hdr.cmd_line_ptr | ((u64)bp->ext_cmd_line_ptr << 32); >> + >> + if (cmdline_find_option_bool((char *)cmdline_ptr, cmdline_arg)) >> + sme_me_mask = enable_if_found ? 1UL << (ebx & 0x3f) : 0; >> + else >> + sme_me_mask = enable_if_found ? 0 : 1UL << (ebx & 0x3f); > > I have a better idea: you can copy __cmdline_find_option() + > cmdline_find_option() to arch/x86/lib/cmdline.c in a pre-patch. Then, > pass in a buffer and check for "on" and "off". This way you don't > have to misuse the _bool() variant for something which is actually > "option=argument". I can do that. Because phys_base hasn't been updated yet, I'll have to create "on" and "off" constants and get their address in a similar way to the command line option so that I can do the strncmp properly. Thanks, Tom > > Thanks. >