From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752052AbdFGTbb (ORCPT ); Wed, 7 Jun 2017 15:31:31 -0400 Received: from mail-cys01nam02on0083.outbound.protection.outlook.com ([104.47.37.83]:12342 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751684AbdFGTbZ (ORCPT ); Wed, 7 Jun 2017 15:31:25 -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 v6 20/34] 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, linux-mm@kvack.org, iommu@lists.linux-foundation.org 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: Wed, 07 Jun 2017 14:16:43 -0500 Message-ID: <20170607191643.28645.91679.stgit@tlendack-t1.amdoffice.net> In-Reply-To: <20170607191309.28645.15241.stgit@tlendack-t1.amdoffice.net> References: <20170607191309.28645.15241.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: DM5PR12CA0066.namprd12.prod.outlook.com (10.175.83.156) To CY4PR12MB1142.namprd12.prod.outlook.com (10.168.163.150) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PR12MB1142: X-MS-Office365-Filtering-Correlation-Id: e3f8a4ea-f64b-4ac2-7086-08d4add9bd6f X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(201703131423075)(201703031133081);SRVR:CY4PR12MB1142; X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;3:mqjLj2awN86/0sUpwM+R16hbQGbg6fIzT1nsw/Pz63QvoNj6A+24D2JGWh4xT1A38cQLTXmIfR8I07H/LmnUlgS7+9m4wCTEmMXctuX1EdF7Rfj7Abbhbl4E7+AVu+5cAtadgNeTF27KV87pH3qo8vSWdqhrxnGQdYXrYhjWVLplfVcen1KF0FAcLmYs5jqIzPPYEPtLbVNp8J5srOnaFA5sHWDFfT1AK5BUd3jwobnFJEP+1Jnh+FeeWudhTWaI62HKSzr81yFrWPKaBCwY5N6FF/rK49KFeD9oxCrFWfzd3PWGql+joixBdX5MQjNC78tZAfOEKxGr5AkoPSCKXiX/xot3g4CmNUT8lNp/AyM=;25:SeagUVKCt8OhQNFT1NAyWPnOlreh7kYHJw6Hjf5MbDHBMjrqLMxqAbvS8uV/cky1Ds+w4iEnzIaWMpwiGOUy/PgOhRTwbD70cM6zbqvXhDbsxdvxPWJGpTd9yrZ8ztPOpRiamtTcimi7yV16DbUeUV8LEw9WqfVs+UP50i10M/OVWg6gEHJrMCqtagYsWS6NF3hTLFPUkUNBzlchvaGhQC/q6scamh/+DUvxSH8qNgF6L6RepCyNu74oLoe7VQb9ce6GezoS2z65uaq0k6fWglu0/o+301NTt4qo3lnwB/qpRhcpdVxz6DBDeglJkKKpPH8DGTXYBIhuwd3defyU4GiXFI6gpCen4RIWDYM6D1pm25t1tAq/pj4Ya8mGzs6bB0Gv0PEvsjKJYGkCRELm+cFQIM9ZY1OptZCQP8eJADiGM0KgtEfNRwNBanmEqR1NzGdkRtnB189I4EI2M2uEG3jPIrVuGj9tlzq9C7wircw= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;31:rwPM2Zzvs86e/FeS7hwRcbQnkFXGPkTMdu+Yb4XfeU/qTEzIpU2XsqlJUi0o0GoQyzHf+UiLLhBLUCgiYyjzfj2V2ZFEba3jlh7MJJ7RXsyccG5+IIPkoKrdqBhX92Kx1QyQ4GI1Tc7R5ydwMt2b40BazsowmXjNftIRIkVPtm/liVIRo7t1TH3RjANv0ccMCjpw6doIQsD1HdsKeNuRYEKtip/k/sY1Upakisk6QHo=;20:sy9sYQwhceBDROuDdSzk70lIPANjevH/+/CTMniwY0s4trku9ShrCtlwWH5duUdZ9Qd+03ZswvwSuPAm+VvRfr+1fSsiJALJfAeATWIhdxSJO8jopHa0At3XIGPbWd5NEC/+WTTbHUpHaK2gkFPXovUYa/ewhCZvhoeM/r29sb5MI0hwmnjZ1C65NtyTMZ8VbHnOn0kXVEzMFwytn0h2SbIWGFUI49Bw0APztbLSr+5L9ISFb5x6h2lfiXxK6FASdoo9e5NUIE2vJ6qUzE+3lyTibv0GVI7GI5meeLXGbCAMgQwa8ojsKzqGj2Dt4edJ2wAOJcQYYdL3CVlCBOnO64MxkIvE4KxoOb9V4OEHjC+gETVKoxqe/Gb1I9othdkPzfoMB7d0JLQHfsZkbzkrbbxyVNMd1zvd5hreF2qRoyv0ir/bCPchRxw+itswj4m4cud58Zo8sdOUipmmvTzJZjgsIU5Gm59RAji4SkUWW3YbyigBYZ3BkavoXXToocxA 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)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6055026)(6041248)(20161123555025)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123564025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:CY4PR12MB1142;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:CY4PR12MB1142; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQyOzQ6aE9vc29aTW9OcGphbEY1VXZ2aDJrVjhhVWx3?= =?utf-8?B?T1lIWlBxZDR0MUwxU0xmbnppRk52YnZxVUYyQkdJMkZyL2k4ZFBua0FDWUp5?= =?utf-8?B?SWhZOFJ3QTI2NmhEeHlZYzVCNlg0TERpWkF4cGJOdHBERzNGd3dOZlh6SkdM?= =?utf-8?B?QnF4c0VJVFRqNWhyanhwMjlUMytJQzNRekNNcitwbkxFTVJRdmhmUkY0akNq?= =?utf-8?B?ZnltYjBMWUNZdEF2V0MydHNJb3U2ZldRVDBWWGo0WDhjektMTm9BOGRyemFw?= =?utf-8?B?dUtKRE1yZlNPdHhsVVlGSW1MeHJCUXJJUk9paXEvVllMOGg0N1g5dzlEa1FV?= =?utf-8?B?N0NyeU1pbU1GV2hZeGxBWkFYNzZEMkc4LzlQSjdsQUp1aStkdW5mLzlYVXlj?= =?utf-8?B?ODRLcTBIbmpnNG8rOWZ6bGFRc0R4cmFucmNqU3k4RTJuMlFHWmdkRlV6TmF5?= =?utf-8?B?Q08rbkpxSDVSdnQxRXdjMlhMNEFnallsVFV5cHYyWUsyRGpoSlQ0SmFWa2d1?= =?utf-8?B?dWxOM1N0NTdGTS9HN2tzcHpNQ05OMGRad09sVERVVnZnS2ZZOTRMWnNvM2pB?= =?utf-8?B?R1N0V3hrWk1vbVcvYnA5b3l4QWFPVUhqNlFCY016VUc0YXlMNlZZaFRBV2lQ?= =?utf-8?B?dVBYNzMzUCtpWHhVSGdQYlJaa3d2alkrS1ZscnRvdTJzeWExUWx2ZHdYdDFV?= =?utf-8?B?d0xkdkpPK0xYMHlybmJiQ1A3bGVLN1hQZFpCemtMVEdBbG1NeCtNTEdjVlBl?= =?utf-8?B?TmxEaEpRZzVCZk1VNDZPZFpYZVhiOGlCcXhBb0FXcldaV29QM21XaE9WSk8z?= =?utf-8?B?cVZqQmN3REwvaFZnRWtCa2xGZkhrVlNsTndrRUk4dS8wMjZ5ajRpN3RiWUJ0?= =?utf-8?B?WlloeGFVRGllNFdTb3hRUUlqYlhkR1hleUYzaVlCa3pFUGtFU1FBRzhSakYy?= =?utf-8?B?MHluUngyK09vRFJpSVU2TWZhZ2phK0RNNkhtNTJxZEw0STZnOUVCUlFtSG9O?= =?utf-8?B?ZFJBdkR2NnZQQUg0ODB4TVk3NnVPd3VUVjZ2cHFiUmxDRGIrTFY2bXpobDdt?= =?utf-8?B?bXVKZ1VuNERVaWJOQ2gxSlJNRDZ5MHRobWk1NDIvQkJybmczRkhkMUE3L3gr?= =?utf-8?B?WVY2d3ZGZmFPbE1UK29vTTl4b1QzcnNtVGtldWcxbnVEY0h6SnpCcjN2QWxm?= =?utf-8?B?TW5LZW9nTGxORmtlOUJaTEtqVm92UWNSR1prck5MREJNTzB6NW82RWNxdTZl?= =?utf-8?B?dmU4TU1NdDlRVmkwZS9DZjlvK3haYlZSRVNUYTdqbTBQYTJkN2t0T2pFQXpi?= =?utf-8?B?RzVCTDU4ZlZKbUpoUHVhdWhIeU9TQTNoc0lIRnUydW5Oazlpb3FHMTYrUmRm?= =?utf-8?B?ZFpmelBRbUVoeC9XLzlYcVlUQVlRdi9xMGt1YnFVM1JxdjJkSGl1ZE5YNGRx?= =?utf-8?B?OUxxYnVDN25tUHVzMUZiVXBiSmpkdXpLNzZsd0ZtYXdESzU0TVlIVmVaUUZP?= =?utf-8?B?L2hHTGxyajk4OWN0ZytpY3g1ZWRnREtFbStNUHd3d2ZCbEo4enpQTGErNkZM?= =?utf-8?B?L2s0Q3RaQngzRUphb1ZXRG90WXdNd3F1STFOVmhGMlQ0SXJ3SXBVeGFFNUJT?= =?utf-8?B?WDlyZmNzRGxwZUkvMlNCQzA2NmxrZVFPVTlsTld3NnlUTHVzNVBHd3c9PQ==?= X-Forefront-PRVS: 03319F6FEF X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(39400400002)(39410400002)(39450400003)(39840400002)(39860400002)(39850400002)(189998001)(305945005)(7736002)(97746001)(8676002)(33646002)(103116003)(4001350100001)(53936002)(9686003)(54906002)(53416004)(110136004)(4326008)(6506006)(38730400002)(25786009)(478600001)(42186005)(66066001)(7416002)(76176999)(50986999)(7406005)(54356999)(5660300001)(72206003)(2906002)(2950100002)(55016002)(6116002)(3846002)(47776003)(1076002)(230700001)(50466002)(81166006)(83506001)(23676002)(86362001)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY4PR12MB1142;H:tlendack-t1.amdoffice.net;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTRQUjEyTUIxMTQyOzIzOmZjWlVuQlhRUERPV1RuVXVQcXVQY29LVUI1?= =?utf-8?B?WXB5aHpKOWE1MnNmZDI1ODBnU3A1UkR4OE4wMUZlY3VnNGs5UHNiaE9hRno1?= =?utf-8?B?RmtJTDdWUXdYT2h4eTRRTXBoSVUwTnNoUm5DL2h2NE0yVFlPSjRUemNKemFT?= =?utf-8?B?OHpnTWNmSzRaQ0ZJM0JIMkxRZnJaWEgyYXJmSzhYYzdHSG5WbndxQWw1enpv?= =?utf-8?B?RWhIbGY1VFFTV0VVZTBiazgxdlRCWnFFRmdTcVZqMmJLVHpNUWcxdVJacGNX?= =?utf-8?B?MG1lUlQ4eUxZNVFIR01jWEE2ajdDMmo3ZnZGaFg4RkFmeGJDZ01JRE9JWFhD?= =?utf-8?B?eGdla0MxS3hOQW9aMDl3djlDZ0tramVFVFlHVjh2TkdNY0ZDQVZUUFBpR280?= =?utf-8?B?MTlKTEVvUWxDd2h2c05iUW5QMmU1OVJsNVZFaE96SFRhbXVSaCtCOGQ5OTZY?= =?utf-8?B?S2M1QkR0cThIOWJ4dHhwUnQvYjRKQmE0SGsrZzFJT2hRL2hnMjVmZ1p6RmNC?= =?utf-8?B?Z3orVFdqUFJiMXlPMHFxa3JnVkRnbElPQU5KdFhNVzFXRTJuYzVCVVRtd2Nw?= =?utf-8?B?UzM2N1VkK3orN3BMbHNFQ2I2WG5hSm5KZEgrRHk3K0RzL20zRFF2NU5zLzVj?= =?utf-8?B?Q2ZMNG5nYkN1Vk5hUmxKRUFZejBaSDNza2M2RmRPNVRSQ29vTmxnSFdiQ01l?= =?utf-8?B?N3ZyNlA1eUQwT0tEWlVzc2JuVktOZHdzWG5qdWkrYXlvVW9MRkNsUDdGblpa?= =?utf-8?B?Vy90S2MxREczVUdjREw3dzFpNnFyN2FmQ29yYkhUN2ozQlg2dUlIL0EvZmkv?= =?utf-8?B?YnFNelZSM3Y5NlIrWWZveWwvYmlNZGZEcDdBLytMbE1QaVJGeVlENGc3THFi?= =?utf-8?B?OFhoeDJaRkJqcWp6VDlWdmdTeVRBWkU4UnRQVFhXaTZNYUFkOGp0QzJiUy9Z?= =?utf-8?B?WVdaMDlVelppTWVQUzhIU0FCcTlZZEhFVUpwc1AwWFhFNUVBN1pKR0dENmg3?= =?utf-8?B?ZWdNODlnMWxtQlViNk55VUNieEs2UFFNS1Z5UW5IdUw0dnBHVjJncEFCK2Jy?= =?utf-8?B?TW5LR3ZrZ0l2TnBBa3JzdFV3N01OTWZSVDU2K2FzSm5JQmsxSlVkd1c3cXcr?= =?utf-8?B?K1h3YTBVRktGRFhZRWhoZmVvYkloVGtueGRIVTVwU2ZuMWlWd0J5VUhwRVJB?= =?utf-8?B?YzBESENGcnFCR2p4UkpQbUZpNXVaU2llWEZrQWZEMUs5ay9rc3ZaVEwyUzUv?= =?utf-8?B?Y1dvOHBiUWVNdVNkNUYvd2tIRHowbGVDZXVDd2hGQmNLZGNoWk5Qa2o1M2Iy?= =?utf-8?B?TmJ2VStxbmNWL2tVdmQ0c1RBTEFaWkwzMlVGdVZmRFRrcC8yV2tpd1k1TDdr?= =?utf-8?B?UnZmYXBQbFQ4L3BkcTIzMldYUW9JTm82dlIvbE1NTnBTYXFGVUVjQUJOUzk0?= =?utf-8?B?T0dRU0hIUDZJOWFVRU4yQnZhbDBuZG4vVDB4QzBwTUM2bjdHOXdPeGo4M0c0?= =?utf-8?B?c2o5b3RQb1o5Q3BjYkkvcGtYSW01TWhNUDFSSnJtSjk2ZjBHY05RY2tXUzc3?= =?utf-8?B?T3ArK2lYOTFqMU5IcllUOGw1OFFUWjY4dVB1WWM0Q2FiS3VxQ3d0YWdOcmgr?= =?utf-8?B?TmpMQTV0dnA3MDc0RnphNlpjeW9ZRi8rKyt5enA3bm9WUERJdDZtbnZHL3hX?= =?utf-8?Q?PGJqv3KF5WBfnzq1T8=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;6:fJrfDaEMzzqlGufCj1l+5MAooXRnDJ1+6Q1LsoD5c9bYi8AU+f6BByvJ1ldK93hXMsQamxqFmmxNvtNV4jHQ2E2vIZcOqMXPD5nyaO6XOS53MV5pAMnvfMcNXoTr+ip5rGd2fMDEj1i9po8UQVB47fuExhTfqrfZbGU+I2Dp6lDtUaL9b1nDP3FjqmK561+SPos7S7HcJpwt215wHQ4nf2Y8EOe8bwItNZN1IenUaEndYiuDVYJBgmyi523yz9xIf+lQoi0QzLptt0dcL6JWbmexVKXYF2ntNT3iS4nUXeGn4r29iIL5REJIhXh8K4W1B3fTD7wNBes+e/W7YPzhtlTTCkhaMHKVBDH8mnFVMQ/UpyazsTUjEJTfremuMF40YCLMkJjJHNOB8L3QUPrA5YG+h+uXgto4jOZNl8w4+mVLxgKoCfRqidHacpGaMcWkUgp/ceLaDxjt4+xfVzEv3W9UXBxy4peKe+e1SDj39wZWeJeegXsjpl+Fbe9WWg4sdc3HZU35l4uKeAUg8G7GJ5g5v+dyGLY7qQhlXZ9koB4= X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;5:7ZKo7LrKFdFUELmtZruIvXm+WQbsKU8QRghpzH57qQ3F668++51ubNS/PPDb9BMmoOxYkvQojbcdox5uuRHIksauIqa5xF8hIuSe3bLjJIJXDxbjAu83zWMyfuTb/ibjq+47FMN2reWg8plRtK5B7Qu8P20lP4UrqTK0HLqNsi0+UFLc63OD/Hnr3XJS0jrexo4bT7R410YQi8xRUKimWB04qDoKutGOuZm3aVu3qACfAQbcvO8APiAA8xF3ilPrBPeOpULHOMgB52zI0K0QksavEMCN6rFvfT+CoYn/6cO+VY7DLMKmpXgPd3N3KozHEDt+q+MwIM7GKP77kiuwAYLJAB7ZzbGKB9UzcHiK9ZuN0JWhN/GB/N+Mr3sypIikLy35M8HQ9XIejm/9RDLodquMQSLXO7Nej+PcEHaD9U+vliRl9bO4IB8jOL1da9RVCqcOa/5gXBYLMb75jls1LCJPofYkbu4/uuj7DBxYHlrJjKCLhO//3bcHhI2pQvB0;24:rIh8AbESOSA0ryHCgEmqyC0jTj4Nalr0aEsWFR/oAnBUR6Q5tvWosChWq5pdHMs+AdTwj1xHD/eDUNVIGYwA92Z+n/pZ5r64fsUlYwr97gY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY4PR12MB1142;7:xyEOXFm4n7NGf4SYLctJT3cLkPvtGfdfCVPpbsy2lXBQoNHVdGGRHiUFgkDdvJ+rbkXdZDHTNaseR2zJ9en37mMoT2dwH7esAxBvydOFEA5Lh/NY8BWhYyFLylOvbktY2TnN83kluN5s6+oovD002Wc2rOLBcu94sJBMweHxoAQSFLE0iuVy7hUzmO5ZHZRQOWhwvNiUQ0gGNFE5QQKUksSuVZ41TG8idQDixRtwhqt3CYKCQ1H9ybGpAWCfeJQl7+jNQ+q0O0KOWRQxiQGY/UVbAB/1sarl899IRWlj85vOXN1a0bLWqurLWANlf7/83JfONtc3/Yb45VamLo0kUQ==;20:s3DaCDJyCdOP38bz20wei/5eQIhOhEKHGD6IZejIGwlx87I6duvoFvadJ2L27W0vgjWOazxlR809O8ImZKEP7bFT8N26Sufc3LVpKu4C8aw0a49c9JW/IfZUHyTyHhR6pQuCuxhSYpTwAexciBNJcVA2pT58bThs7uy1MUT8edL7SWjDq+6JjxbqGkF5HGmXZ6s3/CW/Rmq99wVMwwGhk5Yq+wLWKmq3zDoHsLGHNuEY4RJfOX0G5s+58pKepiKQ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jun 2017 19:16:45.1600 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1142 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..44b5d582 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: mpf early_memremap() failed\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; }