From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758036AbdDRVT7 (ORCPT ); Tue, 18 Apr 2017 17:19:59 -0400 Received: from mail-bl2nam02on0067.outbound.protection.outlook.com ([104.47.38.67]:5088 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758021AbdDRVTu (ORCPT ); Tue, 18 Apr 2017 17:19:50 -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 18/32] x86, mpparse: Use memremap to map the mpf and mpc data 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:19:30 -0500 Message-ID: <20170418211930.10190.62640.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: BN6PR1001CA0004.namprd10.prod.outlook.com (10.174.84.17) To CY4PR12MB1144.namprd12.prod.outlook.com (10.168.164.136) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a2ccaa8d-4eaa-438d-def8-08d486a09deb X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(201703131423075)(201703031133081);SRVR:CY4PR12MB1144; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1144;3:PWXrdgu0D2RcBGe0rsKnnzEOuOnm6z9b3zrhs/Ew9acwr61BOcMa7yzmmrY4Qa86iw0bMxamfHWxWKmEgHlPcfIJI0AYZ4Ts9LTtBT7KEALNDeZ0z+GNPOTU7Yrskk7NXK4FDxdNcJFXTd2QRBtn5PE9sFp3/b7e/718PKcdnGAyQDve0xmBeNbTS6bhcsgBzWS94uZgEdscfwg9GzV0ssXxq/Gmo+rV1DEKusxsdQs22yQ3CK+GvmgD0JJjlhu/zpc0/vH/oL+TcHVMx3LvwHSkJRT+/kJuh+X4Usjvv1kODnQ2kce9b85sMN3nThE6UCtwIT6lduZc356n7ElXp9v/JQXUv6kaitLTnIXutqU=;25:jHhliZKB1I+d+mSoDzi1T3hzcAPRWYr/y87W3QoWUPDtx+xBI78CgCsWHhUc934gyBfwCrXXxcpH/fx90W7n/Ht9W/8YC8pTij8iOwVHFNr8cFCe683WtFIZeFDA+8tH9vUa7LBLhG2zOd/d5AFhkz26rOIboqaBTegKfmyYeS2u+LZdUmWduZkis9smv9qJkW9pBbtz49P0m+GXU63w9rQHsloojODvBScLzGHok+MAM2/s3T26kqjrbGYazozwf7ZpnLXqMUhXZtMSlwK6nvdjm1ep2jWRaiR/ihfmyGwfGoSfbQiUdut8SxGTOVxF2cmsP8ck41hNkL0RBGRcMd+tOY2YAZErCiK7KPCkXzLPHwZrgCLDeDQvz3ZIF0P7btCPBVrphywIANtkh9ijk9faRG8+y/n7HA77fkeg3j9qCc7LlBu8MI/e8mwWEeQ9wmbMyZ/fjtntKaJZyeXUhw== X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1144;31:BB0eC2w7eOjt8mcJiwnXrdIlheEkVrnDkJF7Nzi2/TVg/Y7jcFHZ0YRWnI7iuebSbKS1H0G+zbGfD05LY5PFpHnU3OZOzOPnCpudxbChL9s+MkhL+8B6AJWzyRYnZV1kgbVKpVNnok2HV5Vum4CS1JZGMtXJKlKmbKqux4kLFwfTKXnZD0dACJFeVedNuIdKxbRLqxwv+IxMp66SfVyTl1u8612/C6gjjT6IjEgWE+fEvyMDh5sP61DS1/urX2Aj;20:cYlhuzEd8Bz01BQ8ZcqnynYKibYYHM00ltY70WZB9Dh3GevdP1v0W0UXJ57w4VswItqW9nEk3qRkLPLG4AKvrO06zphlVRLNr5FjJhDr6kNS7jE4ice2iSB3oZU2ZPeWAFE/sR+/5EdxVguhdoVBYs7zp4r5NO249DabssdhAJhSJB4GUklnbk3i5XNyQHrWJ9RK6fSUvyvy6N74J7Kz2vqAjkvoYH0Uwg82FMSclkyZ6FLHQStoWHigBIZ7RS5YFDT+zcT/QEnHhfmqOhuCWnRtC85yTH5LiONg37Fdkcj51t9vfGlvEvs5GI24/6jsibzuk+EM1rBs6FX8FuUOHCUcfimry+nfdOVBWvf2ac6SdhOKbCuPCkIGwgKZDajFvmm6ZJP9Y3FYibmbMkrmggPEpbw3rIIOp1b09cg664ShtfBZMsvs9tvXqaeawsshcc9eGTc7B/2PYTeZ/vnSkHM9s7O3luk3ZQLyDWQztG6Rw5e+1qEmVsDIk6yUGFkz X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(10201501046)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(20161123555025)(20161123560025)(20161123562025)(20161123564025)(6072148);SRVR:CY4PR12MB1144;BCL:0;PCL:0;RULEID:;SRVR:CY4PR12MB1144; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1144;4:YuteqG8IZFfyt0Ig0jkaRMUNeyvGTjhB4z1z4l8h/qP6d1bG54xd2Nlen27pLBTZzlkMy0sjXZDW29iCOhFI/oTuoTZ/J1O84EkIWZ590zJsEgfB79AKgPHJW+MCeuvK1Glvzo+ExH3GGXtXoRNQAopED+21ilRbI30XwLPzs4SjFdabZ7hOAofpyGMWXvtwJxIa4pFlkki2530jPP5xgAEVrlUb3p0iODYm7KFmlZWe0vEJqxEtoEN5PiFSv8XKqaYoaU7BcWdNh3uks4HpxTa481qXDRTCRx/YYqPslvicSleUoKAWOlEZWVNP03VtG9EdTP9ygcdLS5fl+rHfmLANaPjHythWyml7UZYKHwMeAp/bUQb+T4Xd9dzsl/qABIKBVZAsYBmdcfx7nX6I0vYcC2SDGUjObncl9Z9j+fzyaJR2I/QaxqaysBDmGhuA98wdNi/Vrbpt3UwVtdyHiedvw1tCbsFGDxyPslBI24u1T6clzf5GH/0ZiHtvz49YjaJ9hgCQXkc5uSjZEFWND27hYktWnYyaXwDhARNTRbYC5k7RJVItqlX466HrLuZ48HMlhLI6SydiwXRT22FtQzC5QN34jHuBk7LBZ6TqeomqTzizLIIPAE3rHotOSXy5zPNfw9I7v0lUcMEC4qZDND6Refcw/C0ioC7h4L4ynmQDijwmaU7+KmZloxkiOZBUcUemjdOKH4uNizPUHItyjm2uscA9r6BvE568KHC9WUH+MPodX2Ryn3rAv6qLDg9QzhIbd/hlr3sYXNeBlqEBjg/LvcYKQl6EQ6s/V+1EEZN+5NNwD2k36kijBDHXjEPO X-Forefront-PRVS: 028166BF91 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39850400002)(39840400002)(39410400002)(39400400002)(39860400002)(39450400003)(5660300001)(7736002)(1076002)(2201001)(97746001)(305945005)(7416002)(83506001)(2950100002)(25786009)(86362001)(3846002)(6506006)(2906002)(230700001)(7406005)(9686003)(55016002)(4001350100001)(6116002)(189998001)(54906002)(53936002)(54356999)(76176999)(38730400002)(33646002)(50986999)(4326008)(50466002)(66066001)(81166006)(23676002)(103116003)(8676002)(42186005)(47776003)(53416004)(921003)(71626007)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1144;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQ0OzIzOkVnVlZMRGNsYXhVZEJ0eTVjV1FobjJ6V2Zm?= =?utf-8?B?SlFHR2g2aHdnMW83K2l4WXdyYThYM1Z4YmEvdVdvY1IvYXl2YnpReWpBdHA1?= =?utf-8?B?WlU0SjZabzJBbWt3OHlmSGk5TVpaZ0ZvdUd3L2tCZktRaS9Ga2paeDFXMita?= =?utf-8?B?K0w5Q1NQZ1JzNWxEdVZZVE1ZaE9MVFZ0ekdMNU5pUnplMDQzR0dZYzdNYmFt?= =?utf-8?B?Y2RYNHJSem1sM3hiZlFGZWpTL0VucG1FRXFCdWhmK1REZ1FneTdaakpTMnN4?= =?utf-8?B?MGRTdFFlT1dTMnJVK0E1NGtBVmtXSDRDdGg4c3FYZGx1UGpobG9iVnFhZWVQ?= =?utf-8?B?cThNK1IrbUlOM3lybFpyb05yUjE5ejZKSTlNcGpqZUczZ2R0SUxhdUpjeUp4?= =?utf-8?B?Wko0Tm9xaGJHYnpVVGw4Y2FZMzRwOVg5OW9qYWZ5OFR6TUhJS0hTK0NWOWtY?= =?utf-8?B?SXVPR2dsZWFibFVVRmZyZjkvV1BOU0g3L0RBaUJEWjNlb0tRM0U4WDBRL3lv?= =?utf-8?B?Z2xQZU5nRjFNVlFMWXpORllhd0tIYnF5QnA3aVR4Yis3NnU2YjhBNDg1SGJ5?= =?utf-8?B?S3QwMlVEQnY0bWplK3NYUWZ2R2M1K3JjVG5SVVBWWEFhWVVwRjdXbHBTV21S?= =?utf-8?B?clplQTlZOFJzbXZBcUs2QzlqQXg1b3FGWUtWZk9CcnRzQXh3akd0dHBKanFW?= =?utf-8?B?Q1VUVjVmbDNrL1FMeXI2SkhDYVNzZTl0czk3MUF4ZFNVZm0vQnptYmw4SjE2?= =?utf-8?B?dXkraW1aNGc0U3RFRTJyTmNWNnMyK05Tbnh2MjduUVQraHhnMDZOdUpwT2V2?= =?utf-8?B?MVZXWENUZEdGSzhEYUhOMGhoVkFsS3pFODRwSE5VamdvaVJpMG5FVGlaclU5?= =?utf-8?B?UU1OaThRVjhaTmh5RENIZ3VOTTR1c08zTmNYZGo4S25zR3VGemxjdXlWb1NN?= =?utf-8?B?QXRhWCtmWEJXVVkxK3BueGwrOEpud2doUk5nSVZHOGR2cUc5YjltR3JzRXZH?= =?utf-8?B?R2QzOFlrcld0am9UbTdJc2NLVHV1cytkeDVPblRncXdxVnNaOVVVa21jb0hZ?= =?utf-8?B?UDFxK295NTNZL2FEYkVtTStGbkdPd2xvM2ZzOHlrYnVUNExtdXRrMGRaaDl3?= =?utf-8?B?N05idFQySlVwdDAvTkl2RkdlcXVEZC80WmR1T2w4OGxNeGtmWmJvdkFTMm1D?= =?utf-8?B?bFpVNzk2YXlhbnJRbzNrWnJnZjc1UDJPRzQvTzl6ZCtZeUdUOFNDbXZ4SkxY?= =?utf-8?B?UDhOaHRadzBUTlM2YlZFckV2ZGw5ZmhHd00xOWJnSmJ5MjZpaC9UMjMwYlEy?= =?utf-8?B?MWV6dWxjWjErZFNobHhndkRVNEpVV0lSTnVTMFJrekRWdWhOMXNMNTU4aFVL?= =?utf-8?B?aFpIMjBrWUZ1M05DcmUzblFkaWFhRnV3SE4vbUVTMTdtanExU1BrWVBTRmIv?= =?utf-8?B?eHZ3WFBEd3dqVXE1c25kSU8wOXdiU081d3MzYkVIQkt0bEZhZjFwWXRRKzVq?= =?utf-8?B?b1dYRU9uZmZ0WDc2Y0Jzd3dvbXZRTFhDSVZPWS8zNEErV3c2bm9Eb3pIbkEy?= =?utf-8?B?SjcxRXpyUXYvYTJJMnAwVE8xSUxsWUZjeEovT29naFhTOWkxMlBBeEZneXk1?= =?utf-8?Q?FlyjeFWxYEDLAW9l6LJF?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1144;6:Ewvv3N6ZC4vU6wAEjk8MMTikYxy2gwN42v2kZKCzS/+7nbpn3VnvCbR+baoHkAedPPDANItVinr+g6O1N1kiSgnWw94s7Nx4ua3DkCFSUoO9jrvfBzWmVy/TvH72L9R+WcjxaZU9lQO/q+QgPXTIswBI3RfJ/t6QC9hPHgeYjqpfMcU8oHb5Nam9NCSSv2BDo3hN9NA8iNhCnqvYfhEDNEhqLxAk/mwOkn6BDuKqx1mDc+2sDfddehwHxEYavg3cB2mDH5L89kDF8EfA/fWtQ0wTzbaPtUBrQX4VtDX5Ei2F3+O9ibK25HzjVAuDvgKO9UEuiVU+1vp+G5U2+pq6YyidNGi5/mlwyW0j1U6wIRif36jQtB7W9Yd/7ox9YnxWv1Q+5Y7kY/mf6j4m+Fu0XDquqW7qbrRjc434MtxFCvgCXQRaH0xBXvbJFWDj4wCfvAb1adjLcBGaD41mqhJMDHCRnG1KVcWDnfqCtgnL7eg=;5:QdK+PTuqwBBLuO7yx4qZBXdgt+MpAnHAvPUtAV8YEiwpS+FUsZU3UlXqY/CLHxUQb9nBVlgqxyjmJtiEMWlogdrBXkgIdYgVqpXV9rK4xtabgqhsSDiJ7rQR5By5w3zdOl4ioVz5UP8PjVloeXAmPQ==;24:72H5K89TLrOaHoihrOUbjaQFYMEfTNVLlrTjX8JCGOx1v0RO54laSMHkUsFxt/uFpQSIsO9iqfKocZy07szUc3gJ3fNHfvfXCaDc5wQDK9o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1144;7:o3S1iUMN44H4QdYBFiaczg+UDyQpmC5TOt6cHX2gdj9oySahSnhAkpHA+q1p2gAm17/Gv/f/5r6I9BQ0mHBWtp9KJTvU5qRno8yTgZzLMBKheBQVWmpQi5x16SP//b2l6VyIltCXQexXTQ9iHoQ5hYqAiBS5Q3Afnb93+/L2nveI56Eej9iWlZFdSTyE36viKsxXx/QmQTIIe5rtbt6ZrftebnOpJM2wNZhoI8/fUuYAeFThC9my68omoiQEKq2B9M5/EatfmHkTPnjnca50o8gICJbtIEvjPtXqgovbMMD+oH7POBuZypLM+zcJ7sc0i9womOKRIv/QHt7JAAGk4Q==;20:0psr/s0yOrAqm+7dddXeMCgLhgp/BKjd4I3Ruzrf5H+5jx8dRYDKtRkifurEjAdfZSrP9jcruVbGY2r47ygxLOGGCwK31rqOEidokPhLtkwla0Ygguq3yW2AVcgsbOtR1yR5XmRYqzyqDt3V1L2XYBLlLYmPcDkILZ0zGAOlu+fr3a7BFD9tUg3isg99wK0q0HC1ncuaSw2NOnFD3k0hSR23ixlwMcsLZm8VeTCNpgrmLFhVR4If7z44Ubxzx0g2 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Apr 2017 21:19:33.5685 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1144 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; +} static unsigned long __init get_mpc_size(unsigned long physptr) { @@ -444,13 +458,21 @@ static unsigned long __init get_mpc_size(unsigned long physptr) return size; } +static void __init unmap_mpc(struct mpc_table *mpc) +{ + early_memunmap(mpc, mpc->length); +} + +static struct mpc_table * __init map_mpc(unsigned long paddr) +{ + return early_memremap(paddr, get_mpc_size(paddr)); +} + static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) { struct mpc_table *mpc; - unsigned long size; - size = get_mpc_size(mpf->physptr); - mpc = early_memremap(mpf->physptr, size); + mpc = map_mpc(mpf->physptr); /* * Read the physical hardware table. Anything here will * override the defaults. @@ -461,10 +483,10 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) #endif pr_err("BIOS bug, MP table errors detected!...\n"); pr_cont("... disabling SMP support. (tell your hw vendor)\n"); - early_memunmap(mpc, size); + unmap_mpc(mpc); return -1; } - early_memunmap(mpc, size); + unmap_mpc(mpc); if (early) return -1; @@ -497,12 +519,12 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) */ void __init default_get_smp_config(unsigned int early) { - struct mpf_intel *mpf = mpf_found; + struct mpf_intel *mpf; if (!smp_found_config) return; - if (!mpf) + if (!mpf_base) return; if (acpi_lapic && early) @@ -515,6 +537,8 @@ void __init default_get_smp_config(unsigned int early) if (acpi_lapic && acpi_ioapic) return; + mpf = map_mpf(mpf_base); + pr_info("Intel MultiProcessor Specification v1.%d\n", mpf->specification); #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) @@ -542,8 +566,10 @@ void __init default_get_smp_config(unsigned int early) construct_default_ISA_mptable(mpf->feature1); } else if (mpf->physptr) { - if (check_physptr(mpf, early)) + if (check_physptr(mpf, early)) { + unmap_mpf(mpf); return; + } } else BUG(); @@ -552,6 +578,8 @@ void __init default_get_smp_config(unsigned int early) /* * Only use the first configuration found. */ + + unmap_mpf(mpf); } static void __init smp_reserve_memory(struct mpf_intel *mpf) @@ -561,15 +589,16 @@ static void __init smp_reserve_memory(struct mpf_intel *mpf) static int __init smp_scan_config(unsigned long base, unsigned long length) { - unsigned int *bp = phys_to_virt(base); + unsigned int *bp; struct mpf_intel *mpf; - unsigned long mem; + int ret = 0; apic_printk(APIC_VERBOSE, "Scan for SMP in [mem %#010lx-%#010lx]\n", base, base + length - 1); BUILD_BUG_ON(sizeof(*mpf) != 16); while (length > 0) { + bp = early_memremap(base, length); mpf = (struct mpf_intel *)bp; if ((*bp == SMP_MAGIC_IDENT) && (mpf->length == 1) && @@ -579,24 +608,26 @@ static int __init smp_scan_config(unsigned long base, unsigned long length) #ifdef CONFIG_X86_LOCAL_APIC smp_found_config = 1; #endif - mpf_found = mpf; + mpf_base = base; - pr_info("found SMP MP-table at [mem %#010llx-%#010llx] mapped at [%p]\n", - (unsigned long long) virt_to_phys(mpf), - (unsigned long long) virt_to_phys(mpf) + - sizeof(*mpf) - 1, mpf); + pr_info("found SMP MP-table at [mem %#010lx-%#010lx] mapped at [%p]\n", + base, base + sizeof(*mpf) - 1, mpf); - mem = virt_to_phys(mpf); - memblock_reserve(mem, sizeof(*mpf)); + memblock_reserve(base, sizeof(*mpf)); if (mpf->physptr) smp_reserve_memory(mpf); - return 1; + ret = 1; } - bp += 4; + early_memunmap(bp, length); + + if (ret) + break; + + base += 16; length -= 16; } - return 0; + return ret; } void __init default_find_smp_config(void) @@ -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) - 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); 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); 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); memcpy(mpf_new, mpf, 16); + unmap_mpf(mpf); mpf = mpf_new; mpf->physptr = mpc_new_phys; } @@ -909,6 +943,12 @@ static int __init update_mp_table(void) */ replace_intsrc_all(mpc, mpc_new_phys, mpc_new_length); +do_unmap_mpc: + unmap_mpc(mpc); + +do_unmap_mpf: + unmap_mpf(mpf); + return 0; }