From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754569AbdEQU1X (ORCPT ); Wed, 17 May 2017 16:27:23 -0400 Received: from mail-sn1nam01on0051.outbound.protection.outlook.com ([104.47.32.51]:47329 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754514AbdEQU1I (ORCPT ); Wed, 17 May 2017 16:27:08 -0400 Authentication-Results: google.com; dkim=none (message not signed) header.d=none;google.com; dmarc=none action=none header.from=amd.com; Subject: Re: [PATCH v5 18/32] x86, mpparse: Use memremap to map the mpf and mpc data To: Borislav Petkov References: <20170418211612.10190.82788.stgit@tlendack-t1.amdoffice.net> <20170418211930.10190.62640.stgit@tlendack-t1.amdoffice.net> <20170516083658.fq2h4ysmrbgn23cs@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 , Larry Woodman , Brijesh Singh , Ingo Molnar , Andy Lutomirski , "H. Peter Anvin" , Andrey Ryabinin , Alexander Potapenko , Dave Young , Thomas Gleixner , Dmitry Vyukov From: Tom Lendacky Message-ID: <6e155b8f-b691-2ee0-8977-969aaab6199a@amd.com> Date: Wed, 17 May 2017 15:26:58 -0500 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <20170516083658.fq2h4ysmrbgn23cs@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: CY4PR21CA0004.namprd21.prod.outlook.com (10.172.122.142) To CY4PR12MB1141.namprd12.prod.outlook.com (10.168.163.149) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2bc9a951-f1cc-4f5a-b2a9-08d49d6314e6 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:XqcL5vgkjI/PkuKIZaSYXRIu6ZyrXclq4xZ1xioJRhauCDdNk21uSiDUQ9CKUbvfo747oCwvJbbACFl+NVWjSiGQcI3/CFqT8DXyou81TeMTdYY9z+MvDYxAZOY3ip8SuT9iPhJ52nynJ1uu/442eY7/u6qT6etayoyX6PUMw1+Nrv5e/qnSyfzeRHeEIpYWKpHdd8KHvu8aFGLxGOcv91o8ISbiZH+5suzBj8HgEN+bYhv/Xe0Avd0mLi3CN8+yiQ56RsZelaTRtRV0RJE0jpTMv7ICnBGjZTOG12/eIV05MCxXL3RuvCizElKhdzJL6AGZ0CvjwZ3CuCmqD+XIsWYOWOHbBE2fH/XQTFW9gnk=;25:ZfBJdFxD7qa1cx+dt7IJNrYJIpsG2laiVCg6PeIxgQenHIYIRIyzSD9CqRXMCgE4/ZiyBNw1a05v+zASKBYM9k47igWQYsa3qFmJlwXVg7dfxVQDWrfA0qnZ5g1uUyvun+lfctFsVxIgAmeEt9QcUpSo8e8PzCv52sqoHveJS2+QS/N2dYb9NeEzgClsphBUftHm0OcNzSqc/FrQznVCargGoc8huWtITJp1vLRce7GK9sZHRmla5Sse++qjHs2SnrrEUAKlnHiutIqhfl6ojMD9JghtChc2/QLi/agogxg6+4ML5iSsR1bE0SsVsSkPTGO5DvXa3EQG7FSb1BzEJDuWT6ZWRuiWsuohTuBlhnFcB53QPjOF1TvwLjIJQgHiXdExXVQl00Mnfw4Le16a5kqaMDIEsso5A8JBX/X/XJ6qSqO8EFPyRHf0os7ka/NcubzzsXLPxk7j1GMYz9aZiX20NG7oVOcAB5e6YLYldsk= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;31:asZ2hdIdtssVDDXrcz9rqRAPuHbRE7Nv5sh2fbD3whzRxAAAuJKNShOt0h8KO7rAecVouqn+MSK7D4+zHwk/uwL2VfeVBgcXEqQWdGWjUjCOV0iobrberJB3d9N4eaw6ENIxQJkdLRJ2Ec6L0rVfCWW6ilMFaPULch3d7Hn1aZLrR7o/MAxGtu8vMWXaLIdfc0rNeIaur2gQpx+Xa4wQe28XQ4DpuX499AlDMsKMibY=;20:ro6PF/Iy7uvg1pQbv7oKnDuY83GMwWWr2NIJ0qiL4bXq3Gg6AogWRrwHxw/Epvyhzi5vZcNRNvACfIeLu44th9S2s6rwtwGoOkgXa9Bu4rEP3/USTasz//f0P7/Lc43n4MQ86sJga9ECXZTIVXethSPJxvJizIBQ4M78SzHxUUKPkfYtXDMyNarqoSwcD8RsNgf9G+NnSihHuw+HhYN8wA+Q1SRrY4KRDaa566H4gL82bn6xuf2mDOaL+2uCC47btrQlPsBoldUogMiRDjT1+tRILBGZC+ktW1ShMYG27q5H5pjsJxtN2qOTSbp5SGykTZx2j7617lz4dPeX8aFw4mrYZH7fFLhwRrzb0+Tx9czGHAS+/Lqyh1EwpYl/Y7E6BLY5YBsTuRA22nK6+pHI5MTuBkdoau97rCYaP7iA7fL2Q6+W4ceuTB4CLtYnpk8Nwv7O3NtntllJToWcc7/JmRaciNkHKNg7wC0Z16egwUvKQfmBPFtfHIVh572NP0+L 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)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123562025)(20161123558100)(20161123555025)(20161123560025)(6072148);SRVR:CY4PR12MB1141;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1141; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;4:W/6B75wksfNEi9svsFC2qrrhv+EbIv8YGGUODEiTwaA0PBgDOsJk0poWwK2EfwazXhtFWJwvKGru/ZpOZV/bUg5T6X5WxsZvxunUL3p35sXVZmUrPnNJeeBv5ffdnswKfDIasuWavhJydHB3cfgDfMy0hMioCUrB4Ac1eAlrtfS4/r1LLkmiEXV6Anu9X7fwCaTuttajjoHWvo5UkNF/PJdP9oLF7kTZbR5QrVOTYTKtnrKy5I9Nv4Ep1AdAytsuf7teKmydnPtZVedBSca8pVCt1+AzoNViOOYEe8LhjHY4jOYbpyr0MWXpWgcyBuO8Ospd71QweHz1fnRuDMDnESRMtPrtFc/aqvi3pfeIXKgF9+J7DMS99+gnB6vlVQRA7I+pGBAYPlngDR4JyKHP/zOGqG89df9W8mToj1v5H5OiXeNE2PiWtUOCHJS9mmCYMqvBkeCFgUdrwknsVxLsoHM7mWMW+9EEnuxle+zPUIWnbw+/2ccL5oyFAGT7sphDjGjydL+Ee2JPcmV1sFiTt+1pUfJNLyoko7C+6Esmr/DERzGdSU3Wbt3rFyUO1QsoOWdIkzjqdEd27wyVghfAAwxrmTC3JIZplJBf9F2BMJz15zgz30HHv4ZU667s0DJ9nsjcUNe+tnDiTTY1qR9S7gKhX+6ZUTSwwIBaacFAG2n38GDLx6mIGMDeBk6WqV7JzV7l3Mo9oN7JBs+BHrfQQE8Gk3QNK/7hf+/HMeJv1uE2M14syiUGxLJr7+Vx7vHu1DJ/Si3f/8LYaWP1l4XmEJRKk6m0ROFeUtH8YpYqqwV4MMbot0HiAvdUURmfOOo+QQJIxzhBPKF15nJPfcE97g== X-Forefront-PRVS: 0310C78181 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6049001)(39840400002)(39850400002)(39860400002)(39400400002)(39450400003)(39410400002)(377454003)(24454002)(54356999)(50986999)(76176999)(50466002)(33646002)(8676002)(4001350100001)(47776003)(72206003)(23676002)(53546009)(25786009)(36756003)(83506001)(86362001)(4326008)(53936002)(2906002)(229853002)(38730400002)(110136004)(65806001)(66066001)(77096006)(65956001)(6486002)(189998001)(81166006)(54906002)(305945005)(2950100002)(7406005)(6666003)(6116002)(3846002)(90366009)(6916009)(230700001)(7736002)(31686004)(42186005)(5660300001)(7416002)(478600001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1141;H:[10.236.64.250];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQxOzIzOk9iR2hRTHU4OG9PaXFtalZad3FLWFhMV09u?= =?utf-8?B?QUMwS0RXUmRsd0ZMaC80ak9FM0RhREdGd1JvUnlHcEtBdXBRNFhkcHhMYysr?= =?utf-8?B?L1hndEgwNk1PYVVCTit0TVZodTdFWmhOQ3VxSzl4NmsvYkJ3RHZFWnNqTmdC?= =?utf-8?B?S2V5TXVMQ2NjNHFsbTRmYWdtTkNsbW9aWi9WaCtYaDFaMDZkUGZpdjNpMzdS?= =?utf-8?B?R0tsV2NoOUdnVUxIcWI0cEVrdzUva2ZoK2luVW1ZNHVESkN2dm4yQmFPSEp2?= =?utf-8?B?bnhnblVtbXBJV3FMakZNQUxsTW5BVDdSbC9yU2FqOVFFVjREY1RISjRrZkJQ?= =?utf-8?B?UFV6YVVmK3N1ODhlbVcwaWJuZVd5Z1pnTGV5YnNGRG1pdWEzcm13MmRhdS9N?= =?utf-8?B?NGJTeGJXeEk2dkxrL0hHdEJhUndMRlIvWVVWVnBtMndSSlc2aGx3bmVPQWl3?= =?utf-8?B?aE1HRTQ5QXZtbFpDSHpSbVVlY3R6cDRrWDBjTjYvVzdFU2FtV0Q5VXlXZjNu?= =?utf-8?B?Z1V5MUptU1ZKRFJXLy91dCtmVHdtTkE1dERiL0JXVlZRTEc2UWJVNkltVWx6?= =?utf-8?B?MC9GQUtBWUdnTjRuN1M5WlUxY1FaQWFzVVZtWksxbHhveVVXMmNEL28zb2F0?= =?utf-8?B?eS95dWVrcTRxZlh4T3dpZDdWQzQ1ZnIySXA2aEVWNkppcThYTDNoS0taRm1T?= =?utf-8?B?d0EzdmQ0NlpBSWlTMGNUUm9mSm0ycEhqeisybUp1OUwyY1NhM1ZISTBkNkFr?= =?utf-8?B?RTFPQ2R1c0o5UUs2RWtSd0EwdFJNbElMenZoaVhYN3pEWS85bFNQM1FBNVVV?= =?utf-8?B?a1lYZTVQUlJNVlZTUXdyZ0JJc05JZGlyeVJLN3JPL2ttcUZyT1c1WlMxbU14?= =?utf-8?B?bXdweCtWVWdxMkd4Z3ZCd3pxdXYrbTE2dzllSW5OUWZxemlQbVFLbVBDSjFu?= =?utf-8?B?Wk9kV3krUUZML1d0b3JVT3RsMDgrWmkxNGg5M3lldEY2R3FuZXRMOVRvVnV4?= =?utf-8?B?ZmtCdFZucHRZTUg2L3cwSnd3bmpmMkw5ZmVMS3hBN0gyQjdnczRCbEczZTJy?= =?utf-8?B?N1JPeHVROUVwcnBCWW1EdDhXSEF4cXV5NndpWVpsSTlnSVJiYXNYNW00QitF?= =?utf-8?B?ZTBXSFM5YTk0Z2oyNytOdlp5YXVzRk5sRFlROW4zN1lieHVPTkhKMktaaDZW?= =?utf-8?B?czd6MHVXSlE3dmZJNHN0UFVaRDBYYjg3WmFXeCs2SWtZVHB1a0xtNXBxZGgw?= =?utf-8?B?YzEvdFp0dHJabGpENEovdG1tZ25qSTlnUjYybFNEZmZkSWNvS3NaUzdlalYw?= =?utf-8?B?WDNtUmtPYWN0ckg2MzhITkxISUY0eGZMWWM2c3c1MmdLODdrQy9WVXYrWEVK?= =?utf-8?B?ZlZiQnJReXJXczVtYy9HaDNGL0kzTE0zcUZsMHdZYWNNeTdvUEF4YmxWOUZQ?= =?utf-8?B?ZWlSazlobThyZE94a2hXL3F4S0JiUTh5eFpnWndyaFh5VUpVMlQ0bW9FVjhs?= =?utf-8?B?WkhnbWVpbDJWZXRGdkZ3eUIxeUZGQlpKbE56M2VxSkZyMUFVTDRCN3BPTzVx?= =?utf-8?B?WlFrelRlaUdDYlR4NkY0bVBmdkdxSmcwajJHK1lVTzhyRDlIU05XMUZCaU5Z?= =?utf-8?B?dWgzZ0Zia0RjN05laUpqT1FNajRZenZaZU9oekdoWVQyWFkwbGp0S3lPM1lP?= =?utf-8?B?K05DSDdpcDEwUnI4aUNaaDVlRHBUU2dPbDA0L2hYM3pRbmZVZFoyOEVDUTBi?= =?utf-8?B?VjA5cSsxQ2o1amE1T1hwaVNDejJSbG5WRHp1UGVpRzJZb2k4Y2lBZ0dvaHZv?= =?utf-8?B?OHpJdDNOcE54K2U1TzZWUkZsRWNRVUdvazBzY204UXVWRXc9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;6:FWVRKGF5tw5dDikfaD+MfGTWjbdk38iTnjeJ99ecy9MgQCkRjG63szLGT0wg8g0kmiNGm9EA9aSsXR6AvI2eJG8b/bnMy9LNR3xP0gkGrRAx3Yqr1cPLKdlf/1ZrNfg2DY98XamHE9F+XYqCmU8EEHkrtKmkSUdMu4aYV8NVWi8esS8k/rc4sEfRvJNPxdsKt8NIkfycYEeSXzCcvUgGMJckYOGpFin7Tk77Kgl17ssPtaqyGrDr/eHA+E3/iVmy/ZOZzBkIpxOw0XntK0LAqonBAy6gapsRHgVjJZDTHSz4cT9CpE0QF24OOzX7/0CyMqLQOgUNVQw0cBkSmdEwW9eV5m/WhQthMzT6Y1I7URKi1m6+L/gJ3VCT8fPRdgJTPTeH1ZgwjNyyXSCDHzVX3QgbI+cxvbz8GWgll+zu5Gx9oYlNjTserpfPMwk2BYcYGqYY1bwsqUqfHlg0xuCb0VQfubj+LZ+/AVORGg+6GYX24WQ0r2VcF7MU10Kr6Q4vsoA0XjyGsoRxPw5V0zajHrjmZBFK9FCVTp3XBqH8YLs=;5:LkzhETXrMg3jMNU293jobJjAGfvfmHGhnezwNv6GVoGz7lkUZw873wUOEVZ4UJHdCk5LYAa/e7bdpeNlmkvJIxSW34yXJuCYx59NBGTlomLpDnDv0fMNfATYfF2sZVRJfkh8sYw0h8Wn+zivJYXb1A==;24:K77iXaPv+hmMwedIbJtI1Pfm+OXV2/wUhMe70+P6bOooKlqxQewCMImTVNg1togYc16kvotXiDPK3QvXuRgYEPG8uVQshvloCcVunAyPNzc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;7:mau9lrcuNrOVfZbUMoO08Bp9CcZG8+GuHSnnTeeibdoVBKU3/WDOkmO3ZMi9ienG44MppWRsFQqLm2bphprvF7i4yeD9kfWZ6edwxiqJoR35FYwJpL/Hqnql94+jTuAfydLwnZjiR9YzbAyTFZ1V9WoRWSTmemOI14+0uKbxIOtUl6d0NMGK+HpOVV/K8LaiX8nwngd2szlKyDk7Q0r2Hf1QaNDWci1E2apapHcUDGLirWQqntXdmfyceI1eZ299rdZ71/b69mGAVTzUZzgqC+xzzXDklB8eJiKeoJKYsYEXuwiLM9gmh3bRnxarxyiJ3HYs3y/aX+/JflLNobz3/g==;20:FGVgzj0JufJWjjG4r9EdDmkYXoLvfgpNJdUZjN1OLxmLeRxWQuqYitnneSCw4Te4uUCsiJB++OGPCuwDjH2AXHT8DP+LcODu7BAhj8XvLFPOTrXwS7526/raYJ6A4b00nnwvZ9PCtp8E6rf63RdbjfW8suQZ6JFfLy3t7y/FAYeudWb1Zz3J4hECQpn46StUgztklHL6cmyKbVmHcA7GLeMCBtO4yTbsqL5ACY4mVXVfCFnco+xkChs3U+IKRcS5 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 May 2017 20:27:03.0507 (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 On 5/16/2017 3:36 AM, Borislav Petkov wrote: > On Tue, Apr 18, 2017 at 04:19:30PM -0500, Tom Lendacky wrote: >> The SMP MP-table is built by UEFI and placed in memory in a decrypted >> state. These tables are accessed using a mix of early_memremap(), >> early_memunmap(), phys_to_virt() and virt_to_phys(). Change all accesses >> to use early_memremap()/early_memunmap(). This allows for proper setting >> of the encryption mask so that the data can be successfully accessed when >> SME is active. >> >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/kernel/mpparse.c | 102 +++++++++++++++++++++++++++++++-------------- >> 1 file changed, 71 insertions(+), 31 deletions(-) >> >> diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c >> index fd37f39..afbda41d 100644 >> --- a/arch/x86/kernel/mpparse.c >> +++ b/arch/x86/kernel/mpparse.c >> @@ -429,7 +429,21 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) >> } >> } >> >> -static struct mpf_intel *mpf_found; >> +static unsigned long mpf_base; >> + >> +static void __init unmap_mpf(struct mpf_intel *mpf) >> +{ >> + early_memunmap(mpf, sizeof(*mpf)); >> +} >> + >> +static struct mpf_intel * __init map_mpf(unsigned long paddr) >> +{ >> + struct mpf_intel *mpf; >> + >> + mpf = early_memremap(paddr, sizeof(*mpf)); >> + >> + return mpf; > > return early_memremap(paddr, sizeof(*mpf)); > Ok. > ... > >> @@ -842,25 +873,26 @@ static int __init update_mp_table(void) >> if (!enable_update_mptable) >> return 0; >> >> - mpf = mpf_found; >> - if (!mpf) >> + if (!mpf_base) >> return 0; >> >> + mpf = map_mpf(mpf_base); >> + >> /* >> * Now see if we need to go further. >> */ >> if (mpf->feature1 != 0) > > You're kidding, right? map_mpf() *can* return NULL. Ugh... don't know how I forgot about that. Will fix everywhere. > > Also, simplify that test: > > if (mpf->feature1) > ... Ok, I can do that but I hope no one says anything about it being unrelated to the patch. :) > > >> - return 0; >> + goto do_unmap_mpf; >> >> if (!mpf->physptr) >> - return 0; >> + goto do_unmap_mpf; >> >> - mpc = phys_to_virt(mpf->physptr); >> + mpc = map_mpc(mpf->physptr); > > Again: error checking !!! > > You have other calls to early_memremap()/map_mpf() in this patch. Please > add error checking everywhere. Yup. > >> >> if (!smp_check_mpc(mpc, oem, str)) >> - return 0; >> + goto do_unmap_mpc; >> >> - pr_info("mpf: %llx\n", (u64)virt_to_phys(mpf)); >> + pr_info("mpf: %llx\n", (u64)mpf_base); >> pr_info("physptr: %x\n", mpf->physptr); >> >> if (mpc_new_phys && mpc->length > mpc_new_length) { >> @@ -878,21 +910,23 @@ static int __init update_mp_table(void) >> new = mpf_checksum((unsigned char *)mpc, mpc->length); >> if (old == new) { >> pr_info("mpc is readonly, please try alloc_mptable instead\n"); >> - return 0; >> + goto do_unmap_mpc; >> } >> pr_info("use in-position replacing\n"); >> } else { >> mpf->physptr = mpc_new_phys; >> - mpc_new = phys_to_virt(mpc_new_phys); >> + mpc_new = map_mpc(mpc_new_phys); > > Ditto. > >> memcpy(mpc_new, mpc, mpc->length); >> + unmap_mpc(mpc); >> mpc = mpc_new; >> /* check if we can modify that */ >> if (mpc_new_phys - mpf->physptr) { >> struct mpf_intel *mpf_new; >> /* steal 16 bytes from [0, 1k) */ >> pr_info("mpf new: %x\n", 0x400 - 16); >> - mpf_new = phys_to_virt(0x400 - 16); >> + mpf_new = map_mpf(0x400 - 16); > > Ditto. > >> memcpy(mpf_new, mpf, 16); >> + unmap_mpf(mpf); >> mpf = mpf_new; >> mpf->physptr = mpc_new_phys; >> } >