From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=helo; client-ip=104.47.38.76; helo=nam02-bl2-obe.outbound.protection.outlook.com; envelope-from=leo.duran@amd.com; receiver=edk2-devel@lists.01.org Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0076.outbound.protection.outlook.com [104.47.38.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8D2B22095E51F for ; Wed, 11 Oct 2017 12:42:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=g8qG0EzVRgKePvBKaxtRX7q6wGl4JfJ7Fvkbx0JcizQ=; b=0zUM4QsptLqOhGnIXZETGU5cPODnmY90sjVAQ5w/DeRUU/Ds8y1219MtepP4ZER5/y1pYAJdKfjc7259slooe8e2mwdvA7fwJqZmM5mGGN5YKWQDfAIPNI2oJ332YtqpEiUuhCb3B7/ARu5yrJGRsQkz1k48cVz9Ffqu7M3sUZ0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=leo.duran@amd.com; Received: from leduran-Precision-WorkStation-T5400.amd.com (165.204.77.1) by DM5PR12MB1243.namprd12.prod.outlook.com (10.168.237.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Wed, 11 Oct 2017 19:45:43 +0000 From: Leo Duran To: edk2-devel@lists.01.org Cc: Leo Duran , Jiewen Yao , Ruiyu Ni , Michael D Kinney , Jordan Justen , Liming Gao Date: Wed, 11 Oct 2017 14:45:31 -0500 Message-Id: <1507751131-32404-3-git-send-email-leo.duran@amd.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1507751131-32404-1-git-send-email-leo.duran@amd.com> References: <1507751131-32404-1-git-send-email-leo.duran@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: CO2PR05CA0063.namprd05.prod.outlook.com (10.166.88.159) To DM5PR12MB1243.namprd12.prod.outlook.com (10.168.237.22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 76547387-2531-43c4-6726-08d510e0a9ca X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254152)(48565401081)(2017052603199)(201703131423075)(201703031133081)(201702281549075); SRVR:DM5PR12MB1243; X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 3:blQFJPa3UYFwS2dbgKTTH4qDzau3DgnnqCNEi1ftJPxMNR/QGFMsEgljt7qJ9d2mLfHPx8S+bITkbc6el2Rf0BWLIHMF6oIvy+QM5wFr9Ea8IWQpGE7dCmv2+zWoAxZqM2BG6u0JaNjgeDHgXken28fJbn7N3Fpj7+4kDOIQC4Ge5jTOy6ZfiIef/hGBVooik52OwkYZGi0YYrGLXMGLmhXyKeLVRBKKa6WyAOB+QtFHaeivTI8bl8JnBZE347Z6; 25:Jab+7ScIICzwBaI+yg9YCZsCVBC1esTG5xeHJqGhNBl+wKve4XQGVZdj+/Bikrac1G+VivYRJXCMf49hTmufX8GnqftXJctnBPs4jgRLtGFrKrRrXpgcEM3n9YTt0nWQuIA+nmZBft5BpSK8OPBt9G9eIOesYi9mwtf/5Kmd4DtkUBS7WoCdIpZIas2rjzsMp6nAfCv73J6VP3Z9Pm6jXDmszS78Ahn3dtNF+0bb/rLyR/14oh44Cs/0Pf46K+mU+mxfLpVVFdVF9WyJUeBcDXQ/Qckwf5Euj/8s9uhMr6C1HvNcs9fSkNtQltI0yE1MbOHP2Zu45n+u/++kM3XZkg==; 31:EU2e5cLSU+fawQh3HF3DXnyACHgE73whjwGS/irOMFqQr7tlWSZjhvCtYMmYGoUqdOBVW2rKgj7IA2i0G+FTLPLCVqdNBrKbLWVVIcCQjTfeurCN2JoNp+ce7Ep/3K/zyVFnyit9QOSOen4D7OJcsdXc0QCW8lm7MV7yaa0oSfQUaDhYyeOT5ii7+mOraTRPJwthaWfJ1Wgq+666inpOsZw+xujd7UiD3hCLwelfVs4= X-MS-TrafficTypeDiagnostic: DM5PR12MB1243: X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 20:TKUwt5D9FtpR2uOShyLNFacOKT1jOih9bafSLdf8LgGajJyTQTSLzdq6TMb+j3qWal3i0m9dY6wYOdjkxOJQu8X6eeBv4jdg1cpoVMaBhrRZLD7dlzNTdB4HM1tsNEoY98L6464oS0yzLp35ZqkQslcWQLN5cbBzChpAChKkroA4CAIHxmU628/XgPSYQagmsl0WeoJrTU/MLwlH/+JxxTXC+NJEVnChFuXeyGgG6I79aXj4gYk0E3iynnQ01NI2ai43fzh0BWjVrnKiwnUjzN885M3xPXPxT3zOKHobJk+fgQ2fmNkfq+5yMGZ0RpxU+EZSbk1Dm1Cldcvf+zAlvV8mcn863FQV7H9tSKIeieoSdLOEvD+ybiTVDLZN5/tRg3VdY4zMsa3Z8loOMWvp0Lh2wfrVbUx8Wn0s4EbBIT5MR3oWqsQVBUL1I0WG+VNeYoTtXQBKxdioIrG/5/SQPYDSPLkwOL/FRV3d9jtyNI2qa5PMZujsWUF7/xzN7bgj; 4:W3D//i6LxMoJ7wcR5JmBR5/RS/iNDBI00w2dDmeatLiQVTU6T/iyBDJ+EYMqQqM4Q1EbnQUdJKWfsJKlyGme1VYVutjYdWGUwIGOy+UJ2oP1qGpLE8gNuknn7PEuobsgappb8c+GRfFpcfgsgt9x48PpXiL4sSUfFj+aNO0fdtjYW1IdbhUqaEgCn6eAlAIkBsTdjoP9CS2v8Ips0XI/2yrfBLL3dkm/OukQixl9XFxNJ38NyKdCpOYMRzl9zFvj0S+BA8ox9AVaOKL35JKOlPdgqoFGU1IgGTbFuQQdRThZNlmx8vTS/SFPuKowu4HfPeRBf7a4oK5aDSimp0hueexwms3Icim+WZSXPa7jp2w= X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089)(228905959029699); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(6055026)(6041248)(20161123564025)(20161123555025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM5PR12MB1243; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM5PR12MB1243; X-Forefront-PRVS: 0457F11EAF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(979002)(6029001)(6009001)(39860400002)(376002)(346002)(199003)(189002)(36756003)(68736007)(189998001)(16526018)(53936002)(16586007)(50466002)(966005)(2906002)(81156014)(3846002)(48376002)(316002)(6306002)(305945005)(81166006)(8676002)(53946003)(86362001)(6116002)(97736004)(478600001)(8936002)(7736002)(2351001)(5003940100001)(2361001)(53376002)(53416004)(6666003)(50986999)(6486002)(25786009)(76176999)(106356001)(16799955002)(4326008)(5660300001)(105586002)(575784001)(66066001)(50226002)(15188155005)(54906003)(47776003)(33646002)(101416001)(6916009)(2950100002)(19627235001)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR12MB1243; H:leduran-Precision-WorkStation-T5400.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR12MB1243; 23:p6wYWI0nfg48O5ozh8WU0S9MKOr4NHr+wWb0jt1ZT?= =?us-ascii?Q?+s9lIZeOLegWqlwQC7bhrUdtPnVWHb6jYb/td9V6TqgjUPwhvB040HXcR0AG?= =?us-ascii?Q?iG6dp6JNS2hrdqTC3XifEs7kZfiiM54/rIE63Ms9zoNPnngqt3EfLWfhnoDD?= =?us-ascii?Q?kYjN9qZ4rk0+JFvFbCaWR7D/3HCmGMwdOYh1lVsdwwNSCqDI8MFXVICdsPXB?= =?us-ascii?Q?igTZet3Bx/eHBiRSiQ6a1nbpoFSnqyCs1u4Bbk1j/dZ3FZKh4SiKmqCfH3Y0?= =?us-ascii?Q?JxzKK62N0M2cufVfHz6YKVcxqgBqTm94QqD2izuoZdrqZuu7WGs7DaPncyEj?= =?us-ascii?Q?v7/KT2gdkIEQAlOsBlVj5QfTq/zQ3cyiBSL3z07w1v3QIYOa1qqnxuHM8tXx?= =?us-ascii?Q?o0KjnboILNlPJkgw84BUri3jtVfAm5YfvUhpbjNty2RWHYCuvy9m8H+0oz5G?= =?us-ascii?Q?1zxeYKFYp0Q46DjGaW0yH2XQqaJxlWjWYOE72ZpBPMwkrUXS1zBo5xpgtMLk?= =?us-ascii?Q?3RIfY8bTmLKPyi3hXHaZpa8UCFymfzBmsBEHaGeptlyNLlwyHG3g0yTj5zRN?= =?us-ascii?Q?a9np+CI+/UKpo69dDjSf7SdMxf+6nR5z48spwRhvqxu0ZruRnrsE6xEiyvjs?= =?us-ascii?Q?7Ql/V1sxD0gyduWdzQ4q960e9xq9+9Sc3UlQX9JENEJ6KVcZ4R4vABuAQiOg?= =?us-ascii?Q?BHx+CXlmCtaVmzePtsjxFgAEIbcUXOK8928I1PKWkQo+UZWy3MQ3oB44sUIw?= =?us-ascii?Q?ntz9pV7DaLMKE1+5sTS4XPJhp/B7bkudS/wbkbwkZJXZaVA8Mg+afq0IBckh?= =?us-ascii?Q?dQocqRpYUerY16VQc1qVAO6KtzfARZlCiQ/T0jwi2k+Q6xVvB/4Y6m0G5ZEJ?= =?us-ascii?Q?tuww3pJ+c/PWxg/2WOj9GfdYm751aXSRGCTA1MRXVnL8/jxsCYJ4Vo60VUgb?= =?us-ascii?Q?3oDEYrVPWjJY/QOV9XkOJemJPbIF9h/rgbqfnK68d5kZ+f6mKbvRup5OO1ty?= =?us-ascii?Q?zmTFiI38fxkYKZucADB7zjYFWTYvgOHDbkKVfwRoqHnlDzWFRYl/wyXScIJP?= =?us-ascii?Q?n/tLOI3ciwWkt6Ucr3TXL7fZr2cf+K6P0hHxWClwk1UkmCcFkOQRBdFCxXQC?= =?us-ascii?Q?RNDE/JRPQnPq/BKXqHGHfN/l8rFYe7/GOAuhGQCVepk7gpPJBSR3IzBxc2XN?= =?us-ascii?Q?cmEcjgvgjCH2W5gc4ehLRIzt6OeRjyYPvq9Oji0IL2Jwd2qag/HcezghqXpO?= =?us-ascii?Q?RxZPWjZ+oDhIzt/67s+6QaOSdPRjJjBbT6BVNZLVWpMQD+J3NgzTRqQ8mqm3?= =?us-ascii?Q?qGdsVeR9gDgwMCkmDBZs7+fCezQF3uvKhVzROM+9bpQTg+2MTvPM/NHAfLmo?= =?us-ascii?Q?BaDTjuse3OOJSR3uIb5TjCDelBAsR+svMEUGKoTkF81VZ58bUudjcXaLed62?= =?us-ascii?Q?blvli+jEw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 6:/pkZQ0bUyu6NSCStHAMixhyx3uOc+ZilIRTLqMpCSoNBawXg4ddZLUnq6p/n8F2aJ/QmS/+7taZvGalcyA7R3mNWKrU3PZcimGxfVhZ5rpnjpoi5kVGTABVRKPoOYK0DLnoxkkM8g3l+KtyZwPdkKEmCD8Vtn+nEgQ7JNVcKtlknpaZdnDfPxepo9flqjnuZCVAqIYRBn1Xq3C9MY5ABQMm815ZMTwd/poQFQhOSRtlIrodJxkTJYBpAL25JvQkJ4SUOOh5DC5hyn12gCpReh/8T/xCgWsKLmMJNDHKQ/OSSZw47J2M/7cmuGlT7V5UhRlsKUDTs6H+0FckA8VFHmw==; 5:Xug6CMTnuVcHQgf/h7Pv0fp1uprZFHH1sj8zerqdrGNhh4EnJ5k+l90JsPLmS/dE8Na28+sF4iKiZXlVMnVOEOB7CgbIJiEeJf1cQIaqfh2Sxqo3jahHg1w8z2RUz36+z4yxFPipYTWcxiaWMoopiQ==; 24:oDcelcf+7L2aA+cZ+KdsO/IovzpSg8h0qugZmJYehkjRyDVe9sqCu+HCmz41YTH/uWYy0eRVwuiNEgGW7yU8ximQfFOSPh1ArkNF+njI4zw=; 7:8XrMy85qfOJ2IWRN4xk9eJfAaV65kmLvYmvyg6y+dX2/4fGBG+rNpzhHapK+mCFU0HLt9bmaEoTLryh5ac/snx9YEPIbWlUDJOdnV5FVuKkS7eASCfZZOPNBcQIZ1Xi54IX56ujOHDeBVWAEIr8Z1edVoS7e1HIPJoijQWHibBjKkgdXtkEL7wWy0C6J27j2uuEtoT8SZ7t52wj0+EiMFIQF7UNXa5tK7X68cHYdmbk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 20:sTrLwXCQexldhYGC0BCacvTWu2pm59bTu6RtxyPbBhxdKSbrRir2W01ov2HYQj9OamRXWopZKwcRGNioo1EfK5lfntGalDBR0KO9h2Ae77S/663Y424KGUJM8WoqFWtOWYGSOGcrWal3H+Jg6YN3bxRdJd6GdyQt8qTOaT/DrfaQuaJWVtrAwHFNH5JPxuMLD6kg1zTM21fX9/HU1f9AY27QYuMvC2JLgZaZ9vgo4plgki2JlSgl0qEO0C9fUZb1 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2017 19:45:43.9032 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1243 Subject: [PATCH v5 2/2] UefiCpuPkg/PiSmmCpuDxeSmm: Use global variables to replace macros X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Oct 2017 19:42:18 -0000 Content-Type: text/plain Set global variables on Entry function based on CPUID checks. The variables replace Intel macros to allow support on AMD x86 systems. Specifically, the replaced macros are: 1) SRAM_SAVE_STATE_MAP_OFFSET 2) SMM_PSD_OFFSET Cc: Jiewen Yao Cc: Ruiyu Ni Cc: Michael D Kinney Cc: Jordan Justen Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Leo Duran --- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c | 22 ++++--- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 28 ++++++--- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 21 +++++-- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.nasm | 43 +++++++++---- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 72 ++++++++++++++++++++-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 17 ++++- UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c | 18 +++--- UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 20 +++--- UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c | 22 ++++--- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S | 34 ++++++---- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 22 +++++-- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm | 45 ++++++++++---- 12 files changed, 265 insertions(+), 99 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c index 02a866b..7b2e5fb 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c @@ -1,15 +1,17 @@ /** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. + Semaphore mechanism to indicate to the BSP that an AP has exited SMM + after SMBASE relocation. -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php + Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, AMD Incorporated. All rights reserved.
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -38,7 +40,7 @@ SemaphoreHook ( mRebasedFlag = RebasedFlag; - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + gSmmSmramStateMapOffset); mSmmRelocationOriginalAddress = (UINTN)HookReturnFromSmm ( CpuIndex, CpuState, diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S index 3243a91..d25c099 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S @@ -1,6 +1,8 @@ #------------------------------------------------------------------------------ # # Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.
+# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -27,6 +29,9 @@ ASM_GLOBAL ASM_PFX(gSmbase) ASM_GLOBAL ASM_PFX(mXdSupported) ASM_GLOBAL ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard)) ASM_GLOBAL ASM_PFX(gSmiHandlerIdtr) +ASM_GLOBAL ASM_PFX(gSmmPsdOffset) +ASM_GLOBAL ASM_PFX(gPsdGdtSize) +ASM_GLOBAL ASM_PFX(gPsdGdtPtr) .equ MSR_IA32_MISC_ENABLE, 0x1A0 .equ MSR_EFER, 0xc0000080 @@ -35,12 +40,13 @@ ASM_GLOBAL ASM_PFX(gSmiHandlerIdtr) # # Constants relating to PROCESSOR_SMM_DESCRIPTOR # -.equ DSC_OFFSET, 0xfb00 -.equ DSC_GDTPTR, 0x30 -.equ DSC_GDTSIZ, 0x38 -.equ DSC_CS, 14 -.equ DSC_DS, 16 -.equ DSC_SS, 18 +# .equ DSC_OFFSET, 0xfb00 +# .equ DSC_GDTPTR, 0x30 +# .equ DSC_GDTSIZ, 0x38 +# +.equ DSC_CS, 14 +.equ DSC_DS, 16 +.equ DSC_SS, 18 .equ DSC_OTHERSEG, 20 .equ PROTECT_MODE_CS, 0x08 @@ -55,11 +61,11 @@ _SmiEntryPoint: .byte 0xbb # mov bx, imm16 .word _GdtDesc - _SmiEntryPoint + 0x8000 .byte 0x2e,0xa1 # mov ax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTSIZ +ASM_PFX(gPsdGdtSize): .space 2 # .word DSC_OFFSET + DSC_GDTSIZ decl %eax movl %eax, %cs:(%edi) # mov cs:[bx], ax .byte 0x66,0x2e,0xa1 # mov eax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTPTR +ASM_PFX(gPsdGdtPtr): .space 2 # .word DSC_OFFSET + DSC_GDTPTR movw %ax, %cs:2(%edi) movw %ax, %bp # ebp = GDT base .byte 0x66 @@ -167,7 +173,11 @@ NxeDone: movl %cr0, %ebx orl $0x080010023, %ebx # enable paging + WP + NE + MP + PE movl %ebx, %cr0 - leal DSC_OFFSET(%edi),%ebx + + movl $ASM_PFX(gSmmPsdOffset), %ebx # leal DSC_OFFSET(%edi), %ebx + movzxw (%ebx), %esi + leal (%edi, %esi), %ebx + movw DSC_DS(%ebx),%ax movl %eax, %ds movw DSC_OTHERSEG(%ebx),%ax diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm index 8296f36..c9c471f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+; Copyright (c) 2017, AMD Incorporated. All rights reserved.
+; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -29,9 +31,10 @@ MSR_EFER_XD EQU 0800h ; ; Constants relating to PROCESSOR_SMM_DESCRIPTOR ; -DSC_OFFSET EQU 0fb00h -DSC_GDTPTR EQU 30h -DSC_GDTSIZ EQU 38h +; DSC_OFFSET EQU 0fb00h +; DSC_GDTPTR EQU 30h +; DSC_GDTSIZ EQU 38h +; DSC_CS EQU 14 DSC_DS EQU 16 DSC_SS EQU 18 @@ -53,6 +56,9 @@ EXTERNDEF gSmbase:DWORD EXTERNDEF mXdSupported:BYTE EXTERNDEF FeaturePcdGet (PcdCpuSmmStackGuard):BYTE EXTERNDEF gSmiHandlerIdtr:FWORD +EXTERNDEF gSmmPsdOffset:WORD +EXTERNDEF gPsdGdtSize:WORD +EXTERNDEF gPsdGdtPtr:WORD .code @@ -62,11 +68,11 @@ _SmiEntryPoint: DB 0bbh ; mov bx, imm16 DW offset _GdtDesc - _SmiEntryPoint + 8000h DB 2eh, 0a1h ; mov ax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTSIZ +gPsdGdtSize DW ? ; DSC_OFFSET + DSC_GDTSIZ dec eax mov cs:[edi], eax ; mov cs:[bx], ax DB 66h, 2eh, 0a1h ; mov eax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTPTR +gPsdGdtPtr DW ? ; DSC_OFFSET + DSC_GDTPTR mov cs:[edi + 2], ax ; mov cs:[bx + 2], eax mov bp, ax ; ebp = GDT base DB 66h @@ -173,7 +179,10 @@ mXdSupported DB 1 mov ebx, cr0 or ebx, 080010023h ; enable paging + WP + NE + MP + PE mov cr0, ebx - lea ebx, [edi + DSC_OFFSET] + + movzx esi, word ptr [gSmmPsdOffset] ; lea ebx, [edi + DSC_OFFSET] + lea ebx, [edi + esi] + mov ax, [ebx + DSC_DS] mov ds, eax mov ax, [ebx + DSC_OTHERSEG] diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.nasm index 4d2383f..666233b 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.nasm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.nasm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; Copyright (c) 2017, AMD Incorporated. All rights reserved.
+; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -25,17 +27,18 @@ ; ; Constants relating to PROCESSOR_SMM_DESCRIPTOR ; -%define DSC_OFFSET 0xfb00 -%define DSC_GDTPTR 0x30 -%define DSC_GDTSIZ 0x38 -%define DSC_CS 14 -%define DSC_DS 16 -%define DSC_SS 18 -%define DSC_OTHERSEG 20 +; %define DSC_OFFSET 0xfb00 +; %define DSC_GDTPTR 0x30 +; %define DSC_GDTSIZ 0x38 +; +%define DSC_CS 14 +%define DSC_DS 16 +%define DSC_SS 18 +%define DSC_OTHERSEG 20 %define PROTECT_MODE_CS 0x8 %define PROTECT_MODE_DS 0x20 -%define TSS_SEGMENT 0x40 +%define TSS_SEGMENT 0x40 extern ASM_PFX(SmiRendezvous) extern ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard)) @@ -50,16 +53,28 @@ global ASM_PFX(gSmbase) global ASM_PFX(mXdSupported) extern ASM_PFX(gSmiHandlerIdtr) +extern ASM_PFX(gSmmPsdOffset) +global ASM_PFX(gPsdGdtSize) +global ASM_PFX(gPsdGdtPtr) + SECTION .text BITS 16 ASM_PFX(gcSmiHandlerTemplate): _SmiEntryPoint: mov bx, _GdtDesc - _SmiEntryPoint + 0x8000 - mov ax,[cs:DSC_OFFSET + DSC_GDTSIZ] + + mov eax, ASM_PFX(gPsdGdtSize) ; mov ax, [cs:DSC_OFFSET + DSC_GDTSIZ] + mov si, [cs:eax] ; + mov ax, [cs:si] ; + dec ax mov [cs:bx], ax - mov eax, [cs:DSC_OFFSET + DSC_GDTPTR] + + mov eax, ASM_PFX(gPsdGdtPtr) ; mov eax, [cs:DSC_OFFSET + DSC_GDTPTR] + mov si, [cs:eax] ; + mov eax, [cs:si] ; + mov [cs:bx + 2], eax mov ebp, eax ; ebp = GDT base o32 lgdt [cs:bx] ; lgdt fword ptr cs:[bx] @@ -160,7 +175,10 @@ ASM_PFX(mXdSupported): DB 1 mov ebx, cr0 or ebx, 0x80010023 ; enable paging + WP + NE + MP + PE mov cr0, ebx - lea ebx, [edi + DSC_OFFSET] + + movzx esi, word [ASM_PFX(gSmmPsdOffset)] ; lea ebx, [edi + DSC_OFFSET] + lea ebx, [edi + esi] ; + mov ax, [ebx + DSC_DS] mov ds, eax mov ax, [ebx + DSC_OTHERSEG] @@ -205,5 +223,8 @@ ASM_PFX(SmiHandler): .7: rsm +ASM_PFX(gPsdGdtSize): RESW 1 +ASM_PFX(gPsdGdtPtr) : RESW 1 + ASM_PFX(gcSmiHandlerSize): DW $ - _SmiEntryPoint diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index 282d2e6..ad7c811 100755 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -116,6 +116,31 @@ UINTN mSmmCpuSmramRangeCount; UINT8 mPhysicalAddressBits; +// +// Set default value for SMRAM offset +// from +// +UINT16 gSmmSmramStateMapOffset = SMRAM_SAVE_STATE_MAP_OFFSET; + +// +// Set default value for PSD offset in SMRAM +// +UINT16 gSmmPsdOffset = INTEL_SMM_PSD_OFFSET; + +// +// Constants relating to PROCESSOR_SMM_DESCRIPTOR +// +#define SMM_PSD_GDTPTR 0x30 +#define SMM_PSD_GDTSIZE 0x38 + + +// +// External global variables associated with SMI Handler Template +// +extern UINT16 gPsdGdtSize; +extern UINT16 gPsdGdtPtr; + + /** Initialize IDT to setup exception handlers for SMM. @@ -407,7 +432,7 @@ SmmRelocateBases ( gcSmiInitGdtr.Limit = gcSmiGdtr.Limit; U8Ptr = (UINT8*)(UINTN)(SMM_DEFAULT_SMBASE + SMM_HANDLER_OFFSET); - CpuStatePtr = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuStatePtr = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + gSmmSmramStateMapOffset); // // Backup original contents at address 0x38000 @@ -500,6 +525,29 @@ SmmReadyToLockEventNotify ( } /** + Determine if the standard CPU signature is "AuthenticAMD". + + @retval TRUE The CPU signature matches. + @retval FALSE The CPU signature does not match. + +**/ +STATIC +BOOLEAN +StandardSignatureIsAuthenticAMD ( + VOID + ) +{ + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; + + AsmCpuid (CPUID_SIGNATURE, NULL, &RegEbx, &RegEcx, &RegEdx); + return (RegEbx == CPUID_SIGNATURE_AUTHENTIC_AMD_EBX && + RegEcx == CPUID_SIGNATURE_AUTHENTIC_AMD_ECX && + RegEdx == CPUID_SIGNATURE_AUTHENTIC_AMD_EDX); +} + +/** The module Entry Point of the CPU SMM driver. @param ImageHandle The firmware allocated handle for the EFI image. @@ -547,6 +595,20 @@ PiCpuSmmEntry ( ); // + // Override SMRAM offsets for AMD + // + if (StandardSignatureIsAuthenticAMD ()) { + gSmmSmramStateMapOffset = AMD_SMRAM_SAVE_STATE_MAP_OFFSET; + gSmmPsdOffset = AMD_SMM_PSD_OFFSET; + } + + // + // Initialize PSD global variables associated with SMI Handler + // + gPsdGdtSize = gSmmPsdOffset + SMM_PSD_GDTSIZE; + gPsdGdtPtr = gSmmPsdOffset + SMM_PSD_GDTPTR; + + // // Fix segment address of the long-mode-switch jump // if (sizeof (UINTN) == sizeof (UINT64)) { @@ -707,12 +769,12 @@ PiCpuSmmEntry ( // // Compute tile size of buffer required to hold the CPU SMRAM Save State Map, extra CPU - // specific context start starts at SMBASE + SMM_PSD_OFFSET, and the SMI entry point. + // specific context start starts at SMBASE + gSmmPsdOffset, and the SMI entry point. // This size is rounded up to nearest power of 2. // TileCodeSize = GetSmiHandlerSize (); TileCodeSize = ALIGN_VALUE(TileCodeSize, SIZE_4KB); - TileDataSize = (SMRAM_SAVE_STATE_MAP_OFFSET - SMM_PSD_OFFSET) + sizeof (SMRAM_SAVE_STATE_MAP); + TileDataSize = (gSmmSmramStateMapOffset - gSmmPsdOffset) + sizeof (SMRAM_SAVE_STATE_MAP); TileDataSize = ALIGN_VALUE(TileDataSize, SIZE_4KB); TileSize = TileDataSize + TileCodeSize - 1; TileSize = 2 * GetPowerOfTwo32 ((UINT32)TileSize); @@ -725,7 +787,7 @@ PiCpuSmmEntry ( // the SMI Handler size must be reduced or the size of the extra CPU specific // context must be reduced. // - ASSERT (TileSize <= (SMRAM_SAVE_STATE_MAP_OFFSET + sizeof (SMRAM_SAVE_STATE_MAP) - SMM_HANDLER_OFFSET)); + ASSERT (TileSize <= (gSmmSmramStateMapOffset + sizeof (SMRAM_SAVE_STATE_MAP) - SMM_HANDLER_OFFSET)); // // Allocate buffer for all of the tiles. @@ -783,7 +845,7 @@ PiCpuSmmEntry ( for (Index = 0; Index < mMaxNumberOfCpus; Index++) { mCpuHotPlugData.SmBase[Index] = (UINTN)Buffer + Index * TileSize - SMM_HANDLER_OFFSET; gSmmCpuPrivate->CpuSaveStateSize[Index] = sizeof(SMRAM_SAVE_STATE_MAP); - gSmmCpuPrivate->CpuSaveState[Index] = (VOID *)(mCpuHotPlugData.SmBase[Index] + SMRAM_SAVE_STATE_MAP_OFFSET); + gSmmCpuPrivate->CpuSaveState[Index] = (VOID *)(mCpuHotPlugData.SmBase[Index] + gSmmSmramStateMapOffset); gSmmCpuPrivate->Operation[Index] = SmmCpuNone; if (Index < mNumberOfCpus) { diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index 1cf85c1..8ad9d56 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -56,6 +56,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include +#include #include #include "CpuService.h" @@ -360,7 +361,21 @@ typedef struct { UINT32 MsrIndex; } MP_MSR_LOCK; -#define SMM_PSD_OFFSET 0xfb00 +#define INTEL_SMM_PSD_OFFSET 0xfb00 + +// +// Definitions for AMD systems are based on contents of the +// AMD64 Architecture Programmer's Manual +// Volume 2: System Programming, Section 10 System-Management Mode +// +#define AMD_SMRAM_SAVE_STATE_MAP_OFFSET 0xfe00 +#define AMD_SMM_PSD_OFFSET 0xfc00 + +// +// External global variables for SMRAM offsets +// +extern UINT16 gSmmSmramStateMapOffset; +extern UINT16 gSmmPsdOffset; /// /// All global semaphores' pointer diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c index 3ad5256..8707424 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c @@ -1,13 +1,15 @@ /** @file -Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php + Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, AMD Incorporated. All rights reserved.
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -703,7 +705,7 @@ PatchSmmSaveStateMap ( TileCodeSize = GetSmiHandlerSize (); TileCodeSize = ALIGN_VALUE(TileCodeSize, SIZE_4KB); - TileDataSize = (SMRAM_SAVE_STATE_MAP_OFFSET - SMM_PSD_OFFSET) + sizeof (SMRAM_SAVE_STATE_MAP); + TileDataSize = (gSmmSmramStateMapOffset - gSmmPsdOffset) + sizeof (SMRAM_SAVE_STATE_MAP); TileDataSize = ALIGN_VALUE(TileDataSize, SIZE_4KB); TileSize = TileDataSize + TileCodeSize - 1; TileSize = 2 * GetPowerOfTwo32 ((UINT32)TileSize); diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c index 3188d43..1f460b7 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c @@ -1,14 +1,16 @@ /** @file -Provides services to access SMRAM Save State Map + Provides services to access SMRAM Save State Map -Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php + Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, AMD Incorporated. All rights reserved.
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -690,7 +692,7 @@ InstallSmiHandler ( // // Initialize PROCESSOR_SMM_DESCRIPTOR // - Psd = (PROCESSOR_SMM_DESCRIPTOR *)(VOID *)((UINTN)SmBase + SMM_PSD_OFFSET); + Psd = (PROCESSOR_SMM_DESCRIPTOR *)(VOID *)((UINTN)SmBase + gSmmPsdOffset); CopyMem (Psd, &gcPsd, sizeof (gcPsd)); Psd->SmmGdtPtr = (UINT64)GdtBase; Psd->SmmGdtSize = (UINT32)GdtSize; diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c index 6dbcb08..3f52c7a 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c @@ -1,15 +1,17 @@ /** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. + Semaphore mechanism to indicate to the BSP that an AP has exited SMM + after SMBASE relocation. -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php + Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2017, AMD Incorporated. All rights reserved.
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ @@ -51,7 +53,7 @@ SemaphoreHook ( mRebasedFlag = RebasedFlag; mRebasedFlagAddr32 = (UINT32)(UINTN)mRebasedFlag; - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + gSmmSmramStateMapOffset); mSmmRelocationOriginalAddress = HookReturnFromSmm ( CpuIndex, CpuState, diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S index 600d862..c3405ec 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S @@ -1,6 +1,8 @@ #------------------------------------------------------------------------------ # # Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.
+# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -26,6 +28,9 @@ ASM_GLOBAL ASM_PFX(gSmiStack) ASM_GLOBAL ASM_PFX(gSmbase) ASM_GLOBAL ASM_PFX(mXdSupported) ASM_GLOBAL ASM_PFX(gSmiHandlerIdtr) +ASM_GLOBAL ASM_PFX(gSmmPsdOffset) +ASM_GLOBAL ASM_PFX(gPsdGdtSize) +ASM_GLOBAL ASM_PFX(gPsdGdtPtr) .equ MSR_IA32_MISC_ENABLE, 0x1A0 .equ MSR_EFER, 0xc0000080 @@ -34,12 +39,13 @@ ASM_GLOBAL ASM_PFX(gSmiHandlerIdtr) # # Constants relating to PROCESSOR_SMM_DESCRIPTOR # -.equ DSC_OFFSET, 0xfb00 -.equ DSC_GDTPTR, 0x30 -.equ DSC_GDTSIZ, 0x38 -.equ DSC_CS, 14 -.equ DSC_DS, 16 -.equ DSC_SS, 18 +# .equ DSC_OFFSET, 0xfb00 +# .equ DSC_GDTPTR, 0x30 +# .equ DSC_GDTSIZ, 0x38 +# +.equ DSC_CS, 14 +.equ DSC_DS, 16 +.equ DSC_SS, 18 .equ DSC_OTHERSEG, 20 # # Constants relating to CPU State Save Area @@ -49,9 +55,9 @@ ASM_GLOBAL ASM_PFX(gSmiHandlerIdtr) .equ PROTECT_MODE_CS, 0x08 .equ PROTECT_MODE_DS, 0x20 -.equ LONG_MODE_CS, 0x38 -.equ TSS_SEGMENT, 0x40 -.equ GDT_SIZE, 0x50 +.equ LONG_MODE_CS, 0x38 +.equ TSS_SEGMENT, 0x40 +.equ GDT_SIZE, 0x50 .text @@ -70,12 +76,12 @@ _SmiEntryPoint: # fix GDT descriptor # .byte 0x2e,0xa1 # mov ax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTSIZ +ASM_PFX(gPsdGdtSize): .space 2 # .word DSC_OFFSET + DSC_GDTSIZ .byte 0x48 # dec ax .byte 0x2e movl %eax, (%rdi) # mov cs:[bx], ax .byte 0x66,0x2e,0xa1 # mov eax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTPTR +ASM_PFX(gPsdGdtPtr): .space 2 # .word DSC_OFFSET + DSC_GDTPTR .byte 0x2e movw %ax, 2(%rdi) .byte 0x66,0x2e @@ -182,7 +188,11 @@ Base: LongMode: # long mode (64-bit code) starts here movabsq $ASM_PFX(gSmiHandlerIdtr), %rax lidt (%rax) - lea (DSC_OFFSET)(%rdi), %ebx + + movl $ASM_PFX(gSmmPsdOffset), %ebx # lea (DSC_OFFSET)(%rdi), %ebx + movzxw (%ebx), %rsi + leal (%rdi, %rsi), %ebx + movw DSC_DS(%rbx), %ax movl %eax,%ds movw DSC_OTHERSEG(%rbx), %ax diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm index c74f82a..72eeb1a 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+; Copyright (c) 2017, AMD Incorporated. All rights reserved.
+; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -31,6 +33,10 @@ EXTERNDEF gSmiStack:DWORD EXTERNDEF gSmbase:DWORD EXTERNDEF mXdSupported:BYTE EXTERNDEF gSmiHandlerIdtr:FWORD +EXTERNDEF gSmmPsdOffset:WORD +EXTERNDEF gPsdGdtSize:WORD +EXTERNDEF gPsdGdtPtr:WORD + MSR_IA32_MISC_ENABLE EQU 1A0h MSR_EFER EQU 0c0000080h @@ -39,9 +45,10 @@ MSR_EFER_XD EQU 0800h ; ; Constants relating to PROCESSOR_SMM_DESCRIPTOR ; -DSC_OFFSET EQU 0fb00h -DSC_GDTPTR EQU 30h -DSC_GDTSIZ EQU 38h +: DSC_OFFSET EQU 0fb00h +; DSC_GDTPTR EQU 30h +; DSC_GDTSIZ EQU 38h +; DSC_CS EQU 14 DSC_DS EQU 16 DSC_SS EQU 18 @@ -73,12 +80,12 @@ _SmiEntryPoint: DW offset _GdtDesc - _SmiEntryPoint + 8000h ; bx = GdtDesc offset ; fix GDT descriptor DB 2eh, 0a1h ; mov ax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTSIZ +gPsdGdtSize DW ? ; DSC_OFFSET + DSC_GDTSIZ DB 48h ; dec ax DB 2eh mov [rdi], eax ; mov cs:[bx], ax DB 66h, 2eh, 0a1h ; mov eax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTPTR +gPsdGdtPtr DW ? ; DSC_OFFSET + DSC_GDTPTR DB 2eh mov [rdi + 2], ax ; mov cs:[bx + 2], eax DB 66h, 2eh @@ -177,7 +184,10 @@ Base: @LongMode: ; long mode (64-bit code) starts here mov rax, offset gSmiHandlerIdtr lidt fword ptr [rax] - lea ebx, [rdi + DSC_OFFSET] + + movzx rsi, word ptr [gSmmPsdOffset] ; lea ebx, [rdi + DSC_OFFSET] + lea ebx, [rdi + rsi] ; + mov ax, [rbx + DSC_DS] mov ds, eax mov ax, [rbx + DSC_OTHERSEG] diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm index c3c094f..3a841c9 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2016, Intel Corporation. All rights reserved.
+; Copyright (c) 2017, AMD Incorporated. All rights reserved.
+; ; This program and the accompanying materials ; are licensed and made available under the terms and conditions of the BSD License ; which accompanies this distribution. The full text of the license may be found at @@ -29,12 +31,13 @@ ; ; Constants relating to PROCESSOR_SMM_DESCRIPTOR ; -%define DSC_OFFSET 0xfb00 -%define DSC_GDTPTR 0x30 -%define DSC_GDTSIZ 0x38 -%define DSC_CS 14 -%define DSC_DS 16 -%define DSC_SS 18 +; %define DSC_OFFSET 0xfb00 +; %define DSC_GDTPTR 0x30 +; %define DSC_GDTSIZ 0x38 +; +%define DSC_CS 14 +%define DSC_DS 16 +%define DSC_SS 18 %define DSC_OTHERSEG 20 ; ; Constants relating to CPU State Save Area @@ -44,9 +47,9 @@ %define PROTECT_MODE_CS 0x8 %define PROTECT_MODE_DS 0x20 -%define LONG_MODE_CS 0x38 -%define TSS_SEGMENT 0x40 -%define GDT_SIZE 0x50 +%define LONG_MODE_CS 0x38 +%define TSS_SEGMENT 0x40 +%define GDT_SIZE 0x50 extern ASM_PFX(SmiRendezvous) extern ASM_PFX(gSmiHandlerIdtr) @@ -60,6 +63,10 @@ global ASM_PFX(gSmiCr3) global ASM_PFX(gcSmiHandlerTemplate) global ASM_PFX(gcSmiHandlerSize) +extern ASM_PFX(gSmmPsdOffset) +global ASM_PFX(gPsdGdtSize) +global ASM_PFX(gPsdGdtPtr) + DEFAULT REL SECTION .text @@ -67,10 +74,18 @@ BITS 16 ASM_PFX(gcSmiHandlerTemplate): _SmiEntryPoint: mov bx, _GdtDesc - _SmiEntryPoint + 0x8000 - mov ax,[cs:DSC_OFFSET + DSC_GDTSIZ] + + mov eax, ASM_PFX(gPsdGdtSize) ; mov ax, [cs:DSC_OFFSET + DSC_GDTSIZ] + mov si, [cs:eax] ; + mov ax, [cs:si] ; + dec ax mov [cs:bx], ax - mov eax, [cs:DSC_OFFSET + DSC_GDTPTR] + + mov eax, ASM_PFX(gPsdGdtPtr) ; mov eax, [cs:DSC_OFFSET + DSC_GDTPTR] + mov si, [cs:eax] ; + mov eax, [cs:si] ; + mov [cs:bx + 2], eax o32 lgdt [cs:bx] ; lgdt fword ptr cs:[bx] mov ax, PROTECT_MODE_CS @@ -160,7 +175,10 @@ Base: @LongMode: ; long mode (64-bit code) starts here mov rax, ASM_PFX(gSmiHandlerIdtr) lidt [rax] - lea ebx, [rdi + DSC_OFFSET] + + movzx rsi, word [ASM_PFX(gSmmPsdOffset)] ; lea ebx, [rdi + DSC_OFFSET] + lea ebx, [rdi + rsi] + mov ax, [rbx + DSC_DS] mov ds, eax mov ax, [rbx + DSC_OTHERSEG] @@ -220,5 +238,8 @@ _SmiHandler: .1: rsm +ASM_PFX(gPsdGdtSize): RESW 1 +ASM_PFX(gPsdGdtPtr) : RESW 1 + gcSmiHandlerSize DW $ - _SmiEntryPoint -- 2.7.4