Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932970AbdDRVXl (ORCPT ); Tue, 18 Apr 2017 17:23:41 -0400 Received: from mail-co1nam03on0082.outbound.protection.outlook.com ([104.47.40.82]:17872 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758147AbdDRVWd (ORCPT ); Tue, 18 Apr 2017 17:22:33 -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 32/32] x86/mm: Add support to make use of Secure Memory Encryption 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:22:23 -0500 Message-ID: <20170418212223.10190.85121.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: CY4PR19CA0033.namprd19.prod.outlook.com (10.172.173.147) To CY4PR12MB1141.namprd12.prod.outlook.com (10.168.163.149) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 26ffeb69-dc79-4574-595a-08d486a10329 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(201703131423075)(201703031133081);SRVR:CY4PR12MB1141; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;3:BEzKyqPgsKHEc6jhNMmXb04LRc0sGFfa90MbAQK4c+UHOMrNoBH8lS1iCsJCb3Noc/6I6p4b1M8BQzi5l4EN+PGf+R9Jm221IjP5xjLR2J19dV0NM5KfdG0vHIztrq4k4xy0HkhBDRYgosufHUc91P/nFzIrACjZcmGTm/9G3lgM2avI2qdpYSgns2Ai6x/nm76mQRbuLy6/xla4eYhJjhqHHUgftcjE4vm3WEqUOc92VIQJUYlrVUASSMiUVVe1vwCoHSvcjUOdou86cYzSH22yWf8OUHIo6rBg/0FGyzELKH7zUorb+pR64XcSQRriEkodzckQKBK9NWlU6H57YOZ/+LcUCrGDSLcBwYrKoYs=;25:h9eUfz2UOOo4FJS7iS+iXoNjcJM2VWWyobBTZ1G7YSdUP6bAb+/dAistDC8oGxID9GtHoDonmE/s/1x4M7s7URWDqBuTFxL3MNZ29P8bvW/qHsmvtGE2+YXNgpShaGuKhqQmk4flMVyXTXXQbuOrWYgfZ3koao9QzcL6RJU55J/7qkpuO5n2iZxqdv54QqEHKOoSXNl6fcz4SXfHxCv2mzmlYiYr3oqoMZ7oKQKRa3nijwnkBM+Md9UwQCxdKvzgzS+SM9TyrK9GEPxgDdA8gWBbSzcqdhV55gCHoJwIr22sDzXhwjEzD9I5rQPh9P7xXUEV549OliivDPdSV1LYLqA7uO4uQP0pHBm3B1ixZWBpj9zgsq+5gG6cvnhMhUpjxl6V5xEfVRAu7FA2UzzYen6x1cM8kjMDDo5+7nzwXrLkiaP2AuEIVU4tKZFhNOV9A1Lq9fToj6VqRfY5Uum/Wg== X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;31:QR2/OxCyGsbMhDsJfLelUnIUYM0uSFAqbyqqe55ZKmCr6Hx7wBGV2jE7ujMEh8vfCv+4zpeK6D4YW8DKXRwz01MeGfq73PqDUpKyjfvPsmxwy1b8zGFLqH7+mEqiYgmZLIO/vdMjFqU45YlA9tZfyhsUsQe82fX+GPxF8VgsrLMB8atLIlYKtYXwyKDW3tikwOG4utd29de2T1RfQn4dFiKX5T1NS9WtOgMnS2wbuRg=;20:SF1cFYqoiTEhKd4dDvthTmxPurV52sXMIL9U/wrYiiIB4uAzVMK9gmBx147qKeVBMHbDvA1KG684YP3RD4lrca8LoLlo+A2sA0Vyx20sm9f3IDlolcFfWJDz2weaLJSIWV2o3qOMQJr5AWuN/cZbRUKgd3VgB3ibzovVm+K9e9uzzSvHAFsSXTCrx+J3RjC+Y+G2xcK9zmDTpmukwwiTKX37Iub+dUv+Z53rcoQHrwr/SN31flI+Djril4zDDJWX1h2To6u/HADFtjNg+ZbeiXmXr5Wm3gNqeNyVj8x87OAHY7k3kX92Fu8Fq0owy8CVgfIgKaeJuLt3iIYXJkzaPWeTyc/uOnnoGlD831KvR6Jn5vH+LoM/hmYkF46Q4/D8HJTHjBZoBZjDSGVu3vs/La+SJoErOoyl/McfyRQ9hXeySyP9bKWrT/uxgmoZqYQKqGGMQNEd7GQGURywalpgroOYoWONoVTQpmBgoFv+a9IRfhhg/QBKUdB4m/EDg/4d 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)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(20161123555025)(6072148);SRVR:CY4PR12MB1141;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1141; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;4:DR6w7cHEQ00eF56tQ//8zPLCQJqzv/ob0snWXL9/su/3p6inMfzlNqd2JS3M8C+SbL5rg/Tpuyl05jbjAM+evyWH7uG+iyvpTr1iwhQQ64WzekSD9kB1p9an5nPWy6ZmK277FNO7gT/NtHNDi/VZepwB5YPjejrmeVmrOVH3fLuXY2YhzVP8+Vj0CDhsfz2cpK2FqW5AuDNm3hK4QzViGEqdfS2Q+Dvpn5rPHvLeXCGSrzLWHwpRG2VDIuKEnBAMT4cbc2uotYPEoXMnscIxttawjqCxHul8D0xvZim70rTyNQg4zTTb3puNz5dro9oLHy45bl886vQD2qiP+7tfg8nsmQaQwtyPPIzv9avS/wTWFVD8tRYWrGrzY12WT20X34ZkEAPtUqi62613QDa2Wwdmeig/uQUSGYJUmjEEmYskHDICa1/N4T75gHF4twV/SrqeZosQptQI96vRfyjGGN4iZBMfz3kTynqy774EEtc++rzwRyQmOJnXVaXC1SJq80ryLkv026Ez0Ze/27o1aGmAwqPZkbhNO/5jV1Jh0wKBlOCIILCIfXN+b3TlC7zJY5dPqyCP+eqghcf9qgROkOvfl/Vmj2LYEyDEC9YoREOwBdZaLiJMaUBcxsWGSbA57rsbG6Li0B1VltxMko56qqcahdyJX+MACxiVz+lLzYsRew3kPaX11/Hm7R3V7wHzXzxvcy37wfZl3kj6UUqW6HtmV1sN3yYkLbp99rubq+F8yvuSHKCyB2I/w9BnNUz3+u93v1vueD6nzaC2u/d9bg== X-Forefront-PRVS: 028166BF91 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39450400003)(39860400002)(39850400002)(39840400002)(39400400002)(39410400002)(42186005)(3846002)(305945005)(25786009)(7406005)(50466002)(7736002)(38730400002)(2906002)(4001350100001)(230700001)(53416004)(86362001)(2950100002)(5660300001)(103116003)(23676002)(6116002)(7416002)(2201001)(33646002)(1076002)(50986999)(54356999)(81166006)(55016002)(76176999)(97746001)(83506001)(66066001)(189998001)(9686003)(4326008)(6506006)(47776003)(53936002)(54906002)(8676002)(921003)(71626007)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1141;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQxOzIzOlFUUEt5UDVCd2Ywb3JKVDJqQzJrNGhiSVFk?= =?utf-8?B?dmtpVzh6dERhK1cvZ3g4WkJWc3ZudFpxclV5MTVxMGJXeGUzcVVYeUVGWG9H?= =?utf-8?B?WWVzelE1M1NrdzdpQkJrK0R1bnduN00ySHN5eSs4amRMWElsVGRMOEtsd3VP?= =?utf-8?B?bGNnTFUxNVVYaUN2M1I0ZXQwbDVEL1gvZENKamxvaXJIdVFaaFZxbmFiMDla?= =?utf-8?B?cyt1OG5PdmNyTHNoMmtkWThTUWdtY2NxamttekU3UjRXK1A1OHcwZlZJVjFO?= =?utf-8?B?d0FQU01abEltS1RwekE5eFhYdno2VWVRT3plN0ZiZFFJTGo4c0VhRlByRlRv?= =?utf-8?B?a3BEeUtSUkw2YS9QTjUwNEhNd29jUS9FUi9FUG9hR3dBRG9waVFtTGlibDR1?= =?utf-8?B?VE40WXNsUEdTdU94ekt6b1Vzbm1Ld2JZMGVVZUNtbGhYMzQrakZxMHdjZG5C?= =?utf-8?B?ejJYWEtJMWZkd3p1QnUzb0ErS1lUM041RUpPSkZuV1Z6YmdOSFBYZzZBalhU?= =?utf-8?B?c3FaSkhaVFVpSGFoNDZxN0QxWG9rbmk1QUtKems2TmRaY3FlOFcvcW0xdkUz?= =?utf-8?B?aGk0bFBiSDIvTTV6aERkMy9vTVlja2VEOEIvdVprZjF4NDdZR2sxaEFhdG9n?= =?utf-8?B?aHFaMFRJMG10UmRHMm00N1piLzY5ejM3c2xmTVllNm1qRGh0SnN1aWVaeVVF?= =?utf-8?B?MXgzQ3R6Y1BCV1g2QXY3c2NVb3hQVVdlMmZBQmhtZ3ZwNjZTbjViMExMdVdD?= =?utf-8?B?dWtETmVDKzRFT0pLempvMXUxZ3BxYXBxeitLTHEvT3cxTmdHazh5NEt5SjBo?= =?utf-8?B?azQvSWJGVUQ2NUdEd25iOXVzdHY2bkVuaHo0aGg4OHBsb25NVlVsdjMya3A2?= =?utf-8?B?eTJmM2NkbkNON1NLL1BiSytFNEdWaFpLTXFnN1FqTWRreUxRQmM5bytIczk2?= =?utf-8?B?ekkxZFhmTUdjUjJmcmJEckNrM1QrNko0Ynp2c20yajhQN0p3WUNwbXlRV0Nx?= =?utf-8?B?RFVZeUI0UytPSHlFUXRUSCszRFQ5amRFb3dpTXo5WkJTbEhHaHBlK3BBRzdK?= =?utf-8?B?MlMyMFQ2bXFwT1Q1b2plZlVtaWdJeTA2ZFZPQ1diNmdtOXdnaFNzWGZidTdp?= =?utf-8?B?aHB2bmlXNkZydk5Vc0tIN2ladTlHNlpRVXBKTlZkMnBMRWtMRkRibUJaS25X?= =?utf-8?B?MmVLMXBNM2FxU0F1UUFzbWFaMTg1a2d3MXNOa0srUEVKN0JvUmFpMEdvNk5u?= =?utf-8?B?bUlQalpVbEJGcGxWejQ4YnpKTytZT21KWTArc2hxdXNSTEIyTzBtZ0V6UVlh?= =?utf-8?B?bGY4RlE5M1loODJzemxBZHZDZnRhMllTMGJ1Y2Rra3FMdzJXcFg2M3RvNmYv?= =?utf-8?B?YkVYYTczSG9zRDNXaDNrd09Vbm54OVhxeUpTMHhZTm8rV3RGSjlFOE1LOENz?= =?utf-8?B?OTU5aVB4WHVSZVBaRUJkcWxIV0dSd094Y0ZTZ3hPVnFkSHEvN1R0SWdOUFEw?= =?utf-8?B?c2RlUURzRVgwN3V0SUNDcldoSEd5RGRBRTNTaGFhc0tkdnFoSnZ4QXF0NTBa?= =?utf-8?B?WjhQdzJISlVOM3FsZlVQV1pUSHVsTm9zYVJkOG56OHFobGVndXQzKzhUV2Q0?= =?utf-8?Q?PrNS5a5kLUzEb2q+RRkz?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;6:kROBK4tfNLb52W6eodsw77cRRfzPu/6Xxfq+4ThPQkrn9mgY60TUTmwWgZ/eLqL70urvH9hZ70O6an97IEj0rwu7GrAbgux8mhUQSU/+aivJIVuEIQkynU1R/ZtEHq6DyJ35h077FQGAiwrn6+XeaBp0D1Y1ZXvCu/Luef1K4mfOlEFUoCKzGtEUiXMggCCk6IpdKKbUrfH/4sZnE5cZJXIXq0CCpvRl5ott3Quse9qUxJBoW0/10+oaDNpwIJvCLCvHQO3GCP5IjUBr50IirqlfGn+MP9RndOAxTO+WMNUYVHSWuWZ/ZbL1U9V6m9479J+BwsnZpMlRvoByjNBmhudEdmT0DezYRh0rKC6CvJCpaNG+/DqbTcNeqblnAgjyKZS78MtRgWudicDxs2hb682s36fZgbbBxi1gR37NyDX7SsiF8fvtVahROYLPf+74K3v6oCQ78vGLcMGQBLfuRhHVfcUu9YnHuUw013kQr5Y=;5:urghv0wHk/4sj0YMqWfmi0kOCOoSPopl044RCLF1KrX6rsLkJuPsgt4zEngCjWYfLfNTdgbHRWAB+9VqFtuB3D8mmg6+u7izvrjnUpuvuYJqMMHdZEEj0mCoJqtQUYd6ljRgL9vyqLi1UZo4Te+fDg==;24:R5To2zGNmggUaS7P4Fsz1dWR27YFWSo8rOBU+MKufPyw7Ac9QneyDs91QSgLKv9qGRdxYe+w2yHMqDc4UwXtaGqjKz53rSkN3ILm1RFGD9s= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;7:1kdVS2ywPhH3mxjynbAz8C0tP9wNr49kjGvhTtAeFX0/nZRDO25No+yezOAg8M0TL8CdeRk1ROskeMoXJ9VJqg0dIDrC4JhyHaGfg58M/9kCr3gTmaVPy2vp/JEVV6OqtcxF6MpdhF6MQAlIdB/RZeq0p/ZfBrQRWMOZzyjrOyRwma1712gDt9/3f/e8npiEnJgj87AsNzko820vQjckiORJlwJiWQEUPu9wL2DLNBtjfj7FAwjdO4t1HijXx//CwxpDR1/o4VCKm7iYYjtqkuzMZJLs0GyZe/TJalDLTZjhg3wSwFq9PWpKM9j5jYmXF/208P9oADflz64vyvG8Gw==;20:aH+8DZ/jr6z4z7U9P/P7g3YbrMp0usFu6xddKjhXEZ9mrf/bFcJgi/OsTjwZSQ8/LsI1LnRT51TYjaJ6syR6+CKtaVXQcQMaEPJj6+FhUncBINDRZFq2ijF8KqZi06g3/0iEavom1t0xH9auiSDjftJhNHHoVkgyFWl8utflme/BobE6KSo3g/vIdrAcoGcJL4qIGHPznUz9SNPrfurdZT6QLZVtm0zCZyOcknl0YEZt8e/a/zFeSHxJaEfOhKoF X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2017 21:22:25.6672 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1141 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4213 Lines: 140 Add 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/mm/mem_encrypt.c | 83 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index abfe5ee..77d7495 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/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c index 7dc4e98..b517cbc 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -28,6 +28,13 @@ #include #include #include +#include +#include +#include + +static char sme_cmdline_arg[] __initdata = "mem_encrypt"; +static char sme_cmdline_on[] __initdata = "on"; +static char sme_cmdline_off[] __initdata = "off"; /* * Since SME related variables are set early in the boot process they must @@ -255,6 +262,8 @@ void __init mem_encrypt_init(void) /* Call into SWIOTLB to update the SWIOTLB DMA buffers */ swiotlb_update_mem_attributes(); + + pr_info("AMD Secure Memory Encryption (SME) active\n"); } void swiotlb_set_mem_attributes(void *vaddr, unsigned long size) @@ -531,8 +540,74 @@ void __init sme_encrypt_kernel(void) native_write_cr3(native_read_cr3()); } -unsigned long __init sme_enable(void) +unsigned long __init sme_enable(struct boot_params *bp) { + const char *cmdline_ptr, *cmdline_arg, *cmdline_on, *cmdline_off; + unsigned int eax, ebx, ecx, edx; + unsigned long me_mask; + bool active_by_default; + char buffer[16]; + u64 msr; + + /* 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; + me_mask = 1UL << (ebx & 0x3f); + + /* Check if SME is enabled */ + msr = __rdmsr(MSR_K8_SYSCFG); + if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) + goto out; + + /* + * Fixups have not been applied to phys_base yet, so we must obtain + * the address to the SME command line option data in the following + * way. + */ + asm ("lea sme_cmdline_arg(%%rip), %0" + : "=r" (cmdline_arg) + : "p" (sme_cmdline_arg)); + asm ("lea sme_cmdline_on(%%rip), %0" + : "=r" (cmdline_on) + : "p" (sme_cmdline_on)); + asm ("lea sme_cmdline_off(%%rip), %0" + : "=r" (cmdline_off) + : "p" (sme_cmdline_off)); + + if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT)) + active_by_default = true; + else + active_by_default = false; + + cmdline_ptr = (const char *)((u64)bp->hdr.cmd_line_ptr | + ((u64)bp->ext_cmd_line_ptr << 32)); + + cmdline_find_option(cmdline_ptr, cmdline_arg, buffer, sizeof(buffer)); + + if (strncmp(buffer, cmdline_on, sizeof(buffer)) == 0) + sme_me_mask = me_mask; + else if (strncmp(buffer, cmdline_off, sizeof(buffer)) == 0) + sme_me_mask = 0; + else + sme_me_mask = active_by_default ? me_mask : 0; + +out: return sme_me_mask; } @@ -543,9 +618,9 @@ unsigned long sme_get_me_mask(void) #else /* !CONFIG_AMD_MEM_ENCRYPT */ -void __init sme_encrypt_kernel(void) { } -unsigned long __init sme_enable(void) { return 0; } +void __init sme_encrypt_kernel(void) { } +unsigned long __init sme_enable(struct boot_params *bp) { return 0; } -unsigned long sme_get_me_mask(void) { return 0; } +unsigned long sme_get_me_mask(void) { return 0; } #endif /* CONFIG_AMD_MEM_ENCRYPT */