From patchwork Thu Oct 27 22:29:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Duran, Leo" X-Patchwork-Id: 79812 Delivered-To: patch@linaro.org Received: by 10.80.142.83 with SMTP id 19csp901695edx; Thu, 27 Oct 2016 15:30:33 -0700 (PDT) X-Received: by 10.98.102.84 with SMTP id a81mr18450619pfc.176.1477607433274; Thu, 27 Oct 2016 15:30:33 -0700 (PDT) Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id zr6si8314270pab.86.2016.10.27.15.30.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Oct 2016 15:30:33 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@amdcloud.onmicrosoft.com; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id F1BDD1A1E57; Thu, 27 Oct 2016 15:30:32 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on061a.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe4a::61a]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 327A31A1E3B for ; Thu, 27 Oct 2016 15:30:31 -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=cMwNysmXX+F6QL4RJsPV+R0oVtLgTEUIEkgaDcrwjUs=; b=mhH5Ojkl00Bx8vhSh15AyBm0qHW84JCR5XmncfGnH/ToMEJAExr3ffrZ1PQt9dh/aXypTgGXodXH7r5YMNIKGQtASt64v+ffJhFJYR/ppLH+J0Js87QXO8/8TVu3A9xAQ3gPtQjW7JUGQ6lgBbZxDBWWUyualGhqRfHlpL3t+Gg= 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 MWHPR12MB1247.namprd12.prod.outlook.com (10.169.205.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.679.12; Thu, 27 Oct 2016 22:30:28 +0000 From: Leo Duran To: Date: Thu, 27 Oct 2016 17:29:50 -0500 Message-ID: <1477607390-8225-2-git-send-email-leo.duran@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477607390-8225-1-git-send-email-leo.duran@amd.com> References: <1477607390-8225-1-git-send-email-leo.duran@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BN6PR03CA0034.namprd03.prod.outlook.com (10.175.124.20) To MWHPR12MB1247.namprd12.prod.outlook.com (10.169.205.7) X-MS-Office365-Filtering-Correlation-Id: 91a19ee4-680b-4408-7022-08d3feb8db50 X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1247; 2:DKbYtqS2nA1cj8cyBEns1LERk1I2MQIdXwzgp+u2ENzD7G9zs54WDbxvSuklffqgJjra+CtzpLfEFeZu0mJDDtp3/UCh5IxBprvUuhP3V2pdV3oJPgYJYm8O54o0FaiMMMn7qPjN/+qbG7kG+twb1cS7e9O/cEoDi+0f6mjl+yNTIDi2eX10Je7XL4JrfFAmTbNBT8dt6uW/22BSrfBurw==; 3:p2k+XnoyTmwZjRyqOYD/RRN9bM4jvNdS1BvV0wzZvQgFb/rOt1S7uXFbq784IDokO07FfUcxyUhV4pFheFTwxpuiEmcSIr3mNEtjSfSyFzPWjTzEKoE21lGE+oHT8Yvv1bGviIXr4IaLyEI75Tqh/g==; 25:RADJeH/OIhvL8dCXX+Dy3Dqst+viS7H0OMC8utaOFz6xlsBDbBcB4JsnZ2k9TfLBEfsGydvpRJJvxfGUcVp71/GJzp8BsLwQW6zRj7pU2V0NuehIKZLhraIkte+8PHgISo59Yo+62yTB1ys2ZamhiUyKVTDO6r/Bjv2WKiWVbPsB9d0reFAlCzemwMUpO0NtQzrtaeTspuM032bc8UqGr3iuhem1jAg5uwEOA7IBf+giESXra0dNMZzgNksy0xiMng4VKbtdOSYt++0TP9bPCskBfSMuEM45XBlwL0LlIzx7ZJ9hmLiSWEZBfiEnTAlpp6K7LIobTh23zeQcXPMKDW4QPKQ3sDGprKMNAtV0MRruhk8NYyF/DW2JeSjgjv4RxHJGUuk0uX0QYgJ9QQ31cIWGwlpyF7lJTSSKPfxJNrixreU4/AMblUbS5L7JKT33 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1247; X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1247; 31:8IfIJIeQ7zJDFTwaF7hyFx5wqNZKzYovaK4IEz7NabwVzOEGd+rx+WYSdKv11AVQw9jBDcZsGnJ5Aiz+GxmpHADSqrBTKLNPkeSsft3HyJGwLMTTWdLr8ymFVQ3EtY09Fiwp3FAytlhDi33U49rdPlg7LBT3fcGzfuBDe3luPGZagpCGWzGv0U/WiOJdZrf+0kY91MnZSYPxuvAJMU6XXDRIEuoK3V1X6PdNTI3PiY2O99yDWAT/wdijitsAd5BfYe+7yVl6NNTfWSVGjFc4XQ==; 20:9h9oGP01sE5zTt8eUbkEcXLB66o677WiwOK69xJShVbS5S3NWIwHRZYJ/g6ZSB2nDbvmVCYsyTr1BTWiEowj8mvqqNrC4cH0lSfdf3urSsAYy1oMwrTjM8rLZ4qwS64rRGsJm8TX9L5zDYwqFGF5oY4rS8wdCvF0EfbMYEmHryMyYs4dzFBUJm+UBdo4JcDY9aepQfsJ7G5BSsLsSSiZGlbYr+Fyz6QYqrpK/kVIZVTBMwoTNp6tr7fl8BE+Jh8aqzQfwfxVYyalByVpaAmczCaonAcEpwHbHs6iDqgEofWTRWU87008U2mJpeWTCA1YKWUui7bOY3v8lEmqTeif8/eR416/b5aIyznlRPYpx1ZMjTcRJ6t9wNo8McUN9x83wkvq39Bhaj2frsmKxuTW/VvgkooUp5IeZNgs37QJsRKOK9a9gA/nWbGcAWsoADH0QkVmcHJAi8fUA4leAajigQthl/T8xunGL0ZvkrT3vW2rIiv2U1mR776j5JI2o2+S X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026); SRVR:MWHPR12MB1247; BCL:0; PCL:0; RULEID:; SRVR:MWHPR12MB1247; X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1247; 4:1bjZSphL7SpGx4TFW0R0ANz2+Vs6g5lyYXZo+szvmAue9QApNgjSwkZP6jvLSDx6T4uqC2SujwCZP+aGIv3ejIi8tpGpEEUznJh3lD+U3DIzBJHpEx0/3hl7SWHZQTyT6hn6WUMmZST1AO7WpHwd+jvdYrHW+bV6GdnJqbYPQCC33RW3/e3CYU7xwCdtrPD6kIkED1brA81pnShDCGwyzW6ZutKEkffPsjKcTq6TdymIntnzFhP4EVvsrSylLFEQ5DtfDnqNabPaz2Sr6+ahrSY7SQchGu0572EF3Eb8dTdyY7QbI3P8/oVrzybwP3K7FD+pSAkCAZIpv8J4GtdYUp0kXztnDfSuPJKQXATV3Nm/K3KMajrngvCw+6Hy5WkyJhGj5ahckKuNKdg3OHux5BL+VrJJaPoE9nRR92pDDx0FD7HozXU1+tUxr30VSkBFmSsnbKiVPGQ3vABgT7ZT1w== X-Forefront-PRVS: 0108A997B2 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(7916002)(189002)(199003)(66066001)(6666003)(110136003)(36756003)(42186005)(92566002)(53416004)(6916009)(48376002)(2950100002)(47776003)(50466002)(305945005)(189998001)(76176999)(106356001)(2351001)(5660300001)(50986999)(7846002)(19580405001)(97736004)(105586002)(101416001)(2906002)(5003940100001)(229853001)(7736002)(19580395003)(4326007)(68736007)(8676002)(33646002)(6116002)(81156014)(77096005)(86362001)(81166006)(586003)(50226002)(3846002); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR12MB1247; H:leduran-Precision-WorkStation-T5400.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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; MWHPR12MB1247; 23:UtzayySJpS5pMkJF7ki95bTyKXJ/609Q6Znv84bGt?= =?us-ascii?Q?NncP+FRo45H4i8JtgcZRyloxmxQ5J4UOMlsGo3ggwtYcFFEc76/Pqnx7PkMu?= =?us-ascii?Q?mdRRj5U1EaG5lOAXUFSOlNt44t8Gmk1wGTwh2HTN8ADrisohQebjkOs7kI72?= =?us-ascii?Q?x42oFICdv+iCmQ1VSkugXsuqw+aUo2FT2THUE4DcHv/Vgb4ux7WbNCHjn0R9?= =?us-ascii?Q?XYzxUUMGEkPB1U0xKnFwahVW2XNo4Fif+GRyE+Svxzw0WL7eQDoSfJFhoXHa?= =?us-ascii?Q?oUkeoxU6+d1vn9Sc1dnJjxXWnYnlb43IIYQ1aMJj1FgCgJ6C83Q84doseA8E?= =?us-ascii?Q?3fZgdfFlNjWyxZ9oWGm6CRmQYqsrNkc6b7911fJntHp5Lst4PUTw73ArAAWP?= =?us-ascii?Q?jEFnANF33uKNAlK7CiJa6WC60cP/5G4ALPTsxbo8m0Wd3c1QYp98Dkyx66tX?= =?us-ascii?Q?tgkbsymRVfoAHxRo3KRkHi/X1Ew5OOx2dI2C2iMvK7FnmQ5yJx0ifiCHmTjB?= =?us-ascii?Q?dRNBB5QWPjcfNURS/fegpp9/bDyb/SOXSAyXUXNhu8dN/ic1ddAfeJg/cUoE?= =?us-ascii?Q?RI2KFERyZEEn+IsHHbG/JV1Cz4PrQGJ5yd9vXeMAOVAL3cadClv5X+Oh40la?= =?us-ascii?Q?eR7IwLiPNhyg19gkmBtE1OHpPotlWosG9kznqwVNz9tRWlHnHJv9m35JjY/j?= =?us-ascii?Q?pESlje3D51H57X9tBmAH8Bfr86H0j0Y9H00V3Cwra0c4VvKNd9cvT9JgbZgD?= =?us-ascii?Q?LNy8q9vdiHQ72fsHzw8w7kMV1hZeNz/TDlLb+6oi8W3bTPK4hTcK86hZ4TmR?= =?us-ascii?Q?8iKCAMw/RiTTerD5dOr82D1IbLEFm2K6Gkr42HPoAjX1ejx0NMOSIZBQKO1Q?= =?us-ascii?Q?PDH/L5QAANqy2IkTWkFkTgkHgpoIdx1aj9AWVzMQ0nn0vIgyCxMfJIXO/GVx?= =?us-ascii?Q?dJd4MAsQz9Ag3FWHfthikij45fykRcO/t1nSSDCUu9ezhKFO+w6r8JsZbGxs?= =?us-ascii?Q?bcNYsg+S73oe1hi5i3MNj1gQxWH/QALScCZP/1DtwgLkfbIDEvOZweblGxHR?= =?us-ascii?Q?SYr5dEFnLKai4i17CPkRLzSAIb2TS58Ej2zYWzjgeIag05hOUiezvUbx+0wr?= =?us-ascii?Q?r92YOxnTC4M4sm8GTXNzPKtfVb/0yD/LLX3eL3WfZoQyI9By/ADSw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1247; 6:luqb3GnybVaRzgaFEVYu47GCCqdUDRHmM0a9U1zXHYeIqriTAns/BOIl1dQ41wdCAciHcBksKeVSFNvUE2sdcgdPnc3CLH1DdtBbRD+yIeZWVKo24lH/WJlUyM7en649pWh6y8h/rSIG/UHTB/bS+3JRpIKZa88y32UVhv+fslYPtvIddj/LzhUE4xOs6lNmho6i9XJacfpXvnmlGF9eVgAqKefmXhoJhzBDVC0pmLVXKB868FwqTvbeB+AKpLxmivVrKgjCVHEw4cjtQwhamJ600FK2KfYO0jqecVx9E+2AuGhWvjEKo83+FL7L/gEQPgzrI0iRfWXACniFUNKLWIKnEkrZcV+NPtvwGZuT4TY=; 5:DeI8NU5wEtQDwqIM60a9t2HRZPSSl3SibXX6xzwadj1FLbCbZPysrRl67A9So7PPXky6Po9N3Tl0xqW0Vi6EPod2ZYSr3OxItYLgEvNdZAYGZGZBJ8jSW/3QDnctQ8DVH/osOz5mA3bNPIFj5ZGFtA==; 24:gj+0R5IyeeChamGyZmZ05XPIDGrQLPQ6zFRQ8dG/97WcPx+aaKBXSTiqzADkr+OgA+gKJUtjxPgG7na0rsutwNxjChVLWZjSJpe4cLuvYeQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; MWHPR12MB1247; 7:jf4CoElv1GjXOJm7ojsPGDIfAfeALLfjg13e65ErtO8xTdfmWsJiA1KGKVUQ1Tifj4ur1i8tSDqPXYB3dPHLPt75+grsnyOOIdKdfGnom0+hMTL6rMu89IjAn24AKRXUkVbqEgFMvTOLQx0h+bYKrSywpXtWc9QDw3E5cHwSAMPbjXf4VXdnrUggkufBQpBneKuyNGPLkO2RryWzzkKgOIFmBIjvXmlRRHt0gi3fyEr4z2Br5vjsmqWnkIOfSPLseB83HJJAclQdOB2y4B9CZeBwkJHY6AmqIe8SAxotwFXBbJbbr28S2f2UQ1QYWaEIWkcwufvPIqap/fFIca0TwognxYArH5mk3JOxqbhyyNE=; 20:LTlJFmPyM+XcPr5HdYFHPnuov6gKnuNVW8Xkwr5PZ9VncdqJA4fkVzeosJCMtLqXfbKViiTaXZrTcRNxu4mZRAj6uyvm46yI3yWCLngX/h0octHWctxL27sp9Ta3eX3hJlL++Uc+ffai/nL7/3GU5ATQZueHqtjQAD3HnQGecRfes1JNmZyX3qYhpYE1IEqiYQ856CFUrmMMJ0KtDag/cH4tS5NFK3Hu+DmyYGwaAdX+FYCXSMPCmfhJuX8/zwhj X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2016 22:30:28.9205 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1247 Subject: [edk2] [PATCH] UefiCpuPkg: Move GetProcessorLocation() to SmmCpuFeaturesLib library. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Leo Duran , liming.gao@intel.com Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" 1) Remove SmmGetProcessorLocation() from PiSmmCpuDxeSmm driver 2) Add SmmCpuFeaturesGetProcessorLocation() to SmmCpuFeaturesLib library Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Leo Duran --- UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h | 17 +++ .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 118 ++++++++++++++++++++ UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c | 121 +-------------------- 3 files changed, 136 insertions(+), 120 deletions(-) -- 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h b/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h index 4478003..dd14ec5 100644 --- a/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h +++ b/UefiCpuPkg/Include/Library/SmmCpuFeaturesLib.h @@ -398,4 +398,21 @@ SmmCpuFeaturesAllocatePageTableMemory ( IN UINTN Pages ); +/** + Get Package ID/Core ID/Thread ID of a processor. + + APIC ID must be an initial APIC ID. + + The algorithm assumes the target system has symmetry across physical package boundaries + with respect to the number of logical processors per package, number of cores per package. + + @param ApicId APIC ID of the target logical processor. + @param Location Returns the processor location information. +**/ +VOID +SmmCpuFeaturesGetProcessorLocation ( + IN UINT32 ApicId, + OUT EFI_CPU_PHYSICAL_LOCATION *Location + ); + #endif diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 1754f2d..1e300f3 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -673,3 +673,121 @@ SmmCpuFeaturesAllocatePageTableMemory ( return NULL; } +/** + Get Package ID/Core ID/Thread ID of a processor. + + APIC ID must be an initial APIC ID. + + The algorithm below assumes the target system has symmetry across physical package boundaries + with respect to the number of logical processors per package, number of cores per package. + + @param ApicId APIC ID of the target logical processor. + @param Location Returns the processor location information. +**/ +VOID +SmmCpuFeaturesGetProcessorLocation ( + IN UINT32 ApicId, + OUT EFI_CPU_PHYSICAL_LOCATION *Location + ) +{ + UINTN ThreadBits; + UINTN CoreBits; + UINT32 RegEax; + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; + UINT32 MaxCpuIdIndex; + UINT32 SubIndex; + UINTN LevelType; + UINT32 MaxLogicProcessorsPerPackage; + UINT32 MaxCoresPerPackage; + BOOLEAN TopologyLeafSupported; + + ASSERT (Location != NULL); + + ThreadBits = 0; + CoreBits = 0; + TopologyLeafSupported = FALSE; + + // + // Check if the processor is capable of supporting more than one logical processor. + // + AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &RegEdx); + ASSERT ((RegEdx & BIT28) != 0); + + // + // Assume three-level mapping of APIC ID: Package:Core:SMT. + // + + // + // Get the max index of basic CPUID + // + AsmCpuid (CPUID_SIGNATURE, &MaxCpuIdIndex, NULL, NULL, NULL); + + // + // If the extended topology enumeration leaf is available, it + // is the preferred mechanism for enumerating topology. + // + if (MaxCpuIdIndex >= CPUID_EXTENDED_TOPOLOGY) { + AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, 0, &RegEax, &RegEbx, &RegEcx, NULL); + // + // If CPUID.(EAX=0BH, ECX=0H):EBX returns zero and maximum input value for + // basic CPUID information is greater than 0BH, then CPUID.0BH leaf is not + // supported on that processor. + // + if ((RegEbx & 0xffff) != 0) { + TopologyLeafSupported = TRUE; + + // + // Sub-leaf index 0 (ECX= 0 as input) provides enumeration parameters to extract + // the SMT sub-field of x2APIC ID. + // + LevelType = (RegEcx >> 8) & 0xff; + ASSERT (LevelType == CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT); + if ((RegEbx & 0xffff) > 1 ) { + ThreadBits = RegEax & 0x1f; + } else { + // + // HT is not supported + // + ThreadBits = 0; + } + + // + // Software must not assume any "level type" encoding + // value to be related to any sub-leaf index, except sub-leaf 0. + // + SubIndex = 1; + do { + AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, SubIndex, &RegEax, NULL, &RegEcx, NULL); + LevelType = (RegEcx >> 8) & 0xff; + if (LevelType == CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE) { + CoreBits = (RegEax & 0x1f) - ThreadBits; + break; + } + SubIndex++; + } while (LevelType != CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID); + } + } + + if (!TopologyLeafSupported) { + AsmCpuid (CPUID_VERSION_INFO, NULL, &RegEbx, NULL, NULL); + MaxLogicProcessorsPerPackage = (RegEbx >> 16) & 0xff; + if (MaxCpuIdIndex >= CPUID_CACHE_PARAMS) { + AsmCpuidEx (CPUID_CACHE_PARAMS, 0, &RegEax, NULL, NULL, NULL); + MaxCoresPerPackage = (RegEax >> 26) + 1; + } else { + // + // Must be a single-core processor. + // + MaxCoresPerPackage = 1; + } + + ThreadBits = (UINTN) (HighBitSet32 (MaxLogicProcessorsPerPackage / MaxCoresPerPackage - 1) + 1); + CoreBits = (UINTN) (HighBitSet32 (MaxCoresPerPackage - 1) + 1); + } + + Location->Thread = ApicId & ~((-1) << ThreadBits); + Location->Core = (ApicId >> ThreadBits) & ~((-1) << CoreBits); + Location->Package = (ApicId >> (ThreadBits+ CoreBits)); +} diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c index 40f2a17..2bfb1e8 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c @@ -27,125 +27,6 @@ EFI_SMM_CPU_SERVICE_PROTOCOL mSmmCpuService = { }; /** - Get Package ID/Core ID/Thread ID of a processor. - - APIC ID must be an initial APIC ID. - - The algorithm below assumes the target system has symmetry across physical package boundaries - with respect to the number of logical processors per package, number of cores per package. - - @param ApicId APIC ID of the target logical processor. - @param Location Returns the processor location information. -**/ -VOID -SmmGetProcessorLocation ( - IN UINT32 ApicId, - OUT EFI_CPU_PHYSICAL_LOCATION *Location - ) -{ - UINTN ThreadBits; - UINTN CoreBits; - UINT32 RegEax; - UINT32 RegEbx; - UINT32 RegEcx; - UINT32 RegEdx; - UINT32 MaxCpuIdIndex; - UINT32 SubIndex; - UINTN LevelType; - UINT32 MaxLogicProcessorsPerPackage; - UINT32 MaxCoresPerPackage; - BOOLEAN TopologyLeafSupported; - - ASSERT (Location != NULL); - - ThreadBits = 0; - CoreBits = 0; - TopologyLeafSupported = FALSE; - - // - // Check if the processor is capable of supporting more than one logical processor. - // - AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, NULL, &RegEdx); - ASSERT ((RegEdx & BIT28) != 0); - - // - // Assume three-level mapping of APIC ID: Package:Core:SMT. - // - - // - // Get the max index of basic CPUID - // - AsmCpuid (CPUID_SIGNATURE, &MaxCpuIdIndex, NULL, NULL, NULL); - - // - // If the extended topology enumeration leaf is available, it - // is the preferred mechanism for enumerating topology. - // - if (MaxCpuIdIndex >= CPUID_EXTENDED_TOPOLOGY) { - AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, 0, &RegEax, &RegEbx, &RegEcx, NULL); - // - // If CPUID.(EAX=0BH, ECX=0H):EBX returns zero and maximum input value for - // basic CPUID information is greater than 0BH, then CPUID.0BH leaf is not - // supported on that processor. - // - if ((RegEbx & 0xffff) != 0) { - TopologyLeafSupported = TRUE; - - // - // Sub-leaf index 0 (ECX= 0 as input) provides enumeration parameters to extract - // the SMT sub-field of x2APIC ID. - // - LevelType = (RegEcx >> 8) & 0xff; - ASSERT (LevelType == CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT); - if ((RegEbx & 0xffff) > 1 ) { - ThreadBits = RegEax & 0x1f; - } else { - // - // HT is not supported - // - ThreadBits = 0; - } - - // - // Software must not assume any "level type" encoding - // value to be related to any sub-leaf index, except sub-leaf 0. - // - SubIndex = 1; - do { - AsmCpuidEx (CPUID_EXTENDED_TOPOLOGY, SubIndex, &RegEax, NULL, &RegEcx, NULL); - LevelType = (RegEcx >> 8) & 0xff; - if (LevelType == CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE) { - CoreBits = (RegEax & 0x1f) - ThreadBits; - break; - } - SubIndex++; - } while (LevelType != CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID); - } - } - - if (!TopologyLeafSupported) { - AsmCpuid (CPUID_VERSION_INFO, NULL, &RegEbx, NULL, NULL); - MaxLogicProcessorsPerPackage = (RegEbx >> 16) & 0xff; - if (MaxCpuIdIndex >= CPUID_CACHE_PARAMS) { - AsmCpuidEx (CPUID_CACHE_PARAMS, 0, &RegEax, NULL, NULL, NULL); - MaxCoresPerPackage = (RegEax >> 26) + 1; - } else { - // - // Must be a single-core processor. - // - MaxCoresPerPackage = 1; - } - - ThreadBits = (UINTN) (HighBitSet32 (MaxLogicProcessorsPerPackage / MaxCoresPerPackage - 1) + 1); - CoreBits = (UINTN) (HighBitSet32 (MaxCoresPerPackage - 1) + 1); - } - - Location->Thread = ApicId & ~((-1) << ThreadBits); - Location->Core = (ApicId >> ThreadBits) & ~((-1) << CoreBits); - Location->Package = (ApicId >> (ThreadBits+ CoreBits)); -} - -/** Gets processor information on the requested processor at the instant this call is made. @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. @@ -280,7 +161,7 @@ SmmAddProcessor ( gSmmCpuPrivate->ProcessorInfo[Index].ProcessorId == INVALID_APIC_ID) { gSmmCpuPrivate->ProcessorInfo[Index].ProcessorId = ProcessorId; gSmmCpuPrivate->ProcessorInfo[Index].StatusFlag = 0; - SmmGetProcessorLocation ((UINT32)ProcessorId, &gSmmCpuPrivate->ProcessorInfo[Index].Location); + SmmCpuFeaturesGetProcessorLocation ((UINT32)ProcessorId, &gSmmCpuPrivate->ProcessorInfo[Index].Location); *ProcessorNumber = Index; gSmmCpuPrivate->Operation[Index] = SmmCpuAdd;