From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752786AbdFPSyB (ORCPT ); Fri, 16 Jun 2017 14:54:01 -0400 Received: from mail-bn3nam01on0044.outbound.protection.outlook.com ([104.47.33.44]:13868 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752158AbdFPSxw (ORCPT ); Fri, 16 Jun 2017 14:53:52 -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 v7 20/36] x86, mpparse: Use memremap to map the mpf and mpc data To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , Radim =?utf-8?b?S3LEjW3DocWZ?= , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Larry Woodman , Jonathan Corbet , Joerg Roedel , "Michael S. Tsirkin" , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Boris Ostrovsky , Dmitry Vyukov , Juergen Gross , Thomas Gleixner , Paolo Bonzini Date: Fri, 16 Jun 2017 13:53:38 -0500 Message-ID: <20170616185338.18967.80659.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170616184947.18967.84890.stgit@tlendack-t1.amdoffice.net> References: <20170616184947.18967.84890.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: BN6PR04CA0057.namprd04.prod.outlook.com (10.174.93.174) To CY4PR12MB1141.namprd12.prod.outlook.com (10.168.163.149) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PR12MB1141: X-MS-Office365-Filtering-Correlation-Id: 7a74636f-30d2-4982-d70f-08d4b4e9034f 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:XDazI8XhOBvdmZ4uEZ95e+NI5MsrFnlZ3JW8/80NQqndPUcsJcN1o2ztZNAjIf5gUkO3/j0gcfUA6rTjbqCbd3U+qfb+lomlVeP8brO5YNBVvwh5QJt1z+PnrZ2n9LVHv3Pm3+TEeRi+j4NQZyZg8nK6DgpkxAph0JyRqxj15gvls4MgDt2mT+1l0XgsfuAlji2m5LgOFOJQAhwUFflUTT/iig1fXvFDlLqMdroE5qoA2tGJIWvydJOrFZjzrt6HWpyuRSlAgQpzSbOABZgOrvoqJXLU2UiF0RwcGodtXggVLRkOIXUyt04Q/y6wtJOHoPG+/zjzzosVPsNcew6LDTYugd+a+sYUcTPy1XzcBGg=;25:rreUXk9FLOvDDA95TAK81wqGcsfQzxFt1Ty8CyBIeJmD7mhubhaLZfvXyWm8n5LVsfgY79guMcWIpUv3kXOVa6ODfiGyXV3e/Z41/jFpcnS314Q6B9s2vQaeEhCV3TiWRvwm5djYP9wtKOMsVeDh2lYByp4mKt6/fgV9enEY1Cyjf5VPVJve0fpWyqw6uq9DB0/+VQDWlhy47MTVeClqtGWUPn6tD0Qtsd/vxC8gsIMEUzAFU2SvreAAH3Ts3mi0IVCAoELZkj/K+3qDzPvENnmV+TCKuo4aCdUtQITSO4Gg3aE72gsoJqNfnfQdBF66xehnqeg7pN6eOS+XQ+TRMcDnyk2tEhgSCLLiO+gFS8VD2hjzmOtXEuVwuXUMxvXWdmwHqHpQpBjNuKi9HG9Bpp6xREiBIsy6g6MyLXYQll/jl8EhqEjWMgMqw+JB55SpD8MR7+eF5Zzgdc51zQ+nq2SRpNvGIUIhg7e9quJWvME= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;31:ifkPktM20jnZudSEojV+QihJwBMaJrIvc7G0N6vjI0HZ5bfYFFG5rGyjReon3+Rrho5w3yoUiK0gHVM7N0RevjTJYQZxsGzAR/oSQuZDNH3aI7oD71aTW70ARNa/YgpnI+3SiKY2Rv8MiHXqLwKzSYBUkbYm6raoMcjuBV1F3+y2STGRRKoADSpThfWI4KojTKIASL+fMrSESs5MTltEfNGKJOUauDb3dCktgilDbjg=;20:bZL61IYDnFGvKW98oMXvIj6mDisj7IgHjlr+pnYPgJutdTOyKvgFj1dkpjWcSGcy4pWp8EsE/VHBOCI+w+NUUawECj3eZ7/Ik7ecnh/ydJcOQF6Z8T5g4A0qIG8e91fBohuMSmRmvJ1gTSXVxqvC5SzEd9cXOx1WnB7SUfl9WwCIJtMbtTL2V4DzXOxlZfXj1sBHum5EobyT629iu+k4AV2qU0R4fc7PafahhyG3gXUbnmoNgum2fNRvXLttUPsyl3g77drZkrMMjrn9lK8Xzupw38cynVL3/yt1X4oSadObc2KjXjsK9OHXNevUUk19obf4yH4EEhL4EC5WMFOjASbZS6taJnM4jvaKOMs0IHWOASeXjthOsTrj9bse6zYcMdLRIUlwqxFW1op4VzJjL0ebdCOpK+8QNOedEimo2rvTnJj6ssfl7uOtBYLS6hFcTrj1YWV3xhySr7lgdd8/8fvdfQggUUwLYCUHZKNLoYVzl8nie3FY8SyiKhuCRu10 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123560025)(20161123564025)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:CY4PR12MB1141;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:CY4PR12MB1141; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQxOzQ6YVZsdy84TzdneTBxUkxYZGpHcS9oUHp3djlM?= =?utf-8?B?YzJnOHpoSTgzQ3R0YkdNOEVnK0MwSkJaNTZoOExrNForREFPdkJwSGkvWk14?= =?utf-8?B?ZVpobGo2Und2aTdZQTFXYUFmUUM5Z0Q0TU50ZHRLaFJhcGRwcm8rZSs3cmRO?= =?utf-8?B?TmRYYmtGemo5R2w3TDRoOTdLVWMxWUN5MkozNTM2YkExbzVYT2tZbUsrV3R5?= =?utf-8?B?eWVrVDBrZEhYNUs1bFFTL2plRWdaRGxPQ0Q4YUpWRzBWU2wvNmpPVWEyejZs?= =?utf-8?B?dXJiNTExdUt4YjhzQ2JBTmVDSkNiRWdKVEZuRHBRNURDUVpMMzNqK25yTk1j?= =?utf-8?B?SkFRdk9jTC9ZNVllaGZwUFNKajBVR1U0bFFpbkNrV2VmUmJLMUZRekRiWGhP?= =?utf-8?B?bFZHUWxWT0JCLzRvdjA5ckdxcFpYRHl2ZzdVdiszQ25YUTljTHI3ZEZjbmpS?= =?utf-8?B?M0x1MmwyaTlCUEk5ZTBXdnZjOUtUeGNONDEyTC9LN28yVmJScUVDWDU4TW9D?= =?utf-8?B?M2dvd2FwT2dJRnM1eVB1dzlxS01sUXpqcWhYM3B5ZHBFMlRXOS9kcGFxam9a?= =?utf-8?B?ZFhOdWxDVDd1Y283alUrd29KSWpuMVVxRG5wSWZCQytWWDJLQlduS1Y3eVdH?= =?utf-8?B?a05OYkwyZzdsSURsdEYwVXorOUpiZHRDNE5OM1RKRDd2dVVvQkZub3NYS2NC?= =?utf-8?B?cGpmUXU2bkZ2a2pDU3dKUmdEdHhWSzlRZWZLT3BKNmd4U2p3Snh5eVNvZVBS?= =?utf-8?B?L2wzbzBYcmNzSjdVOVhlUFV2T2xTajNrUkg0TlhCUXdvUG1mSTJIS082RHhq?= =?utf-8?B?ek4vcUphSE52ZllIVXIyOUFSTFBMcW9PM2tOUXF0eWJxcmNUZHNNeUxiV2dw?= =?utf-8?B?MkErZHA0UDV6T09GSmpjQ09pTnJqUlFwYlo5a0VMU0ExV2xVbjZ2MUlOSEo1?= =?utf-8?B?SkJ3S0JudGg1b3R4Z1FSWHAyT2ZoWGJMaGVaNmE3MjF3YkZxT09pbkVUYjlk?= =?utf-8?B?bExXSmV6a3BLU3l1NnpoWGJYSHJyZFoyTld3dTdTUGU3cnZXQ2FRQndMUk8w?= =?utf-8?B?dERYekJYQ2IyMGFJTG5DU1dBQXZjMWNHbmRQdi9zMDRKM3hOZWlIVkNQMWF6?= =?utf-8?B?TWRxZEdCSmFTU2hkenk4eUJrdnJVN3h0eGt4dUN3NHY0ai9tUlp5Uy9LZkVB?= =?utf-8?B?OTNZaWoyTUJ4S1lGTDMxNUN1NE9ranJiUjZHdEdaaFRmcDVhN0VxZlNleTZ5?= =?utf-8?B?OWM5OTBBejFpaHlSZHlrSU9kQkU3NnovNXBJTHZlVVdMSnEvSTd5dkNGMFZo?= =?utf-8?B?azhIZG1td25WQURoZ3VFQWs0TVJMTjA0TTVZZzZKL3B6aDRlUy93NjVudGVN?= =?utf-8?B?NEhYT2JwVjBSWHhCRUhjTFdXb0J1Z0VUTEFhUUlwTklRYmJhSnkwckpNWmlL?= =?utf-8?B?S0FVckpHN0tjc2tyYTg5WEJZb2h0RXBnOWJWbkl1cjdVTzlqTW14OXhkMldD?= =?utf-8?B?anQzdTdwbTY1Zjc5bUVrK3ozeWJ2K0Vvck1JajFENmt0dXRUR3QwNzZlWkRW?= =?utf-8?B?ZmxqTmlhM2FocnZCQjVBNTdvY3N6NDF6YkJWQzNzT2JvRXVzWHRhaWtVSm01?= =?utf-8?B?YWtCelptWURhRE5kb1ZWajJWN1ZaTUR2dmVnSmlFM205cE9xNHdKVGc9PQ==?= X-Forefront-PRVS: 0340850FCD X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39850400002)(39410400002)(39860400002)(39400400002)(39840400002)(39450400003)(2906002)(23676002)(33646002)(103116003)(2950100002)(230700001)(9686003)(66066001)(3846002)(6116002)(47776003)(72206003)(53936002)(42186005)(53416004)(55016002)(50466002)(7406005)(54906002)(7416002)(38730400002)(110136004)(478600001)(8676002)(81166006)(86362001)(76176999)(6506006)(50986999)(305945005)(54356999)(4001350100001)(1076002)(5660300001)(7736002)(4326008)(83506001)(25786009)(189998001)(921003)(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?MTtDWTRQUjEyTUIxMTQxOzIzOmJBRW4vTW1PRzN6dGtUWitpUldZS216R2Rl?= =?utf-8?B?bXN5a3JzL0RPRG5yMFlSeHpKRmw1S1YrWjV3K2p3dXdkSGk2Z1FCWmRJMTVH?= =?utf-8?B?eVNIVmJkOTB6TldEUkJDcExveHVtRmJadGVhQ0J4NmxkQUhvcXd5eDRmTG9n?= =?utf-8?B?RUNVN3NNNUUxK3R2aUZxUkZPdU1UQllpL2ZKREJsalFIRGVDMnFSVDMrWDBP?= =?utf-8?B?dXlSV1JUOW02RGlvazc5SnNOVWl4QnBVOVluMnFQbkhBU1N1Um5Gd3hPVkhv?= =?utf-8?B?c3BId05mVmpOVmZtKysxajFEUVNUdm95RUxKbXRYQ2Q5S1BFL0ZMMG4xQXNJ?= =?utf-8?B?aXhQOVNyWXZEWWdRMURUZ2hFNENZNEJwRVEvVVhUY0FqU3BpMW5KTnJ6a0pU?= =?utf-8?B?UFVQRmVGSDVRTWFSN0hkUGpEb0c0WW5RVy81akpxUjZVbmd4SG9sUHladnoz?= =?utf-8?B?S3BaTGZpamJrYVgrV1I0K0wwOGVXbEV2enMrY0t5SDYydGZwRkMwTFkrMWhh?= =?utf-8?B?RkRSNGszeWdGMDZIM1V3WVI0YzFNUlhoQnduZURBMEdLeXQ0Ly9ZTnJMYVgr?= =?utf-8?B?VDVDR1hXaWl6VllwR0x1d2wxMW1acmNJSEk3ZzJjQmU3elowclIrTkovbTNh?= =?utf-8?B?QzRJNU5ud1U4SUR3ZE01c0VIb2h6UjhFQk1uWW9jWXN5eWlzU2dpWlFsanYr?= =?utf-8?B?aFg1bUhxN29lSmdOaUdLNTczUTJYOC9CZ09VM3R1VHlXMXpyZ0xSZ0Vicldl?= =?utf-8?B?aFh4U1Q3WGpFM1htRWI4RHdLUndHaEZyU1g5aDFqNVdDRW8yMHVhY2Qzc2Zo?= =?utf-8?B?Q1dVbHRaNm9SYUdDSnNJYmdrV0V0MDF3U3JMazdSNi8yYlZWb1c3K2ZLMXdP?= =?utf-8?B?WFJtM3lVM3J6WTR4MmFUaS8zeHBmbG5jYnc5ZC9JZElCQjkxQXRHTEVjYUNJ?= =?utf-8?B?ZnNITDJiRlEydkNOL0xLc0RXS1NKOVB2WlNnR0d2b1JheHk1amxCWm12Vm5q?= =?utf-8?B?ejdXaGJmTGZ5RXVRR3JwK0g4ZC8rS3FENVRSL0Q4RERybU94WEVyY0hEL1E4?= =?utf-8?B?MEJ4eFl6TXBSN24rS0pLTnNoTFBlZ0dLRmplb3BycTQwMDk4T2JYOHQ5ZjZB?= =?utf-8?B?MU5QYWxtVGJZb0xqbXVySWpuYWVzYUVpeGVRUDQ1SHZ6dkVqYm84MjBqTFB4?= =?utf-8?B?ZUROUGNNMDdJK3VmaE5RN0pnK2E1bGpPN0VhWUwySjlaTEFRWDJYdFpWMkNV?= =?utf-8?B?cDJOaUNIdllwaVg2eGlTUzh5b0xaWk9hYUE3WFdzdC9ISHRIU1FsL1RubnBL?= =?utf-8?B?aHBLYmQ5T1dGSVJSUFVVWE9RUGFjckRZQyt5Uno3TFVkaWdrRjV1dnI0ekhV?= =?utf-8?B?UUxTUlRFeU90U1NLempDaWExSmlBdGdML0JMTkxBTklzaGFPdTF4ekxCcFc4?= =?utf-8?B?VjUwS044WlN1MGwzU28rcW9HM3lnNGdZKzFqZFJ4V3JacFpyL05qbUpzbVll?= =?utf-8?B?L1BLbkh6Z01lRmFsMzZCUUozUCsxejlDUWNRS2hWelZrdnd2QlF3dU92anhx?= =?utf-8?B?b2c1THdrZjhxTzIzK3RKS2VDdVJaMWRKQXJOVDlNeVJhV3RMdVdDWkhtZk5C?= =?utf-8?B?czc0QnZHSVZTWUtFbW9IeGwyQmNkYlNBSzVqdUx5S3poYnBCb0lFY2pBPT0=?= X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQxOzY6UUJWcVk4ZUJmdXpqVzBpeFY1WTJzcFNhMTNj?= =?utf-8?B?WnhKdWhJOTgxWlJIVzkreEhmU2F3RkFHM3RZQ2VwOGlmN043UElkU1dTczRv?= =?utf-8?B?VTQ4c2gyTXEvMWhSMlJnZ2R5dm03Mm5VaHhpOHQ0OG1FMU9tNHY1MVZJV29p?= =?utf-8?B?ZEdOWnJBT0lTSGZLQVh5R0czRUljampYUTF4QmdybmRLVHMybHNxSWFpVzZ4?= =?utf-8?B?L2xoMzcraFNvYUFlL1JwSjFHTGkxaGw4b0E3czlud29XQmsvblVzMzVQSzAz?= =?utf-8?B?RFk4Tmtla2dkSnhwQlladHpJckZYUm9vUFpTL1cyVkZMQXJpOEltbTBReC9I?= =?utf-8?B?b2o5dDRhb3VPaldwdlc4bUIvd0ltUkFESFZPdkptMk5jeThUOFIvTlJ0ZTNv?= =?utf-8?B?aTBlam1YRDhOalRVVnVZYTVJQzk1L01BS0tnSExRT09FK0Z4ZjdWWW9SR1JK?= =?utf-8?B?Mm1TSFFiU1k1dlVVVFFHNkEzbVpDazR6VjNnMW9BWkcvbTUrSlZDaHNrZUNG?= =?utf-8?B?WFlJTm9tRnRGNjQyQWRqYzdNVTkwTFVNNDdYZjVYRGRxOFdHMW9nM250d1RP?= =?utf-8?B?OEFLS0MySFB6OS9OT3padmVndFRkTlFiRDJhZ25zNVVzQ0dla1VkQUJlcXV1?= =?utf-8?B?MGxDQUFyWTZoallaMEg2TWlrUFUwemdrbDNZRFFnZWZDdFM3ejRYMUxOMng0?= =?utf-8?B?VG43V1hrWmMwK3NmRFZqNWFFakRNZDJLUzRMZi80dGp6MlJRbzRZMWtvTE5s?= =?utf-8?B?VmRGTklHMkRKbUhqdExCTVNrbHFGeVN3MzRhNzlWQnhPZmpma2VUaTdFNHlF?= =?utf-8?B?OHRLZUord1hESHdqT3dESUNHbkZpMXc3bXhVZU8wdXNjVDBjQ25ObVNNRThR?= =?utf-8?B?TExPVDRzcmVQMk5RcGd6cDZ0Tm96cjVuc2NWcUNjdHpMWUM4UkFvN0JZbm9X?= =?utf-8?B?b0p3MnFtZEx3WmRBRVE3cGNPVUtxUzZGR1NMOW80Vi9qdlNSaHV0WGhaYkU2?= =?utf-8?B?NUJkZjlZOE5vK0dGajJEUWp0OTJOeXkzdTliRzgySm5LQU9NWE8yVm5wMnpE?= =?utf-8?B?c3hzdUVEdEdmT0wrVGxjbEIzbUNkTzhlUFNza1pQNG52WW0xVEZVUkxaTDAz?= =?utf-8?B?ZGFzMDVDL3p2c0xBeFRVL1h5ZVVVY0NQaXJaZFA4UERXaHpmTk9mcFVScXRK?= =?utf-8?B?U2YzdkhZY0lyYkVRV28wbU5uTXFxc0dzTGtkVmQ0VkFjOEp2cGxESGhOMjJQ?= =?utf-8?B?NVFSSEkyb1RJUEpzcUMvVFRKcnZkaHNsS040eXJCYUV6YldRT0RCcDJoWWc3?= =?utf-8?B?TEVYNE1EMlhKZ0Z0TldOeFJPaHNFbThiTW5zMnI4M3VTNzVobVQ4UDBRcEJu?= =?utf-8?Q?1EwJiJq?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;5:y18W4/XMOUONrwBdoXF4n56RpPWc5kZP/fV0cE/ETVbBkm8NXN6vBA6r7iDgbZSjLbPL5mEqtUaj9JJOfILBQF8ZuybL0Yq5XndOB+LhdvkFqeO6zA5NM2ww8EkJpQmViq8sCll0REMBeQ8r0kbHxZV6RP3+pVHxoZ0BH15WsPoh/2PGi7WVlQRSsfuTwINuZ+0pZaPCDO/JMkueUbGCqi4OS2v6QYD2gxHy/RNKLHotzmbgYmPlgzGuq5cNLujzdBpsXWxwCBly/IPU7FUZR5rWqKy1sQdsRcnaePXlGtvhDYXXM+vHGHxDKq2zbhfXNNygNm4aGeDYhHBx7OjLnVCoZ16XFujwdCFoD9Zp9tLLV8w1m0xAXmki5ZLRoVE52lpWrKX1JYZ+fuL2MxyeU7VB/W3z0YIbvQjIHosQyi0501xvnPM/LEiXUvMhPJITzBqy/xpRj7mUJQtqADudNG+IlONU4h50MkdIOD7EX/yG2kfzmI6aRhbaXmWlLtyg;24:jyBPco3zwCgM5sIFRu8Fro6MNWoVQ4Cf6TrMfxJs0I8zv287VNNtomPbaEaSoyARl6+8BBlP5wMgt6Ca77M9g3K4JRIpEN/ruKlZLFCnEHI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;7:GuezDVJnamcBhw7JXt5a5ZOW1NJUkbWC5RRg3S7FhtZtQwwSyB92RCuAQKG5HJWBItCBF8PtK8wjf23kjTr+UZ1OHcmT9Gl5JGe9knksaZ5gnuSL8qAB7ZxZdCImRueRYgJX5nX30jxRmMLzIQuILQlKPp4iYMCayHulhYHzUlxeXp8pzK8aX+8SjGWy/8SzhOD+UzDDtuEYzRjH/PiQ63pRCVC9fwU7RF6H+HHD3VxkCP7BOnjldfFqj4hsYMXoyWTqb9riItOatVvpyInCMtdNuGvMgeS9HUcIOIf45riQegrGuvNtHYEjljUoqcbYDHaRyah6NWRH1CGnyNNlZaEFlDmKnXGTtwNL6KfWATDEef0FqmuBiS6oEwk42mBmzcOS5d5v9+RDjqzRHH0ajgaRTapiD1+sikdtxGgKKHBuIM+e6IXZn9AK7zGXGcIR4AU7qkwNj690aQepX6uXsuxdrQwKp+k3ibbsBBj3KiyctaowejX8JxNWCVF9nfoDF0dnn3CfPr7NbCUkBPQRHjTm4iitjZMykprlmR6GxCGF64wRMnNl5GtNO8RR2mvDqx5um1cY6tuHsykE09JkdBJbHwAG1pKl2bplsskhVEajd/M/eCEBXgQ/juF2a3V2T9beSg5I3I+6qAg06KsGDANyi25aNFxhjfWxq2RnIfNQ9eGGq5bD16sRyB7VO/fYrAGASTynRwllwOH8QRJeZgR5eggJ5dI0QRNVepIk57TfPPDYX6jHVAq2J+jYLFV+wMVlMd4AfwXyb7E75obpM7NhHBuZD9MNzrti0zp1lFs= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1141;20:tdxuvTw5atnycAVYgkR/aZCLJea17GNRbdRTn6/wWQ4XWXMkQC2aeNNAXOF/udEuTb8gRYLdbS8norg5YlA/P6e1BFyCIHdD6avfjl6okcHp80ENdHIDDCEHcoHAJ5qrX2ZXthohf2LbliTA9HNWCQO/QsOmzzIgENnDREQGdVFjrQBoAF0H9pVd6qdzDkWqsOtwkH6whcgezxJKsoB9ml4myYmBLssU0xf39bCFHGR2wpJcdF7gibW062htDfiI X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2017 18:53:40.9649 (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 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 | 98 ++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 28 deletions(-) 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; } From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Lendacky Subject: [PATCH v7 20/36] x86, mpparse: Use memremap to map the mpf and mpc data Date: Fri, 16 Jun 2017 13:53:38 -0500 Message-ID: <20170616185338.18967.80659.stgit@tlendack-t1.amdoffice.net> References: <20170616184947.18967.84890.stgit@tlendack-t1.amdoffice.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20170616184947.18967.84890.stgit@tlendack-t1.amdoffice.net> Sender: owner-linux-mm@kvack.org To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , Radim =?utf-8?b?S3LEjW3DocWZ?= , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Larry Woodman , Jonathan Corbet , Joerg Roedel , "Michael S. Tsirkin" , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Boris Ostrovsky , Dmitry Vyukov , Juergen Gross , Thomas Gleixner , Paolo Bonzini List-Id: linux-efi@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 | 98 ++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 28 deletions(-) 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; } -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-bl2nam02on0087.outbound.protection.outlook.com ([104.47.38.87] helo=NAM02-BL2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dLwNk-00029C-2Q for kexec@lists.infradead.org; Fri, 16 Jun 2017 18:54:10 +0000 From: Tom Lendacky Subject: [PATCH v7 20/36] x86, mpparse: Use memremap to map the mpf and mpc data Date: Fri, 16 Jun 2017 13:53:38 -0500 Message-ID: <20170616185338.18967.80659.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170616184947.18967.84890.stgit@tlendack-t1.amdoffice.net> References: <20170616184947.18967.84890.stgit@tlendack-t1.amdoffice.net> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, xen-devel@lists.xen.org, linux-mm@kvack.org, iommu@lists.linux-foundation.org Cc: Brijesh Singh , Toshimitsu Kani , "Michael S. Tsirkin" , Matt Fleming , Alexander Potapenko , "H. Peter Anvin" , Boris Ostrovsky , Jonathan Corbet , Joerg Roedel , Radim =?utf-8?b?S3LEjW3DocWZ?= , Larry Woodman , Ingo Molnar , Andrey Ryabinin , Dave Young , Rik van Riel , Arnd Bergmann , Konrad Rzeszutek Wilk , Borislav Petkov , Andy Lutomirski , Thomas Gleixner , Dmitry Vyukov , Juergen Gross , Paolo Bonzini 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 | 98 ++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 28 deletions(-) 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; } _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec