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 445A62095E51F for ; Wed, 11 Oct 2017 12:42:16 -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=2vaAcTaRbJXNXQiuChxFduL9/00M1tzgHVSWsC6GLxA=; b=0TCKoZ7ux/T0HcwkPBEC/+IoVAJaTTMQK0/+EYsc0JXhcU8kWMEu8iL9iozMDwAudYbQMmf9KfxJGTgX6Fd7dIDMa+Pg28GjXWB6UxJx/kQCMmRhvL29v/CuKksKndTg+XLvw/rZnBjN1G2EZBEwNDgOZUPgqKDGrL9kNCT35pk= 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:42 +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:30 -0500 Message-Id: <1507751131-32404-2-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: d18b1a7e-54f4-48d3-5d80-08d510e0a8de 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:gySAfSVynwY7bJwivQ9ZNG9/ELH+MZ2JhmX0v0MRogEnrjuI+X+JVUyA1VXhjhcW2s+as+fCqMUohRxA2ir6w3TwMaTX7kQTvxMgqZtkACB9z6I9ajlF+wdeHTjZ7CCX0Dgw+u+Az4DbP8/yPaF6KmsaxFb2UitMK/vPKuJsLvvLV68PNOHib7xWr2fZaEVk+A+9fnjudfwTf0cL5p0B8H6dXxvEuCz8Zr4mdRp6wwwxCQDWK9aBEjWbVRVRlmbq; 25:sjib999+W5EUGzVlO4+Y9PhA8Sc+spkz0GxrH96xJaTIpolWz844NyETQ+aaGwsnY9vR61dgiYRsRbnGcYShIQTyfjtGQ3WnBQ0c653eL9n0dWhsd8zHkwwB+SNXNzzsCOpmQLONo9C/pbYp3tS3mnEge3AedMTlAGQNrdyucNbtukoG2oqsdquG0a9zsqHXMqrCKBq/3q/1yP1oPD5t3P/VASzC7eaJRU0kB8/aGtqJUfRXY3ekE6qEgzJG3ATjrqz+WrNBxTYBIrblcy09RYjWkunfX4IpbkdJjO1Q2xpoTlVZVJeHwWwkksGiuq4oclQIHj9GjhwFJpRZOsyPZA==; 31:kwFlk2eHbPgOIryAirZgvP7hfI63XFLKBjbZxgPWVnSp0bibnydXivOq6cBooAvz3qg7OcGoMggzx4pF8bRNOCaIciSJtUl0xKqq7oRCEIVsIid/Qwco84WnHVoz2XDl2TClwWjDryaHggURPQZVGkKmseP/0mZ8mx0R5nfGn0hABfrjntd0HONZDbdhFWI8U5FmYlxb/NV31JbXW2fNSfd3NsY56r7VfpHyju7un1s= X-MS-TrafficTypeDiagnostic: DM5PR12MB1243: X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 20:CxWIcWj/wYXg+6+ZnxvBSyDjTrfQJxHqga/jzd1EwGjQvky3YK9pRdMjaMFWuIHiiFUY7PxoZDGeHtX+7EfYkBYuE/o9Fke3AK+sHqU3m9YlDMh0Vg9mszcWqN0x5o0yhSk2qVOp9uKDTnAiZLIAdgpFoMaAU8b9P+xLg4EITFrEQkE7rYUUZK+wBvynx8KGI/0jPI8OeEqcbyvTPtH/k1Jy+r9Asw9bdFZCIeQ20XnRW5TbqytFtHssQiusz6YHnYQuTCWEcq2b/WFE1LCfH4NbtL1c9YmD0iDVXnfL9ZY3tOEWQGOlcWD8XD+toZUs80+gSdB8LsZuNeeKSSvO1wTaUWiLwd2Nu64wpKZm8jZTGhI+AsXBnxniRMlHSdXljLwRaWGN0i8KcT+U+BeVRgX2r0UF3XfCCd13X4R6Kb1dG31rNAqYlsimajhisjMEcELY/xJGFQJR2+F1/l0H+/UWCo5MYttfugdzVYBsphCkErhC1eEkGS+fcxc6IoG+; 4:InxB7LfmD4lElqT7M27FZuMrIs4oA7Dirz5g6vWnSn2Y4wf9IzN5YhYy5wM9uTnp2ayx5IqiC/e+wiyn8TsCBZQr/Wue5Zv/o/6ugOw/SBwYrLkH2ZrpUPjerwGZQMAz+h7Jp6Ko55V5P5iw2+V9k2eu+WFPFK6DIrTQ87ruBquMw/wpkFglNM7DXDw+hE4o3wOF6N6L9gVVnwHA/0PUcd36t45mMtUfQpHcL082S8F4ftwdPVu7Bh6kRddJPZkWmwczak8SJ4/7rIjo37m5HZ+IYumZlGbR30tusVrBA9VuZxMu1gikzYg+mJ+N8jscu0KxUVLk8Cd/7Jn0/7J7I+b1RkVMAldBkiq+yCQciag= 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)(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); 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:6UIy2K23wBm6kBpA11aNCZ/YMgUvvklwPbYf0jdIX?= =?us-ascii?Q?2NO9KNVPzKVDXeyGDkqVhFue1hYOlswngD3GVPcKRMGL2xWCD9gsSOenOuEq?= =?us-ascii?Q?mO50Bqx4ij8I2y3MPJ1bZ+9EShCgL7Q2AoVT/hNY+Kb0ob1vVO8uyeIgcpbA?= =?us-ascii?Q?BD/m6eo17atwfYKONdZbKziGEju5CE70Hqy0A9oJiKw0AqkM1tb2f6O6Ygez?= =?us-ascii?Q?PmVzao8I6D/xkWT5aQkUtOu0Nkq4z+3UVKN0kABcWVJ6EOaYzvWzzIt4EL7+?= =?us-ascii?Q?ollW5E4XPqv8h1ssEa/ZabEwTebUUNNNxllLscaZhcxxApp/DgZlfb4oPKuk?= =?us-ascii?Q?k5I089A/RqU/B80d/2wnSkB6z2f7pQNdGjIbgfedcLIAK1ZGaiYcT6Y0kc5w?= =?us-ascii?Q?eiqP1KC6aJFP0Ix0ravQUlDn++G36Qik/LiypwugvdH7G78wcYA1rhaW9HYR?= =?us-ascii?Q?GSJORKHLKAB7i6i8x8/ez5xHE44IsSn8VgTiFW4e25T2i0zqd+KlroYqoOPd?= =?us-ascii?Q?9fa23JmdiYgJTZLo2qCESgyriXMjXrEhNH79SdGR0bIyXi8WRx8rbvlwMPVJ?= =?us-ascii?Q?dtjO+r0IQ/vzM97/BqCTkNzfwOqLyeiscHBoWtmwFSf8LZwZS8W05RsR0Jtm?= =?us-ascii?Q?Vp1lrsrSp1GQ4+oa1I9fkV4fa7f7VDvZh1iIF9iOnhJvT39xCvcjsxpCuPP6?= =?us-ascii?Q?oqktB2N7rXAYhlJdOXop7Xess9NB47Zm+/YXEfMygAH4WXgnT5ymh1l7iTlb?= =?us-ascii?Q?gzQ+h386sBYUoCL8IVVTeNv+2h1a2kyKNTnvq9xQhgAj32KJE1jaPLdDVVjG?= =?us-ascii?Q?66Lnpt6mbWC7b0ozvy9hOTOXCdjoKhYpekRLOXvM4AMuPAKmaI29PV40INJG?= =?us-ascii?Q?9qXac8B+7MWK9UOABoi4UGN9TbHhV18ntzx9oSVEMyIKaY7xCq4ud909t+uk?= =?us-ascii?Q?8V6Sz7FWXyZyoX0JC4DH9AZzP+TW3Mk+PgRT6CFg23qrWOaxbU/q8NCr8Oyq?= =?us-ascii?Q?KU05GktrY9IDtLqHSTTsBOimR5NW6i8DF90fv9c6dYlhD1HAsf/Gadu4e+wr?= =?us-ascii?Q?stOp0oBguVbM1J55D7FfskVDQ5jFw7xA4vZoaJJ3y713U5g0n/MyG39uITj5?= =?us-ascii?Q?MZUBGkAzyWQzkDCBwUVFpt2AJ/vqxzcb4Kt8x1GO70KoYfGB4Rvlr2cpYG3K?= =?us-ascii?Q?PGjKkDZMbIfrgCQpDf8XlCwpd8/ohsOkQI1L8pklSfC54bWdlEtZar8s61Vi?= =?us-ascii?Q?GXHmVAhMWYFMtkTsEh4Al7RbORxcekfiLfu2NWmU8AnXUUpbvJJ20UtIxaIq?= =?us-ascii?Q?UiAv7bpWbH2F3HCwJ8zOI8=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 6:tdXwLtQL+Kz5aSMoW9Wjxt5VgVzIx53VUT0iDngQXLwrLC7ovyV+FF8rI69EO9y7IFEq55ixY+iHz59WOrrrgtaLN1Ck61IIzITGVJtG9KUuUQjhKLFE50qI+vBgAr0WrSGlTPjl+SIkC0+i0uS1IZcdDcEjkNxU7P2hpcli5bD6Yi9RLFnzWQWRryqNOrfbY8LiA3iKMC1HvYKu/V25zG2350Z3VXvxTZUNsnyMGLnH2Y2toTy48ex9vW6ddxfY7AYdFtsDF0jcxF6p+ZP2tv6xOwbBtQ37ouddZ5x0tqdSKqIu5rT647fg4bsGBNammNEG5lzllo2bXWvCO8a8aA==; 5:sAmKCQnuIcRBtvBiWFBzkYcGsbR3Gvd06EYZVvVeiwQPKmKEjTTzmpIvGTFkRnzZwxwVp8P3Pq3mRq6gIahpOObIIdClCnKithfReSic5ghp2+rz2rPM8BGBj3cKf4MwbhPizGJqWKbPQfzvPKd2ng==; 24:AW9isGMl5AQmgdSMTS6WWrYqTZy/3tONZNi/tfJ9hfoZfEewjFwQK4b6cTadXrmC0Aen3p4n9bJfaMHfFZJncAnZW5/giykJnQakYJwZuEg=; 7:4pl96V5bNL9/kpsDk9F2iyaAFaABeyGvCAZ+VT7hpnldV2bgIupP3cT3GSijKE/cwcQnhC5RBXblJAn7KwJwk1neU57MGkSWDk8yOLDxxTm20Te4rImNLkL3Jmb2smXYI9ugob7K391CqEuhSOOLFM7+9NAxKdrWHBMqj7pNkK01LaBqrnot84VhwQV3/SJNSr8w6gEBugifay1CFHK5Pb7oyS1P1m5as4Nb9Gf9NM4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR12MB1243; 20:Qdc/5jjcg8USap0fYs5CU4RuvfXOVpn5/EHbmACtne0W9WHUSy3qTTf5GNXCKnu1EEh58vOuKGLMX8rh2XeOVdX99UIg7wE7iKSUWy06TQKkLztg7lcGx05O6yira3QfF8wG4HY4AT7zs/Od8W2uHP1+tryi99nu790O94uNUtN7kw2pfoavIRFuEpitF/K44gDxCR6Rthr1rDUZXo/2ODUrzl0kLHXZl3SgGgr/XppeAZmR5Op9RzJ+cP+Pwye+ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2017 19:45:42.6688 (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 1/2] UefiCpuPkg/SmmCpuFeaturesLib: 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:16 -0000 Content-Type: text/plain Set global variables on Constructor 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) TXT_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 --- .../Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S | 28 ++++++---- .../Library/SmmCpuFeaturesLib/Ia32/SmiEntry.asm | 29 +++++++---- .../Library/SmmCpuFeaturesLib/Ia32/SmiEntry.nasm | 43 ++++++++++++---- UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCommon.h | 48 ++++++++++++++++++ .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 59 ++++++++++++++++++---- .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 3 ++ .../SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf | 3 ++ UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c | 39 ++++++++++++-- .../Library/SmmCpuFeaturesLib/X64/SmiEntry.S | 28 ++++++---- .../Library/SmmCpuFeaturesLib/X64/SmiEntry.asm | 30 +++++++---- .../Library/SmmCpuFeaturesLib/X64/SmiEntry.nasm | 47 ++++++++++++----- 11 files changed, 282 insertions(+), 75 deletions(-) create mode 100644 UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCommon.h diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S index 4c0f8c8..c7b49d7 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.S +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/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 @@ -28,6 +30,9 @@ ASM_GLOBAL ASM_PFX(gStmSmbase) ASM_GLOBAL ASM_PFX(gStmXdSupported) ASM_GLOBAL ASM_PFX(FeaturePcdGet (PcdCpuSmmStackGuard)) ASM_GLOBAL ASM_PFX(gStmSmiHandlerIdtr) +ASM_GLOBAL ASM_PFX(gStmPsdOffset) +ASM_GLOBAL ASM_PFX(gStmGdtSize) +ASM_GLOBAL ASM_PFX(gStmGdtPtr) .equ MSR_IA32_MISC_ENABLE, 0x1A0 .equ MSR_EFER, 0xc0000080 @@ -36,12 +41,13 @@ ASM_GLOBAL ASM_PFX(gStmSmiHandlerIdtr) # # Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR # -.equ DSC_OFFSET, 0xfb00 -.equ DSC_GDTPTR, 0x48 -.equ DSC_GDTSIZ, 0x50 -.equ DSC_CS, 0x14 -.equ DSC_DS, 0x16 -.equ DSC_SS, 0x18 +# .equ DSC_OFFSET, 0xfb00 +# .equ DSC_GDTPTR, 0x48 +# .equ DSC_GDTSIZ, 0x50 +# +.equ DSC_CS, 0x14 +.equ DSC_DS, 0x16 +.equ DSC_SS, 0x18 .equ DSC_OTHERSEG, 0x1A .equ PROTECT_MODE_CS, 0x08 @@ -55,11 +61,11 @@ _StmSmiEntryPoint: .byte 0xbb # mov bx, imm16 .word _StmGdtDesc - _StmSmiEntryPoint + 0x8000 .byte 0x2e,0xa1 # mov ax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTSIZ +ASM_PFX(gStmGdtSize): .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(gStmGdtPtr): .space 2 # .word DSC_OFFSET + DSC_GDTPTR movw %ax, %cs:2(%edi) movw %ax, %bp # ebp = GDT base .byte 0x66 @@ -167,7 +173,11 @@ XdDone: movl %cr0, %ebx orl $0x080010023, %ebx # enable paging + WP + NE + MP + PE movl %ebx, %cr0 - leal DSC_OFFSET(%edi),%ebx + + movl $ASM_PFX(gStmPsdOffset), %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/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.asm b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.asm index 91dc1eb..4dbe276 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.asm +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.asm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; 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 @@ -29,13 +31,14 @@ MSR_EFER_XD EQU 0800h ; ; Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR ; -DSC_OFFSET EQU 0fb00h -DSC_GDTPTR EQU 48h -DSC_GDTSIZ EQU 50h -DSC_CS EQU 14h -DSC_DS EQU 16h -DSC_SS EQU 18h -DSC_OTHERSEG EQU 1Ah +; DSC_OFFSET EQU 0fb00h +; DSC_GDTPTR EQU 48h +; DSC_GDTSIZ EQU 50h +; +DSC_CS EQU 14h +DSC_DS EQU 16h +DSC_SS EQU 18h +DSC_OTHERSEG EQU 1Ah PROTECT_MODE_CS EQU 08h PROTECT_MODE_DS EQU 20h @@ -54,6 +57,9 @@ EXTERNDEF gStmSmbase:DWORD EXTERNDEF gStmXdSupported:BYTE EXTERNDEF FeaturePcdGet (PcdCpuSmmStackGuard):BYTE EXTERNDEF gStmSmiHandlerIdtr:FWORD +EXTERNDEF gStmPsdOffset:WORD +EXTERNDEF gStmGdtSize:WORD +EXTERNDEF gStmGdtPtr:WORD .code @@ -63,11 +69,11 @@ _StmSmiEntryPoint: DB 0bbh ; mov bx, imm16 DW offset _StmGdtDesc - _StmSmiEntryPoint + 8000h DB 2eh, 0a1h ; mov ax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTSIZ +gStmGdtSize 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 +gStmGdtPtr DW ? ; DSC_OFFSET + DSC_GDTPTR mov cs:[edi + 2], ax ; mov cs:[bx + 2], eax mov bp, ax ; ebp = GDT base DB 66h @@ -174,7 +180,10 @@ gStmXdSupported 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 [gStmPsdOffset] ; 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/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.nasm b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.nasm index 00c0f067..023923a 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.nasm +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/Ia32/SmiEntry.nasm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2016 - 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 @@ -25,17 +27,18 @@ ; ; Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR ; -%define DSC_OFFSET 0xfb00 -%define DSC_GDTPTR 0x48 -%define DSC_GDTSIZ 0x50 -%define DSC_CS 0x14 -%define DSC_DS 0x16 -%define DSC_SS 0x18 -%define DSC_OTHERSEG 0x1a +; %define DSC_OFFSET 0xfb00 +; %define DSC_GDTPTR 0x48 +; %define DSC_GDTSIZ 0x50 +; +%define DSC_CS 0x14 +%define DSC_DS 0x16 +%define DSC_SS 0x18 +%define DSC_OTHERSEG 0x1a %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)) @@ -51,6 +54,10 @@ global ASM_PFX(gStmSmbase) global ASM_PFX(gStmXdSupported) extern ASM_PFX(gStmSmiHandlerIdtr) +extern ASM_PFX(gStmPsdOffset) +global ASM_PFX(gStmGdtSize) +global ASM_PFX(gStmGdtPtr) + ASM_PFX(gStmSmiCr3) EQU StmSmiCr3Patch - 4 ASM_PFX(gStmSmiStack) EQU StmSmiStackPatch - 4 ASM_PFX(gStmSmbase) EQU StmSmbasePatch - 4 @@ -62,10 +69,18 @@ BITS 16 ASM_PFX(gcStmSmiHandlerTemplate): _StmSmiEntryPoint: mov bx, _StmGdtDesc - _StmSmiEntryPoint + 0x8000 - mov ax,[cs:DSC_OFFSET + DSC_GDTSIZ] + + mov eax, ASM_PFX(gStmGdtSize) ; 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(gStmGdtPtr) ; 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] @@ -166,7 +181,10 @@ StmXdSupportedPatch: 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(gStmPsdOffset)] ; lea ebx, [edi + DSC_OFFSET] + lea ebx, [edi + esi] ; + mov ax, [ebx + DSC_DS] mov ds, eax mov ax, [ebx + DSC_OTHERSEG] @@ -271,5 +289,8 @@ _StmSmiHandler: ; STM init finish jmp CommonHandler +ASM_PFX(gStmGdtSize) : RESW 1 +ASM_PFX(gStmGdtPtr) : RESW 1 + ASM_PFX(gcStmSmiHandlerSize) : DW $ - _StmSmiEntryPoint ASM_PFX(gcStmSmiHandlerOffset) : DW _StmSmiHandler - _StmSmiEntryPoint diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCommon.h b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCommon.h new file mode 100644 index 0000000..78b3a5b --- /dev/null +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCommon.h @@ -0,0 +1,48 @@ +/** @file + Common declarations + + 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 + 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. + +**/ + +#ifndef _SMM_COMMON_H_ +#define _SMM_COMMON_H_ + +#include + +// +// 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 gSmramStateMapOffset; +extern UINT16 gSmmPsdOffset; + + +/** + Determine if the standard CPU signature is "AuthenticAMD". + + @retval TRUE The CPU signature matches. + @retval FALSE The CPU signature does not match. + +**/ +BOOLEAN +SmmStandardSignatureIsAuthenticAMD ( + VOID + ); + +#endif diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 2d2bc6d..1c12095 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -1,14 +1,16 @@ /** @file -The CPU specific programming for PiSmmCpuDxeSmm module. + The CPU specific programming for PiSmmCpuDxeSmm module. -Copyright (c) 2010 - 2016, 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 - 2016, 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. **/ @@ -22,6 +24,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include +#include "SmmCommon.h" + // // Machine Specific Registers (MSRs) // @@ -41,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define SMM_FEATURES_LIB_IA32_MCA_CAP 0x17D #define SMM_CODE_ACCESS_CHK_BIT BIT58 + /** Internal worker function that is called to complete CPU initialization at the end of SmmCpuFeaturesInitializeProcessor(). @@ -77,6 +82,13 @@ BOOLEAN mNeedConfigureMtrrs = TRUE; // BOOLEAN *mSmrrEnabled; +// +// Set default value for SMRAM offset +// from +// +UINT16 gSmramStateMapOffset = SMRAM_SAVE_STATE_MAP_OFFSET; + + /** The constructor function @@ -99,6 +111,13 @@ SmmCpuFeaturesLibConstructor ( UINTN ModelId; // + // Override SMRAM offset for AMD + // + if (SmmStandardSignatureIsAuthenticAMD ()) { + gSmramStateMapOffset = AMD_SMRAM_SAVE_STATE_MAP_OFFSET; + } + + // // Retrieve CPU Family and Model // AsmCpuid (CPUID_VERSION_INFO, &RegEax, NULL, NULL, &RegEdx); @@ -224,7 +243,7 @@ SmmCpuFeaturesInitializeProcessor ( // // Configure SMBASE. // - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + gSmramStateMapOffset); CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; // @@ -630,3 +649,25 @@ SmmCpuFeaturesAllocatePageTableMemory ( return NULL; } + +/** + Determine if the standard CPU signature is "AuthenticAMD". + + @retval TRUE The CPU signature matches. + @retval FALSE The CPU signature does not match. + +**/ +BOOLEAN +SmmStandardSignatureIsAuthenticAMD ( + 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); +} diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf index 77908b0..6a39d4b 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf @@ -2,6 +2,8 @@ # The CPU specific programming for PiSmmCpuDxeSmm module. # # 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 @@ -24,6 +26,7 @@ [Sources] SmmCpuFeaturesLib.c + SmmCommon.h SmmCpuFeaturesLibNoStm.c [Packages] diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf index db8dcdc..a76bed6 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLibStm.inf @@ -3,6 +3,8 @@ # is included. # # 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 @@ -25,6 +27,7 @@ [Sources] SmmCpuFeaturesLib.c + SmmCommon.h SmmStm.c SmmStm.h diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c index 45015b8..5f7c3db 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c @@ -2,6 +2,8 @@ SMM STM support functions Copyright (c) 2015 - 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 @@ -28,6 +30,8 @@ #include #include "SmmStm.h" +#include "SmmCommon.h" + #define TXT_EVTYPE_BASE 0x400 #define TXT_EVTYPE_STM_HASH (TXT_EVTYPE_BASE + 14) @@ -97,6 +101,20 @@ extern volatile UINT8 gcStmSmiHandlerTemplate[]; extern CONST UINT16 gcStmSmiHandlerSize; extern UINT16 gcStmSmiHandlerOffset; extern BOOLEAN gStmXdSupported; +extern UINT16 gStmGdtSize; +extern UINT16 gStmGdtPtr; + +// +// Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR +// +#define TXT_PSD_GDTPTR 0x48 +#define TXT_PSD_GDTSIZE 0x50 + +// +// Set default value for PSD offset in SMRAM +// from +// +UINT16 gStmPsdOffset = TXT_SMM_PSD_OFFSET; // // Variables used by SMI Handler @@ -145,6 +163,19 @@ SmmCpuFeaturesLibStmConstructor ( ASSERT_EFI_ERROR (Status); // + // Override PSD offset for AMD + // + if (SmmStandardSignatureIsAuthenticAMD ()) { + gStmPsdOffset = AMD_SMM_PSD_OFFSET; + } + + // + // Initialize STM global variables associated with SMI Handler + // + gStmGdtSize = gStmPsdOffset + TXT_PSD_GDTSIZE; + gStmGdtPtr = gStmPsdOffset + TXT_PSD_GDTPTR; + + // // Lookup the MP Services Protocol // Status = gBS->LocateProtocol ( @@ -276,8 +307,8 @@ SmmCpuFeaturesInstallSmiHandler ( UINT32 RegEdx; EFI_PROCESSOR_INFORMATION ProcessorInfo; - CopyMem ((VOID *)((UINTN)SmBase + TXT_SMM_PSD_OFFSET), &gcStmPsd, sizeof (gcStmPsd)); - Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)(VOID *)((UINTN)SmBase + TXT_SMM_PSD_OFFSET); + CopyMem ((VOID *)((UINTN)SmBase + gStmPsdOffset), &gcStmPsd, sizeof (gcStmPsd)); + Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)(VOID *)((UINTN)SmBase + gStmPsdOffset); Psd->SmmGdtPtr = GdtBase; Psd->SmmGdtSize = (UINT32)GdtSize; @@ -416,7 +447,7 @@ SmmEndOfDxeEventNotify ( } for (Index = 0; Index < gSmst->NumberOfCpus; Index++) { - Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)((UINTN)gSmst->CpuSaveState[Index] - SMRAM_SAVE_STATE_MAP_OFFSET + TXT_SMM_PSD_OFFSET); + Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)((UINTN)gSmst->CpuSaveState[Index] - gSmramStateMapOffset + gStmPsdOffset); DEBUG ((DEBUG_INFO, "Index=%d Psd=%p Rsdp=%p\n", Index, Psd, Rsdp)); Psd->AcpiRsdp = (UINT64)(UINTN)Rsdp; } @@ -1266,7 +1297,7 @@ NotifyStmResourceChange ( TXT_PROCESSOR_SMM_DESCRIPTOR *Psd; for (Index = 0; Index < gSmst->NumberOfCpus; Index++) { - Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)((UINTN)gSmst->CpuSaveState[Index] - SMRAM_SAVE_STATE_MAP_OFFSET + TXT_SMM_PSD_OFFSET); + Psd = (TXT_PROCESSOR_SMM_DESCRIPTOR *)((UINTN)gSmst->CpuSaveState[Index] - gSmramStateMapOffset + gStmPsdOffset); Psd->BiosHwResourceRequirementsPtr = (UINT64)(UINTN)StmResource; } return ; diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S index 1f9f91c..5f3386a 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.S +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/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 @@ -27,6 +29,9 @@ ASM_GLOBAL ASM_PFX(gStmSmiStack) ASM_GLOBAL ASM_PFX(gStmSmbase) ASM_GLOBAL ASM_PFX(gStmXdSupported) ASM_GLOBAL ASM_PFX(gStmSmiHandlerIdtr) +ASM_GLOBAL ASM_PFX(gStmPsdOffset) +ASM_GLOBAL ASM_PFX(gStmGdtSize) +ASM_GLOBAL ASM_PFX(gStmGdtPtr) .equ MSR_IA32_MISC_ENABLE, 0x1A0 .equ MSR_EFER, 0xc0000080 @@ -35,12 +40,13 @@ ASM_GLOBAL ASM_PFX(gStmSmiHandlerIdtr) # # Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR # -.equ DSC_OFFSET, 0xfb00 -.equ DSC_GDTPTR, 0x48 -.equ DSC_GDTSIZ, 0x50 -.equ DSC_CS, 0x14 -.equ DSC_DS, 0x16 -.equ DSC_SS, 0x18 +# .equ DSC_OFFSET, 0xfb00 +# .equ DSC_GDTPTR, 0x48 +# .equ DSC_GDTSIZ, 0x50 +# +.equ DSC_CS, 0x14 +.equ DSC_DS, 0x16 +.equ DSC_SS, 0x18 .equ DSC_OTHERSEG, 0x1a # # Constants relating to CPU State Save Area @@ -71,12 +77,12 @@ _StmSmiEntryPoint: # fix GDT descriptor # .byte 0x2e,0xa1 # mov ax, cs:[offset16] - .word DSC_OFFSET + DSC_GDTSIZ +ASM_PFX(gStmGdtSize): .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(gStmGdtPtr): .space 2 # .word DSC_OFFSET + DSC_GDTPTR .byte 0x2e movw %ax, 2(%rdi) .byte 0x66,0x2e @@ -183,7 +189,11 @@ Base: LongMode: # long mode (64-bit code) starts here movabsq $ASM_PFX(gStmSmiHandlerIdtr), %rax lidt (%rax) - lea (DSC_OFFSET)(%rdi), %ebx + + movl $ASM_PFX(gStmPsdOffset), %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/Library/SmmCpuFeaturesLib/X64/SmiEntry.asm b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.asm index ad51e07..10913df 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.asm +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/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 @@ -32,6 +34,10 @@ EXTERNDEF gStmSmiStack:DWORD EXTERNDEF gStmSmbase:DWORD EXTERNDEF gStmXdSupported:BYTE EXTERNDEF gStmSmiHandlerIdtr:FWORD +EXTERNDEF gStmPsdOffset:WORD +EXTERNDEF gStmGdtSize:WORD +EXTERNDEF gStmGdtPtr:WORD + MSR_IA32_MISC_ENABLE EQU 1A0h MSR_EFER EQU 0c0000080h @@ -40,13 +46,14 @@ MSR_EFER_XD EQU 0800h ; ; Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR ; -DSC_OFFSET EQU 0fb00h -DSC_GDTPTR EQU 48h -DSC_GDTSIZ EQU 50h -DSC_CS EQU 14h -DSC_DS EQU 16h -DSC_SS EQU 18h -DSC_OTHERSEG EQU 1ah +; DSC_OFFSET EQU 0fb00h +; DSC_GDTPTR EQU 48h +; DSC_GDTSIZ EQU 50h +; +DSC_CS EQU 14h +DSC_DS EQU 16h +DSC_SS EQU 18h +DSC_OTHERSEG EQU 1ah ; ; Constants relating to CPU State Save Area ; @@ -74,12 +81,12 @@ _StmSmiEntryPoint: DW offset _StmGdtDesc - _StmSmiEntryPoint + 8000h ; bx = GdtDesc offset ; fix GDT descriptor DB 2eh, 0a1h ; mov ax, cs:[offset16] - DW DSC_OFFSET + DSC_GDTSIZ +gStmGdtSize 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 +gStmGdtPtr DW ? ; DSC_OFFSET + DSC_GDTPTR DB 2eh mov [rdi + 2], ax ; mov cs:[bx + 2], eax DB 66h, 2eh @@ -178,7 +185,10 @@ Base: @LongMode: ; long mode (64-bit code) starts here mov rax, offset gStmSmiHandlerIdtr lidt fword ptr [rax] - lea ebx, [rdi + DSC_OFFSET] + + movzx rsi, word ptr [gStmPsdOffset] ; 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/Library/SmmCpuFeaturesLib/X64/SmiEntry.nasm b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.nasm index bcac643..df4c5a2 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.nasm +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/X64/SmiEntry.nasm @@ -1,5 +1,7 @@ ;------------------------------------------------------------------------------ ; ; Copyright (c) 2016 - 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 @@ -29,13 +31,14 @@ ; ; Constants relating to TXT_PROCESSOR_SMM_DESCRIPTOR ; -%define DSC_OFFSET 0xfb00 -%define DSC_GDTPTR 0x48 -%define DSC_GDTSIZ 0x50 -%define DSC_CS 0x14 -%define DSC_DS 0x16 -%define DSC_SS 0x18 -%define DSC_OTHERSEG 0x1a +; %define DSC_OFFSET 0xfb00 +; %define DSC_GDTPTR 0x48 +; %define DSC_GDTSIZ 0x50 +; +%define DSC_CS 0x14 +%define DSC_DS 0x16 +%define DSC_SS 0x18 +%define DSC_OTHERSEG 0x1a ; ; 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(gStmSmiHandlerIdtr) @@ -61,6 +64,10 @@ global ASM_PFX(gcStmSmiHandlerTemplate) global ASM_PFX(gcStmSmiHandlerSize) global ASM_PFX(gcStmSmiHandlerOffset) +extern ASM_PFX(gStmPsdOffset) +global ASM_PFX(gStmGdtSize) +global ASM_PFX(gStmGdtPtr) + ASM_PFX(gStmSmbase) EQU StmSmbasePatch - 4 ASM_PFX(gStmSmiStack) EQU StmSmiStackPatch - 4 ASM_PFX(gStmSmiCr3) EQU StmSmiCr3Patch - 4 @@ -73,10 +80,18 @@ BITS 16 ASM_PFX(gcStmSmiHandlerTemplate): _StmSmiEntryPoint: mov bx, _StmGdtDesc - _StmSmiEntryPoint + 0x8000 - mov ax,[cs:DSC_OFFSET + DSC_GDTSIZ] + + mov eax, ASM_PFX(gStmGdtSize) ; 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(gStmGdtPtr) ; 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 @@ -166,7 +181,10 @@ Base: @LongMode: ; long mode (64-bit code) starts here mov rax, ASM_PFX(gStmSmiHandlerIdtr) lidt [rax] - lea ebx, [rdi + DSC_OFFSET] + + movzx rsi, word [ASM_PFX(gStmPsdOffset)] ; lea ebx, [rdi + DSC_OFFSET] + lea ebx, [rdi + rsi] ; + mov ax, [rbx + DSC_DS] mov ds, eax mov ax, [rbx + DSC_OTHERSEG] @@ -262,5 +280,8 @@ _StmSmiHandler: ; STM init finish jmp CommonHandler +ASM_PFX(gStmGdtSize) : RESW 1 +ASM_PFX(gStmGdtPtr) : RESW 1 + ASM_PFX(gcStmSmiHandlerSize) : DW $ - _StmSmiEntryPoint ASM_PFX(gcStmSmiHandlerOffset) : DW _StmSmiHandler - _StmSmiEntryPoint -- 2.7.4