From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933307AbdBVSfZ (ORCPT ); Wed, 22 Feb 2017 13:35:25 -0500 Received: from mail-dm3nam03on0042.outbound.protection.outlook.com ([104.47.41.42]:27264 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754813AbdBVSfD (ORCPT ); Wed, 22 Feb 2017 13:35:03 -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 10/28] x86: Insure that boot memory areas are mapped properly To: Borislav Petkov References: <20170216154158.19244.66630.stgit@tlendack-t1.amdoffice.net> <20170216154411.19244.99258.stgit@tlendack-t1.amdoffice.net> <20170220194529.7dekuruclq7hfyhk@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: <7e9fa3ee-b120-998c-9752-53f7bc3d1d0f@amd.com> Date: Wed, 22 Feb 2017 12:34:39 -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: <20170220194529.7dekuruclq7hfyhk@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: CY4PR21CA0012.namprd21.prod.outlook.com (10.172.122.150) To MWHPR12MB1152.namprd12.prod.outlook.com (10.169.204.16) X-MS-Office365-Filtering-Correlation-Id: 52a5d285-2774-4ba3-6005-08d45b517c88 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081);SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;3:iFzCuOW6/omgbWGZ8Jxw5iBdRJwJ/WjPJ9EsYW+cIRU/9Vq7/EwdLFq/wA5JPFHuvxTZiHK7bAxCgmJuDOMJ50/+D/eYjz1g1WxD1hfce5eqUIPeYYmsqqOdzYNPFeC8a1krD+HfQyb8R9rqRBvNtd3W+OyQqJlHk/QtcUdZPJ6a974xdmGbAeWjCHdnkwOJhy/xQjudEPSzrJDMRye2/yP5dJrFxYaPGuGRd56Ngt7LuqaoElSCfGEtWilmR1B1j6eIQR0VPKTmxTVgqrto6GLSGbzP1F+IJMQkZ0o/Ekg=;25:YVELqWIUC1IIb15OF2Y66WnltIXOHy1vB8LyjhJKn8Ht9HdCQT9WJq3/exb3zTfh+R8ncwZJvyY6SprJwdX1ll5YwtdRnqQiA1O7XgwiGpclwVaRnDAAXO+euDwh29qeV8yVtVBidnYzipfXpqPGgrm8Iw8AlX2AHc027N/d1ZQ2IJ6qqfVVVPFc5p3LR6tm3rxw7saQpVJKNRK+OaiHyJAyupKfzpqDYwFf9v9m2c9TA8Xh+ubNm0K97LY1Adc+GJ2mc1zbbP5Gat6tk2DfA7jsKkU9Pmds7frRPlOPzDauTdLclyFF0EBY6bUaQYi2eE4RYZ+3nVIPqLQU0WsPLaBdPTBukyv+0v33BaKplz41ZJi5/PxEYgPxtF+x4oTVuO2ZaeDovTTeeyVhR9jCn8Ob9eSDFrCrgS861J+uV9+sUgqFZaQgJafwouAC69vE7ABNsQV2qrXeh5q8RjbkVw== X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;31:1Lyq5ll2+hXqDQZTpP7V/P060/psPKcdflbEv+6JcAAS9xNDal1hBJl7qIeHv+C9NiWUWSLfo2O6rK/H+H0a0D6GNHVDOVoOVQDQVAEOagBdYp3sesZpuqtHCYrtjyMUSC4dgIvC6hN8hB79Tgs6LaDAh3WNi4PCYsND0TN9eXxgYfyubdtS6fA6kPKIGS6jU9LMRcFVIyt0aW5NQ0nCJXO8PlZ+pFAWpeXmc65eV+8=;20:8XpBVUFe/Oxjpi8HyxHrnQ5BysmMmlmaiaqKqkJ8M2Zhq70Nbi/8vxGcKntSHLh5JG+JGiwtYo/ms3zjSEMWnUPBODbi2rS8kkpZmHeeZIwsOITlytdTACeAD+NJJwNaYYbRUYTL1RZuVBQgR3R9e7/HkmXQPoquV5QC/ZSPf9gtmUgwPveoBl29gKDr1sZwho5ONiX7/rTqD7/+rmDnJz873QGm3vX1xSJ3/SfoqDyVaf37pGvAy16cyiU0C4OzCibFXBCjeH8WV04Ijk39MpFo3F0Q4kPcY7DddY0UIQQSf5IK/pwqZ27QoucHxX0nWm2RunnCQEvUdzJJB2A78dJEvCVPatkPlkfjY4HlJYkvOFpgD9fErJRr9JGJJ3ibiBFZgd5mh/FthClu4r1FISB0qMXZcgQoxZbb6By5icOVtIFXHpRCi/SnK3vfZhJ8TCEfIceLZ5gYkTQJar2oCQcZ9Y9Iw5f8zkjH36iTyiye4FO9+4yWaG1Wns8LIPJ2 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)(20161123560025)(20161123558025)(20161123555025)(20161123564025)(20161123562025)(6072148);SRVR:MWHPR12MB1152;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;4:hCKKic92KWj6MtQvEy2PCUx2+F23JILtq+GelLXDh0rM8ahTQb7rUcwPbd37prp30V3UfTmVaKhyu1/dNMvQD5/0PrrOjYdG19OvAV02jJgUaa1tzouKx03tKSj1Xsur/eeMNxDFelrtBY3jhgr5G1c3UoXHFF7CEzf3nXdFQ2RxuSMknM3dOQJCicJfNdbtgqbyGUDgx+4L3NCghA8j7TVEpOuP22SPc2tjuH4ZqG9i5bUwwnxHQKsdcrMKEAVL0CtZ3EWLtrOUO3xylu/ByuO9stHdobymjoSUpTRQjLid3rxbvtVtqSbGesUYB3ZEgsDBGJFrEp6ntUZQxIscZMzgYb3OvTnCVRwJFNU0kg0kKGlTAmdshw/hfvnqAC89kYyh/JqRgbfaLP3cIgopUjy2zKfsYFCsZyqD69Zuda862qpCMixDwIn8toMIA+2nYAAv87r0O4XrP4RnFezsh1s4dxcrHobzeYSqO60O2PqfedqO4L2UXwNf12TZSZiwnFHjEkZFV4htumKBQ0M2BlUCngJtTO9TBJlr2gPIdZlkbOwMjt9Us875cRgd0Mr7k8jAQOfClMtvMygSszEHKqJgJxR2XNR4Mq6POwipE5XfCCk/lU6lxNWV0F07PcHHO9vm5/FmqXq/QcrSgM8PJ9qnaC3YIKTE4HDhaV4MUVQ= X-Forefront-PRVS: 022649CC2C X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(7916002)(39850400002)(39410400002)(39860400002)(39450400003)(39840400002)(24454002)(377454003)(42186005)(53546006)(2906002)(189998001)(23676002)(83506001)(81166006)(8676002)(38730400002)(31696002)(5660300001)(54906002)(110136004)(31686004)(6486002)(77096006)(66066001)(7416002)(229853002)(7736002)(90366009)(65826007)(305945005)(6116002)(86362001)(65956001)(3846002)(4326007)(47776003)(230700001)(33646002)(50466002)(2950100002)(65806001)(36756003)(25786008)(6916009)(53936002)(54356999)(92566002)(4001350100001)(50986999)(6246003)(76176999)(6666003)(64126003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1152;H:[10.236.64.179];FPR:;SPF:None;MLV:nspm;PTR:InfoNoRecords;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMTUyOzIzOmM1SEcxTk5TN0J6WWQvTG1GeVFoeVlOY0pQ?= =?utf-8?B?aE9oaU1NbWg0M25kQ0w0SmpES2JIaC84Sm9XMVlVVnJoQTMydXF4V1RTb00z?= =?utf-8?B?WXNmejNkeVhpcDkreTdCNjc3TG9MZ2NNelpZcjhHQmdYM1c1dzJ2RnlERHhw?= =?utf-8?B?Ky9qVnRPRzBIOEJiS1pVck5WL3FobXNhZHo4V20rRU42Q0JIWHlSK3VwQk1S?= =?utf-8?B?blhYQUFCb1hyR3BldXh6WlZCZnZOTHRBS3pJcjdVSy80VEdtUVB0ZWJ2RkpO?= =?utf-8?B?R1V2Yi8yQzkrclcwWFd3Rm14NDZDc29wTHdoajRiTjhEUXpLV0NWSjVjMGhD?= =?utf-8?B?S1RBNmI3ZGlFOFBtdWZhYytuU0lnbng1bmh2WUt6K1JTRmVzV3N1OXYvOTdZ?= =?utf-8?B?MVBwN2N3YUJWMHlqc1JxRjhoZ2Q4OUlOUVRNK2pFbEFBbno5bHFHM1E3OW4x?= =?utf-8?B?ajZ0Qi9uenRRYjE2cldVR3JSNVVNQ3RkSjNpWlZCREpLbVg0aEVVanhkNjlq?= =?utf-8?B?cnRscFJWdkI3d0tlQm5KaWxYS200YStVTVJkb2k0L0NtSlE5cXBYMnErZ25U?= =?utf-8?B?NWJnVEpCTlA3aTh1WTZTWW82OU55U0hYT2I0OXJBWEhIRlI0TG1paWtZaVRU?= =?utf-8?B?OXZwUlF5c255eFkrVEttVStFczhSaTd1K2Vhc0NpV2tiQkNmNk5UbEtyQ05Y?= =?utf-8?B?SHdsLys4RGxGYTZ6WUMweHFwY1NkZkk1bi9yR3RvZ05mbnhXL205N3cySXBF?= =?utf-8?B?K2doeXM1emFyektnYkI1UlVKT1JibDBjRWxKMTc3akxmMjZ1UFlIQWFEUEpT?= =?utf-8?B?ZWlIOVlnSzFERmRuVklWSndvRms0L0NqN3kzczBGRE1ET3QzRk5xa0tiN0xM?= =?utf-8?B?eTNzanZOY1BRdzZPZzFmNEwrblExZ2NFQy9kMEVQLzBObWJmUHVjNkczenl6?= =?utf-8?B?MndkVVBUcXFjdW9HdEdNY0tOVXEyMTZFM2ExdzFLbFFXS0NiWXhiemNNRnFn?= =?utf-8?B?TkcrSWRJOUV0OFZkS3BNOWFwSU56ckRISzNialNvOVU0MllLa25pNnlqWHE5?= =?utf-8?B?OWZkY0VrQjlBb0JmR0RQL0E5MnBwTVMzMjExTStIMXdPV1AxOW9KY2FmS2kz?= =?utf-8?B?aEZhaTdYZ3p2bmxPcUxobndkNUh5cUVsbHY4L3BGR29ORXh2c0MzdGpiQ09o?= =?utf-8?B?MGdjVG8rTXR4Mjh3bmYxVUVRNEpxSkFNdW9lVWhWZXExb1ZOcFhxdU1BcFov?= =?utf-8?B?Z1ZwSGQyenhuRytPUlBBSUhMZFUwWXNkK0YzMVIvV0VZTUwrc2FkYkpEUXFq?= =?utf-8?B?TUJ1WnFSRUN6bGZvSHk3WTNybyt1MFJQdmhsQUcwaC9Uakt4Y0F4S2kzOGpU?= =?utf-8?B?ZHVWaWJySGJnVkdOeGJ2cG5YYnFVSnQwbjA4R25jNjRVbXB2RFIwT2kvSWFD?= =?utf-8?B?bzBjcDhsajZndjk5Y1FGMGNCUGI5dnhLdkhpNkdFOGp1UUZXYjk4dW84Wldq?= =?utf-8?B?cXFoaWNwcVgxN1JhaHBXaVRuTDJWQ2phYnpYV1E2aDlqSW1TVXlnTzNmbnpW?= =?utf-8?B?WlNtVVpRRllDUXAvaXFsQitxdmFrbTV2SXRUTEpNL1dzNjlDS2Q2VlhJYTFZ?= =?utf-8?B?QWFOK1Z5bDVyU1dNOUZ4OGExSXl2RmFKUitwcWpXdGhQZjdvZkNWOUhKQ04y?= =?utf-8?B?MW00Ky8rR2FUV2l0dk5EWlFNWHNBRGtOOGFRUlpNWHJYQ25NOWQ0VW9TRUdp?= =?utf-8?B?K1FRaGFRRG1YcWR1dlphNjlzdUljQUQzSmZ2S1ZoRXltNXpMUUY5RmNjRS8z?= =?utf-8?B?alBjQ0lURG81TWhLRi9PMUJNNGdVWGZrdVFCcmV3OHg3RW92bUQ5Mzk2eFV2?= =?utf-8?B?WHFGUGpqYXNkMW5zU0NxQVNQSk9TRitEVDVLNGQ3MHl1cXFjMWNMQk5sZ055?= =?utf-8?B?aFBKNGQ0ek53PT0=?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;6:d2cYo6qv4ddYNvvotQlyQ2MnbwN6m9uX1HDRvn0GTS+pc2NcCpN1xOwSQE5KaP+jym4UDp55hgvywCEOcxioh7Iylz+K4TIl5bMAllzrpeEC5Bk8FYoShM7R784YLMSYBcQJnhSHIR86CDZy1dxoFIG7BE95YCgHCYZm42eARKhHCfD+BrVaKUnUBLkhrD9jy8T1+bCL062lMbprD0XV3ycP5q8UCTHw1W0evyWSfoC2AWBOi9OJNQm+s136jTeXjcUCRdIx39Z0rv2yYtp1zK+Fj1XHP7gd13WuSoKzyqlNFchh18/iNw4nFlR6wccnYcvSqogslV1EGbBxySBvZXQRS5A2c74p72a/Dkj4MxPFcgr/3AxElGY3URUAHOaFtRiYFdTl7SjVY74uWYYUbA0APw/NuJ9b9JgYSf0PDDk=;5:UKrLG0y0gXAp79nqmpP+U3aymc5nLwqlDF0BUj9xzlTIoTQy1VaL2o6x3nsHdlndjuJoUuk0NzGkenTOW1bwNey06W1dTjm9fov8kpl4jr1CnJEP+/Ilr3ZVZf0bmjy+G+BOgNcq+nTakbEUlQMeJufGp2VLrNLv+E95MoOaAGs=;24:XRCZ11y09G4cTpuQpNsSnewDyYONlXFVEaIz/8BRRG2auheko4Oz4xiBzi25Uu3tf+glzNoNkFOOCVETCUvvxe+p7s6Ms7Kg7XXp1ljhMKo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;7:sSASKN85QKFTmI3hFZokiDZecxJ2/tGSrykLliXrmeqHr7SB0ScBT402g+XYpP4BR83WBFPdPlQ53xQsX6oLhblgqb8VmhSFVijgIRCCXO+0cZR2hvorur9u+IVDMF7uRJXcgWPVkAFTvSyAwTKW0ISw96UN6B1MMgR7VEf70Yl/QNZA/oMCGaa2xy8z3oafF6sdyXTspNAeENWDmD3wfTeObTeAylu0N9aRtirG2xMWCPYa/O4Nfc19m7csQCdEQTfvUu/oDwjV9Y0P42GmUEUdJIVaJku48Z2qbF8SJ0BNk/NrkK1OJwyqDbE+O9LtPODBDsbyzyceVSivHAvZEA==;20:7DuaN2Zwf4OGI3aDTOkjUyovAweegX31jSgvqHFK/Udlic0ilwFsCeXwhUd+8BD6GtG9d0+B/52qOafo2lXcw7p7t5FXRUwQEXN29NJryR3mQ5Db+9+aWZZM+XzC6grTHTte/TRNfeFz1bJrIg+RKpmepmFIsyMXVHDpBKes9mBs3hbYMd8uWG8SlLs0/BWzQhct31liQpXo1hNqWjqBWhCgFTBJLeqIhmdcd5ov4xBo32nh8BCCrm+RP9LCnlT+ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Feb 2017 18:34:48.9219 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1152 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/20/2017 1:45 PM, Borislav Petkov wrote: > On Thu, Feb 16, 2017 at 09:44:11AM -0600, Tom Lendacky wrote: >> The boot data and command line data are present in memory in a decrypted >> state and are copied early in the boot process. The early page fault >> support will map these areas as encrypted, so before attempting to copy >> them, add decrypted mappings so the data is accessed properly when copied. >> >> For the initrd, encrypt this data in place. Since the future mapping of the >> initrd area will be mapped as encrypted the data will be accessed properly. >> >> Signed-off-by: Tom Lendacky >> --- > > ... > >> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c >> index 182a4c7..03f8e74 100644 >> --- a/arch/x86/kernel/head64.c >> +++ b/arch/x86/kernel/head64.c >> @@ -46,13 +46,18 @@ static void __init reset_early_page_tables(void) >> write_cr3(__sme_pa_nodebug(early_level4_pgt)); >> } >> >> +void __init __early_pgtable_flush(void) >> +{ >> + write_cr3(__sme_pa_nodebug(early_level4_pgt)); >> +} > > Move that to mem_encrypt.c where it is used and make it static. The diff > below, ontop of this patch, seems to build fine here. Ok, I can do that. > > Also, aren't those mappings global so that you need to toggle CR4.PGE > for that? > > PAGE_KERNEL at least has _PAGE_GLOBAL set. The early_pmd_flags has _PAGE_GLOBAL cleared: pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); so I didn't do the CR4.PGE toggle. I could always add it to be safe in case that is ever changed. It only happens twice, on the map and on the unmap, so it shouldn't be a big deal. > >> + >> /* Create a new PMD entry */ >> -int __init early_make_pgtable(unsigned long address) >> +int __init __early_make_pgtable(unsigned long address, pmdval_t pmd) > > __early_make_pmd() then, since it creates a PMD entry. > >> unsigned long physaddr = address - __PAGE_OFFSET; >> pgdval_t pgd, *pgd_p; >> pudval_t pud, *pud_p; >> - pmdval_t pmd, *pmd_p; >> + pmdval_t *pmd_p; >> >> /* Invalid address or early pgt is done ? */ >> if (physaddr >= MAXMEM || read_cr3() != __sme_pa_nodebug(early_level4_pgt)) > > ... > >> diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c >> index ac3565c..ec548e9 100644 >> --- a/arch/x86/mm/mem_encrypt.c >> +++ b/arch/x86/mm/mem_encrypt.c >> @@ -16,8 +16,12 @@ >> >> #include >> #include >> +#include >> +#include >> >> extern pmdval_t early_pmd_flags; >> +int __init __early_make_pgtable(unsigned long, pmdval_t); >> +void __init __early_pgtable_flush(void); > > What's with the forward declarations? > > Those should be in some header AFAICT. I can add them to a header, probably arch/x86/include/asm/pgtable.h. Thanks, Tom > >> * Since SME related variables are set early in the boot process they must >> @@ -103,6 +107,76 @@ void __init sme_early_decrypt(resource_size_t paddr, unsigned long size) >> __sme_early_enc_dec(paddr, size, false); >> } > > ... > > --- > diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c > index 03f8e74c7223..c47500d72330 100644 > --- a/arch/x86/kernel/head64.c > +++ b/arch/x86/kernel/head64.c > @@ -46,11 +46,6 @@ static void __init reset_early_page_tables(void) > write_cr3(__sme_pa_nodebug(early_level4_pgt)); > } > > -void __init __early_pgtable_flush(void) > -{ > - write_cr3(__sme_pa_nodebug(early_level4_pgt)); > -} > - > /* Create a new PMD entry */ > int __init __early_make_pgtable(unsigned long address, pmdval_t pmd) > { > diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c > index ec548e9a76f1..0af020b36232 100644 > --- a/arch/x86/mm/mem_encrypt.c > +++ b/arch/x86/mm/mem_encrypt.c > @@ -21,7 +21,7 @@ > > extern pmdval_t early_pmd_flags; > int __init __early_make_pgtable(unsigned long, pmdval_t); > -void __init __early_pgtable_flush(void); > +extern pgd_t early_level4_pgt[PTRS_PER_PGD]; > > /* > * Since SME related variables are set early in the boot process they must > @@ -34,6 +34,11 @@ EXPORT_SYMBOL_GPL(sme_me_mask); > /* Buffer used for early in-place encryption by BSP, no locking needed */ > static char sme_early_buffer[PAGE_SIZE] __aligned(PAGE_SIZE); > > +static void __init early_pgtable_flush(void) > +{ > + write_cr3(__sme_pa_nodebug(early_level4_pgt)); > +} > + > /* > * This routine does not change the underlying encryption setting of the > * page(s) that map this memory. It assumes that eventually the memory is > @@ -158,7 +163,7 @@ void __init sme_unmap_bootdata(char *real_mode_data) > */ > __sme_map_unmap_bootdata(real_mode_data, false); > > - __early_pgtable_flush(); > + early_pgtable_flush(); > } > > void __init sme_map_bootdata(char *real_mode_data) > @@ -174,7 +179,7 @@ void __init sme_map_bootdata(char *real_mode_data) > */ > __sme_map_unmap_bootdata(real_mode_data, true); > > - __early_pgtable_flush(); > + early_pgtable_flush(); > } > > void __init sme_early_init(void) >