From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755817AbdKCPbs (ORCPT ); Fri, 3 Nov 2017 11:31:48 -0400 Received: from mail-by2nam03on0076.outbound.protection.outlook.com ([104.47.42.76]:28192 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753059AbdKCPbm (ORCPT ); Fri, 3 Nov 2017 11:31:42 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Subject: Re: [PATCH v10 20/38] x86, mpparse: Use memremap to map the mpf and mpc data To: Tomeu Vizoso Cc: x86@kernel.org, "linux-kernel@vger.kernel.org" , linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, "linux-doc@vger.kernel.org" , linux-mm@kvack.org, kvm@vger.kernel.org, kasan-dev@googlegroups.com, =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Arnd Bergmann , Jonathan Corbet , Matt Fleming , Konrad Rzeszutek Wilk , Andrey Ryabinin , Ingo Molnar , Borislav Petkov , Andy Lutomirski , "H. Peter Anvin" , Paolo Bonzini , Alexander Potapenko , Thomas Gleixner , Dmitry Vyukov , Rik van Riel , Larry Woodman , Dave Young , Toshimitsu Kani , "Michael S. Tsirkin" , Brijesh Singh , Guenter Roeck , Zach Reizner , Dylan Reid References: From: Tom Lendacky Message-ID: Date: Fri, 3 Nov 2017 10:31:20 -0500 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: CO2PR05CA0082.namprd05.prod.outlook.com (10.166.88.178) To BN6PR12MB1137.namprd12.prod.outlook.com (10.168.226.139) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 038c69e5-b883-4221-4062-08d522cff874 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603199);SRVR:BN6PR12MB1137; X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;3:zgopz8LA8QZiSAxc1WvCpPudYUREW8FCvAVbLYaMh63fspvBMXtpWERpFi0X10dVoxuev04nrppmjL1aWQ+74LGgc5FX8CXxrtWveyy1AnXLSpRk8o11xoBJzeCx+WIDHJ1J8RQ6ccLn9KZivn3b5PVZqZI4ts5T7u6HXt/MJ7N9wSpzn2kvJw14BXNuNoni/KUcCPM1L95HDE+N6kTZExyQIadAzczFEpyktlRti2WKJYbAv9LgpZRLbjaELYlS;25:PQ/3hIUBpUovvEF2Y+FEUcXvmYLFbRzUFCtdvReJZJzXcn8SbfeMcXZnV1c6+4y+R+bJvaOL1VZF/sjRYT7CySeX31sRwCWUX3KWTMggIzV0a7JmkSckpH3TpSiv2OzvwDfP97Z/0gfbY+ws4w8KwASRlWYrhKMqfKNB3p8yyunAiktg7bifcGVinIU5j5e2gBZhnY7ETFs3ukxNjDblVvRbQxfz02NolC6ZUjP1ytVxex9aRp6ha4+2Kf1WMqOMSsuW/SEs6/OcN7Tg6XJmTrZTKN4JPEcKiUTIKO/qMBeoCRsLoOCntMufgk8JUvsy8xIWCmiAENYP2OlE4iwPOg==;31:L8IbHMLS+F5Qp0sfgOkt1VRbYdleKk7D9I3YV6ljH0rxEEJ1cwZuk9G7qbh9LL8lfWskJyuKdSuuOan8d2O6Qkk19i9clhPKNaRXPOKnZwzh1IxPrk0qyZ9vXlt62K1vS+hWW7uPRM3FJcDRBoYPoosRGKx1/TgH4S0ZNVy9HkgJTilhoLpsy2cVBY6fRoPHrg8Xmjf55lL6ZBS33QVAijoeCt1SDUX6bcAELYjyvgM= X-MS-TrafficTypeDiagnostic: BN6PR12MB1137: X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;20:KNZ8OAQpLJ9MWKwOiVavfq3LBQjz/MCGnPp/ZpuypJAVgVXEhqPrwuQUqnNSr3HUdns52jGUTWuZXj+ordUh8ieEN0ZaCQTV43WvQWCA64SKkfop+/TJegqFX5vmVXVKdOPM3dyPk4pkAAmpiHwPlu4Wr6Z2d4XH7N7Kmn3pV8fGhPgwnZSS8bzqfYMsJmRuy/TDkxIZvRlhOK4c/m731JAVy8E4zcjIPZ0u33v5roK7Aw2uAErtT4u5UUdbhsoyZBFeMe/AA6rmKGlVu6hIZ70/MGfNwgNp/wqkdp78iI5621bnNP4lTU6Ntj+Bpha7nSBINCNWyAU/TDwB7pkgsw2MU69SB1hMjcvYEjGo1hHjYiI1YJ99fp4iqcjFANSQtnV21jQWrMw3+IOKiYdGbhQq37Vw1GRiPGFgXrvGzYTkMRXiL/+t446z6VNFKa9evLYeoIgzYVn/1jHmWTjbd1lU6oagLgrTXKgwJP59X6MiVUBAqbomSwchbjyqHdms;4:/UixLB95WTUYSo5iJyyJe71QbRkCDRfU+Ptrr8G1Vh2SJzfvDXvcYOA3hP9ycISzgG9nlJiSINVGVGIHubpIA8IudTHArsrWjtJkJaGEIO7cIiuaDY5VzTK0KHxWuzpVBmxFUygRX1WgqseWgcBGfjNsXEVLGu2pn29Zlwhe7uyDD9mS7gm7zemnuQio2oAFVpUTuD/pSk4GIsAKPrarn6pfQl+LduNFrshUaPIrVWRdyFUaOTN4Y8aJAVXvx7imiG4mI3GwhqhQkvd91KIonDRTTh6prJkMh5AO3Qwd1mgqMc12B2dzeGXZOcj8YFtS+IRjIvVT1YWHnYNWqxxiwA== X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(3231021)(3002001)(93006095)(93001095)(100000703101)(100105400095)(6055026)(6041248)(20161123555025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123564025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:BN6PR12MB1137;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:BN6PR12MB1137; X-Forefront-PRVS: 0480A51D4A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6049001)(6009001)(39860400002)(346002)(376002)(199003)(24454002)(189002)(65956001)(6306002)(81156014)(64126003)(67846002)(966005)(54906003)(8936002)(58126008)(16576012)(72206003)(316002)(33646002)(53546010)(478600001)(53936002)(65806001)(76176999)(8676002)(54356999)(23676003)(105586002)(50466002)(81166006)(97736004)(106356001)(47776003)(101416001)(66066001)(50986999)(3260700006)(25786009)(7406005)(68736007)(3846002)(7416002)(7736002)(6116002)(6246003)(229853002)(2950100002)(2906002)(5660300001)(90366009)(230700001)(31686004)(36756003)(83506002)(31696002)(86362001)(16526018)(4326008)(77096006)(6916009)(6486002)(305945005)(189998001)(65826007)(6666003);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR12MB1137;H:[10.236.64.70];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjZQUjEyTUIxMTM3OzIzOk9DOTRWNkt3YjBMRUpPR0tNTU50MUZ4a2pN?= =?utf-8?B?WUlyUHdaYW9xVWtBSGNQS2cxbVVEMldIaDNKTk9TU0xCMk1mMG9YUkRwQm1k?= =?utf-8?B?RzJVeGZSVjkwODBaSEZXZFgrUXV4UDlhVCsvL0hNenJxR2ZQZFRlYXFkR05V?= =?utf-8?B?T1hUTjg5Y0RnMDE0TU1ZeVpXNHNYMEl2dEdqbU9pQTdENEJxb2ZvVG1VR0px?= =?utf-8?B?bkZxdHphTUVpRHY1VGg3eFhIQUpDUGJ5SzlhRFZIZHFxQ3pYQXJudFN1dCtP?= =?utf-8?B?bWVtb2U3aENHK0ZiNDVQbTFOaVRxOWVUSjg5UE9wVEM1OGg3WjkwcnFUZkFr?= =?utf-8?B?SEtXLzh4M2FmcnpRZXR1L0ZVWXkyZXBuSTFPbTN1bXBXcTV6LzlZanpqc3Ew?= =?utf-8?B?M0kzQ09yQXhqOXBnKzlVejhmdWVtY3hKM2NxUGx0MnJBTm5aTzkxanNNb1RJ?= =?utf-8?B?Y296K0ZmZmVESzdXMU5helpwTkNuQ0VadWNESU0rdUh4N1R6N3lVNytoZGw3?= =?utf-8?B?SCtHYmtYSGZma20xRjRjOTdDODJFcEl3b0pDNTVrM253UjJXVmpHOUkxSysw?= =?utf-8?B?aEFFbi9oK3JwRmNnTGM0Q2hkb1VvRVBxaVJNQVo3TW9TTkxudW0xeE92N1E3?= =?utf-8?B?cnR6Y0RFOC9VTlZKUmJqOFFtVXR3L0ZjYldlRWw1Unp3cE4vNytucFlJSkVy?= =?utf-8?B?cTE2M1JNbG9kdmloWUFTK1FFenRBRS9ZZnZmeHBYb1lKN1JOa0d1TS9VMzc3?= =?utf-8?B?YzJuamV4aURKSFRZV3hYSGlBL0xKcGF0aDIxMGpxUmdNa3ZQYjczTDQydzhs?= =?utf-8?B?YkExMlFncmJySllUTVl1ZkthSFQ0Zm4zeG9kMWV6VmFDM2NJcVZNaU84c0RG?= =?utf-8?B?VkN2NSszZUZNbzl6aHRheWFBTlNHenpEcCt2MStndS9RY0pweGxicHhYMitx?= =?utf-8?B?S1hDcVMvMGxqalh2bjhabUJmSG5WSzJ1ckw4TWg0NVQ0b3FIZy8vUHdGWUM5?= =?utf-8?B?MUZZcGVhNmJ6VlF5OTJuME1iejZSVjlYRlBtdlFvaVFCb0FkV25kMjVIRG9m?= =?utf-8?B?ZHRLOWRxdk9FSlBwb1pKRnJGZDUrSC8rVi9taFRBdk1oS2ZzYXIySjRLaGFF?= =?utf-8?B?WUFidC95L0dtTHQ1emNyL2gwempFc3RkKzVIUlJaeVZ3R2dFdGlhZnJrU3JU?= =?utf-8?B?QWtGQ0dRRVA0T1gxQXZxZFdNbXh4OXpCNzRPUUdkWkI5Mk9VbFYzeWs4ZU13?= =?utf-8?B?akhaKzlUTVI0L0UrTDk5d2d5QTR4eFFFTmYyOXpveElRYzBzWEh3YTN6SEpt?= =?utf-8?B?OTRoUk9Ub0k3U0tUUjZXeDgyRHMvZVNwMmQ3K011N3NZeFJNLytSS0tBNS80?= =?utf-8?B?YkJwWkE0Y1RnSmpUN0liMDhaQzZZdEZnYnlqNTRWV2lRV20rY3Q3UDFOMkV3?= =?utf-8?B?QktOYTJzSFJkTDZsOVk0VWdtS09BT2NKS1M3R05yS1gwOFhLcTZhRkVyUmp6?= =?utf-8?B?SnYyWFRNTGVxVVI2OExmdXYzek9sNmZSSy8yb1VBcTBSSFB2MGpYWTdQMW9s?= =?utf-8?B?ZVIrYVRsSWYybnlWYzg1cFV6d2xtazJkVmVXeG9xSmt1UGc2ZHNmZUpUU0JL?= =?utf-8?B?WGpaS1J6MnRLQ2V5Ym1rMzNiRGVwbFE5UlQ4endXdFBJbHJpR0cyNXNDKzI3?= =?utf-8?B?dDJ4aGpGNnZ6S3N6RUZ5bmhQTFB0S3hIc1ZaY1ZvZzJrYmVoUjNmSCtHcUJy?= =?utf-8?B?UjJ4a3grajhrZHJ6U1dJbmFNWlFlWXF4bUgrbTl2dlQvR3c2VE5QbmR4Nlla?= =?utf-8?B?MDdHUGpOcnpnRzlMZjRnT05FSGo1ck5nT3c0RlRuL0w0S2VrbjVpeCtBR0Jk?= =?utf-8?B?N1pLa2tqNnRLT1cwQmh2amZOQ2IrbzZoNGg1elE1elB2NVpxaERrZFZmRnNE?= =?utf-8?B?bVFBMldPU0VPMGV6MWk0ekw5RFFkeFZwckpsZE41dGVOcldaaXFWQkl0RUx4?= =?utf-8?B?L2hSeHVjL0N4VUh4d29OaDFQSDFRT3NxVXZlRFM0QnRkYzIyL3BrdE9WbUZJ?= =?utf-8?Q?xFtDN53lEj+tgdG4Vzn7/tekD?= X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;6:q5CSOb/nynHmIK45srAq4JKEDEFraPIiEBcwbpxiluKoI517TckJBMMFTlSEETUIObNBJbwLa79taryKuA5z2azdAaCs+sv2B+4zXGINOxxAl5oBA5zNXFsMYbWMczTBK84K8NHGvkROjSrnHMHDiTN3PbM1X5hDlxN0V5khzFyQCjFR2PGWp97Q/1wU6ULmqMlLq0Sqep2DzY7cm8ysfzZ1lB9V0gaVqae6r/2jLSX/4r6m6Ub/sMdP8JQnMGbi6whEXWdfcAGYMKArnvKoeKNg08MDgrGyThrMUgf5VcEKDY0YqHZp/0Ew3cWjcRIEGuaMka2R1WhGnpAywAxyt5nRHa0rmHraHI72j5JhMFo=;5:tjhYsnyD55MZuVIpplHt4kBCgMgbes/TCYmF2PEmMU6RyAHodSviWEfBtmZcywXp+LuQpjC/j4oaxM+0Ak3oB5/IaPtjTadiFx27pI+YPaAvg1xXIMaXHqRpql/XaAGLNwAa32ZASlpHAKLozhnB0/uIU2eBHzSiVcE8ch611G0=;24:sRc71Qb65W5wIQ0NO/qFkKbVWJoX+VHcdhNL/cRWfUxPkcAwPkFgb0P68WCUO1ogr+K7Bcpd2tdghcC9KwkjFJWYSvSDkw3ai0SAhCFo4+8=;7:r8/nOlb/7T8ENnj0UmhUj1xgsw3O+3g1fbtfV7l0+08+eAjkgGLx4sYrsxcM/neWTYHvPyoftKmAKl2zgCTl61+d84fnPbEQ3t0H2+KnUZry4oVX/r46FBXHNm9W/4+Jb0DmF/97l8X4anSJwpnOkb+BGuyzjmewwP7mmFGLMpFxB/EgFpQTyrwMETEIG1PGxJK6vEibw3w7+viaydHwunKBaknr1xuHH4qdQ2ZDh0cZfAOd7geCJm3ggk83y2ZE SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN6PR12MB1137;20:gPBvRcdsXcYhctGiOhWe/hCInLn2YcS6egrAGXIoQ5p1UfaZYqH6SeYz88rscTM4kf5DGqrshhZF2BYdwyy/0I7ZTTZmCYQcjEhLJkP3dpQE6/SpcN1Pb9sAbwoReB3zY0LRJyU1JPjDjhW4IrTqxXQJ0eyRiwio5CCOp/5p9ao4cvrsWzpfbgg0WoznjMMsb9s65blCWu2BN+r8QRN8PwTAnh/NlQD4o0Sk96QcZbV6wi7QrqMmAWYX8oMSvEjE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2017 15:31:31.3330 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 038c69e5-b883-4221-4062-08d522cff874 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1137 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11/3/2017 10:12 AM, Tomeu Vizoso wrote: > On 17 July 2017 at 23:10, 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. >> >> Reviewed-by: Borislav Petkov >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/kernel/mpparse.c | 98 +++++++++++++++++++++++++++++++++-------------- >> 1 file changed, 70 insertions(+), 28 deletions(-) > > Hi there, > > today I played a bit with crosvm [0] and noticed that 4.14-rc7 doesn't > boot. git-bisect pointed to this patch, and reverting it indeed gets > things working again. > > Anybody has an idea of why this could be? If you send me your kernel config I'll see if I can reproduce the issue and debug it. Thanks, Tom > > Thanks, > > Tomeu > > [0] https://chromium.googlesource.com/chromiumos/platform/crosvm > >> >> diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c >> index fd37f39..5cbb317 100644 >> --- a/arch/x86/kernel/mpparse.c >> +++ b/arch/x86/kernel/mpparse.c >> @@ -429,7 +429,7 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) >> } >> } >> >> -static struct mpf_intel *mpf_found; >> +static unsigned long mpf_base; >> >> static unsigned long __init get_mpc_size(unsigned long physptr) >> { >> @@ -451,6 +451,7 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) >> >> size = get_mpc_size(mpf->physptr); >> mpc = early_memremap(mpf->physptr, size); >> + >> /* >> * Read the physical hardware table. Anything here will >> * override the defaults. >> @@ -497,12 +498,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 +516,12 @@ void __init default_get_smp_config(unsigned int early) >> if (acpi_lapic && acpi_ioapic) >> return; >> >> + mpf = early_memremap(mpf_base, sizeof(*mpf)); >> + if (!mpf) { >> + pr_err("MPTABLE: error mapping MP table\n"); >> + return; >> + } >> + >> pr_info("Intel MultiProcessor Specification v1.%d\n", >> mpf->specification); >> #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) >> @@ -529,7 +536,7 @@ void __init default_get_smp_config(unsigned int early) >> /* >> * Now see if we need to read further. >> */ >> - if (mpf->feature1 != 0) { >> + if (mpf->feature1) { >> if (early) { >> /* >> * local APIC has default address >> @@ -542,8 +549,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)) { >> + early_memunmap(mpf, sizeof(*mpf)); >> return; >> + } >> } else >> BUG(); >> >> @@ -552,6 +561,8 @@ void __init default_get_smp_config(unsigned int early) >> /* >> * Only use the first configuration found. >> */ >> + >> + early_memunmap(mpf, sizeof(*mpf)); >> } >> >> static void __init smp_reserve_memory(struct mpf_intel *mpf) >> @@ -561,15 +572,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 +591,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) >> @@ -838,29 +852,40 @@ static int __init update_mp_table(void) >> char oem[10]; >> struct mpf_intel *mpf; >> struct mpc_table *mpc, *mpc_new; >> + unsigned long size; >> >> if (!enable_update_mptable) >> return 0; >> >> - mpf = mpf_found; >> - if (!mpf) >> + if (!mpf_base) >> + return 0; >> + >> + mpf = early_memremap(mpf_base, sizeof(*mpf)); >> + if (!mpf) { >> + pr_err("MPTABLE: mpf early_memremap() failed\n"); >> return 0; >> + } >> >> /* >> * Now see if we need to go further. >> */ >> - if (mpf->feature1 != 0) >> - return 0; >> + if (mpf->feature1) >> + goto do_unmap_mpf; >> >> if (!mpf->physptr) >> - return 0; >> + goto do_unmap_mpf; >> >> - mpc = phys_to_virt(mpf->physptr); >> + size = get_mpc_size(mpf->physptr); >> + mpc = early_memremap(mpf->physptr, size); >> + if (!mpc) { >> + pr_err("MPTABLE: mpc early_memremap() failed\n"); >> + goto do_unmap_mpf; >> + } >> >> 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 +903,32 @@ 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 { >> + mpc_new = early_memremap(mpc_new_phys, mpc_new_length); >> + if (!mpc_new) { >> + pr_err("MPTABLE: new mpc early_memremap() failed\n"); >> + goto do_unmap_mpc; >> + } >> mpf->physptr = mpc_new_phys; >> - mpc_new = phys_to_virt(mpc_new_phys); >> memcpy(mpc_new, mpc, mpc->length); >> + early_memunmap(mpc, size); >> mpc = mpc_new; >> + size = mpc_new_length; >> /* check if we can modify that */ >> if (mpc_new_phys - mpf->physptr) { >> struct mpf_intel *mpf_new; >> /* steal 16 bytes from [0, 1k) */ >> + mpf_new = early_memremap(0x400 - 16, sizeof(*mpf_new)); >> + if (!mpf_new) { >> + pr_err("MPTABLE: new mpf early_memremap() failed\n"); >> + goto do_unmap_mpc; >> + } >> pr_info("mpf new: %x\n", 0x400 - 16); >> - mpf_new = phys_to_virt(0x400 - 16); >> memcpy(mpf_new, mpf, 16); >> + early_memunmap(mpf, sizeof(*mpf)); >> mpf = mpf_new; >> mpf->physptr = mpc_new_phys; >> } >> @@ -909,6 +945,12 @@ static int __init update_mp_table(void) >> */ >> replace_intsrc_all(mpc, mpc_new_phys, mpc_new_length); >> >> +do_unmap_mpc: >> + early_memunmap(mpc, size); >> + >> +do_unmap_mpf: >> + early_memunmap(mpf, sizeof(*mpf)); >> + >> return 0; >> } >> >> -- >> 1.9.1 >>