From patchwork Mon Apr 24 10:49:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petri Savolainen X-Patchwork-Id: 98037 Delivered-To: patch@linaro.org Received: by 10.140.109.52 with SMTP id k49csp1422742qgf; Mon, 24 Apr 2017 03:56:18 -0700 (PDT) X-Received: by 10.55.203.65 with SMTP id d62mr9257406qkj.245.1493031378023; Mon, 24 Apr 2017 03:56:18 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id m41si17688328qtb.264.2017.04.24.03.56.17; Mon, 24 Apr 2017 03:56:18 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 9E023607B3; Mon, 24 Apr 2017 10:56:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id E12A260C3A; Mon, 24 Apr 2017 10:51:25 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 5C858608C8; Mon, 24 Apr 2017 10:50:58 +0000 (UTC) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0093.outbound.protection.outlook.com [104.47.1.93]) by lists.linaro.org (Postfix) with ESMTPS id E3663608DF for ; Mon, 24 Apr 2017 10:50:09 +0000 (UTC) Received: from DB6PR07CA0061.eurprd07.prod.outlook.com (10.175.237.151) by AM4PR0701MB2114.eurprd07.prod.outlook.com (10.167.132.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1061.6; Mon, 24 Apr 2017 10:50:08 +0000 Received: from AM5EUR03FT060.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e08::203) by DB6PR07CA0061.outlook.office365.com (2603:10a6:6:2a::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1061.6 via Frontend Transport; Mon, 24 Apr 2017 10:50:08 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning linaro.org discourages use of 131.228.2.240 as permitted sender) Received: from mailrelay.int.nokia.com (131.228.2.240) by AM5EUR03FT060.mail.protection.outlook.com (10.152.16.160) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1047.9 via Frontend Transport; Mon, 24 Apr 2017 10:50:08 +0000 Received: from fihe3nok0734.emea.nsn-net.net (localhost [127.0.0.1]) by fihe3nok0734.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id v3OAnH11005805 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 24 Apr 2017 13:49:17 +0300 Received: from 10.144.19.15 ([10.144.104.219]) by fihe3nok0734.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id v3OAnHYQ005796 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT) for ; Mon, 24 Apr 2017 13:49:17 +0300 X-HPESVCS-Source-Ip: 10.144.104.219 From: Petri Savolainen To: Date: Mon, 24 Apr 2017 13:49:11 +0300 Message-ID: <20170424104917.24102-3-petri.savolainen@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170424104917.24102-1-petri.savolainen@linaro.org> References: <20170424104917.24102-1-petri.savolainen@linaro.org> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.240; IPV:CAL; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(39860400002)(39840400002)(39400400002)(39850400002)(39450400003)(39410400002)(2980300002)(189002)(199003)(9170700003)(110136004)(38730400002)(22756006)(189998001)(50226002)(8936002)(2906002)(1076002)(86362001)(53936002)(33646002)(8676002)(2351001)(105596002)(50466002)(48376002)(106466001)(36756003)(5660300001)(305945005)(6916009)(6666003)(2950100002)(47776003)(77096006)(5003940100001)(76176999)(356003)(81166006)(50986999)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:AM4PR0701MB2114; H:mailrelay.int.nokia.com; FPR:; SPF:SoftFail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; AM5EUR03FT060; 1:lZdyt+ufgLWimJbhGCgsjOVIfQqMPbPO5n5m9PN9RHn9WfOpEfZrl81C/ucdoAiWu6X+AYmQRTrdb/gLm0QarovDAvqzWq04gWsvDa7GySOyBxVW45wJfVV07MxDmpkAUMTfCcItnIx/spQhwqrWC3M/CddpYjGl2W+Nqz3modW1GGdEFoha7OV3S7fCYodHnVSHeFXVn+7oTMfNz/olKxnuayF/18RGtbXgwOMHqXTKfKWym5fS8QY6VcCJ3OQUnuJ+7+bB/mGD8v48O/CbHyoV7p/COnOsFL5ieIicad3J78Vj72/1nQ8J46m3CObxiG2qCzwxV1Tqz3VRWHkRhTq1eOdPAtpnTSW1/EU0o/PHwbsYKrU1AjozFGmwPg5maYtN6rzTxmdMg/6EXhLQtwxCefJmrkgr/6m186OqyfCyQ68ePi3AAGN9GAlT7p7adhIo/VrCBz/flz3sK4hEuee/xaFZvfSWXFdAKx8v3sChDxeWDkS1c3+NdlCY72bCbO8aybSPhQAiElC+2SPwPA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: a599550a-c6d1-426a-ae68-08d48affac92 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(201703131423075)(201703031133081); SRVR:AM4PR0701MB2114; X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 3:Z791JQtnJuNZ0YUi4cX1mMIfGfxJqiXemGzk5pA4I+/KvWxgcPICGA9AN5XDAjzGsVmcTf6YDm18KcCSc7odHnTLz1ovYdUDDbkPTAq5BVRKkDbXX6+NVNCrF1n4fnGdr5p+snKu+IcbDXNoBECk3RW5iyXt1NGwpAS3LbWCn4vE6ZMxk8G4h+e2dthWcbN9cHnSG8aKbape/xZke88VCvBePiRLubDCihZX5JLTpi6Xbtaedtgm68p4hOk7JvVWdCKE8lbxGk8Whn+i4iy+7JH/gv8zNC44fwieLWfNdTlyGmTPQG6EkpTzkZ77MBGNaXTEIsK8+ZmfaqGJLZh0UnFAs0gskozl2wMO4MoPiIVTnqw7/3ctsHALPsD0acDd6tQPVMSkL52cnOaOfmEV8oCKzNgr7/tMxU+hPkFZe1Z0herEM1CuMOKqGcHSJyNexr03Ex5VVu1fwVsnfw+QsQ== X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 25:gEwHvqsU8mA0Uw8GZGL2juigvJcSCVi9I4J24rqe3a2wr92qXiifu3trLvceY4Erbdf0bti88NpZIdo4mNMmvVkXc3OOAzu8KSkmtnXWpY6FU5vw9kQ1lbqLirR5ksU2WTxEoFi2ysEB2wsdyzPsSUs9nVCuY2bnqkscLu8nqfzYtBobqfBLI3QJvizqaXGU4yEOXN3KSN6ZMi/fg7GlEvxzL5KS3dVDnO4PndrmH6StvYeQYh1jDFnCHS2aXa7BoIlE1WoIyT/xCsIdksKQC5OBo/sTvIT1Dm/aZIz0K2Te7HdsiROlu+kN5Ky53JDeAChxnPdvdbuInnQMafQWHw2auCHVOlIIdwmyL0V51IwnSpL8nkblf3s/5aIXtlBr+nFGZaO3h4ly9wzzCOv5zzt10W8HchBXDBjTU/cIytcqdLkqd5pxFOIOz4rXc9BymRYecODUY+5jEPbAJpVKEdyAAjuq8ugA8l0dOP51/9k=; 31:36xjQ9F18MXyLMqip/bj7l036G1WGoVCRIjqQjkw8JAwRxBEQlcpI7FsRxa4rpo7MOsfvvR/3D9vXFCILAstEP5Gc5lQbF/5ykvVaLwMWYO+D1kKiWfLm+9T3BD2id9brMB0jcY6lkvT7yND84vvGCuiSPHAvNsUVbaQ60hi4EA5m+nxe+RwX+d+aHOX0CfRVpqbwtxOOW2G9lsN1bP7VZ7KElm5y/28LBWLd0xm42gACMq6hzLlL+f10OZmiOhM X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 20:Eq1UPdx/CyvBnAh4x7m0CP7v49Yf/cZf31mmjhNY8chXIjvr+Vd0Fx5aq6bV41RrRkhEDE6nr5Bm0G8Jl+TJU/YANMDGX4iUlnVmHZ4Bw7gM5685fiBdrRBA3Z7DWUEds+JVOqZBRtKR27wekabm3oGxkD1J5bWxljL5qqvjdfW9EaxusU5/TkWImw5CuyWKwiogjT6t0P+aqmJ3qTiVv3frAEgDBEL6EAtwvgThSzjT73BpkzM4ydizusm4zu1J4AFjhL5969DSbcYJog+je2pdZTMEox/bRAK3cHtpGbazZORMWOjUqfwtqFMi65u2m+Q3g0AWahwrJJobSToQ9gIzGgfsBa8Bl2bgMOtdJZC/xg2ETurXtPTUhhJTFtHFWn0ou1m0Bj9xE944K1mjTrt9z2uUgS3sr73ekDQGjFnl3crBno+LgjSkj67a6ULMRvWaS7NpFZhL9usZoBwYK8cOpg9lbiU+QR8eUJAW/3zjoLHIskf9yHhvFig80T0N+v/OvPhKgXIT4cOyT/37wK9KSAdYrkVko0x4DGdn1v+HXfm4zI2jAypcr417Zt2K0hx2gfzHH0UEw9yO9tYqp5LJxPclGHofG/fUF1Pxryw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(13021025)(13013025)(13023025)(3002001)(10201501046)(93006095)(93003095)(6055026)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(20161123558099)(201703131423075)(201702281528075)(201703061421075)(201703061750152)(6072148); SRVR:AM4PR0701MB2114; BCL:0; PCL:0; RULEID:; SRVR:AM4PR0701MB2114; X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 4:1awPnOAc11cdXz940wJZi7igPPB7wHDg911A12MFqb8DTP+Rk18j9DVxSxMUZYA/NVO+YdGYsDKdoK7cN2pxMxfMPQ+HTgscRcZC5zwFFS85Nzic0Bg7nLxM5qyg8zJftgKSy4vLa5ismXInPxh+ngkS+fx1xmaX4QNdUYZ0OTksHnBAYezql7I3UdXdJa8bG+qj2DnGgbmN9UarTqkdT1G8RtDrYUWgdO/BUyGe7cm87bwa2x4yIo/epheZTKq0MJdsk0XN3mBYI0n8mZIOuC32RG7KW3wdTmz+O/vgkwt1yYRajP68p6H+Eo1z/0wjepAkrDa2i0bMMoi+4aRHHTbosoPMB54PDZq9i0OlTPc2EhBUN+kW73EarAxzHIIMHX5BaHSdTip+njsuVTcBjejmufcNaYbxXA/Vvn0AajiMXekywEvUw0rg+34x34XvPUOocKkLGP2JsLMCSMBrVtb4DBGEt5TBbrpcLiMHny6RJhAU2WmLBXLwleY8QNtb4ERzatqN7VPGBM4NgKGeWzpvSEGh3NykIfiJ768ipMyB8vdvU3Ls49xsjhvTYY5XaZYU8E4+kvJOLS7ugifROqLfcTZN7qLaJQ4IajKPWoq27JKVv5D9ggQz1UqWQGOw32UVNDv8ul79UuT7jvhYkGFKxq1Ju0Fn0Hevyf//wclsOdhiyZrZ7ogxNnlYM/syvcxWxvKIlDqzFpfbcIFLu8QGH7IuaJ8emZ06eGMwpgzPFwnhH5Vawht2Alljp9lUpXpkyP1DpLMGF4jQAWmr5VzDka6x3Uqkmm6nRECBQdQkkEXPKmgpptNAP0hik1Q3+9DNfGRt7Evw0LAulOQYxqbI2lx1NQb0kekQ/EOnx7g= X-Forefront-PRVS: 0287BBA78D X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM4PR0701MB2114; 23:mS1bhqzVUrLhft0IGiQdicRKRNykEW1JmwVLlQK?= A2RVsYwb3Pythxjn/fBT4MLtcq3SeyUqcuhOAZdCy7z+UrxMa5ZD+ljJ4T5hKVnqpWfFNz0dV3NOUtfqzLYHBsZtOvigFEpvF5kpMRrvpGKJEv+hJCwhh4ZQ7/yutdot5p/d7xLYPDXV/uoRakumt9/8ldUi5lSdl129UgPmQjzqb1MO/2q4GXvxi1Frb7QTTLivrvvHKmV5W7Ms9+3Q7qjBHI8KY2pDtgZlSREmjxxqs6EVFC5BcW3v+CVVy1c+XeeYHEyQz53wfopk38rCm6YvzXisBRf5K9AIKsqUSSK+yCMbSmylToMWuFaW2h9jwxmzVsVeSsZylIdAXR4vHeksY5UHvlobDQQ240F6ITST/nvgcYqgt5Qb0gQWmZNqLbqEUsTaQEdW8UKUclI2A5owoqVc3LP3RNxquanCta3ZQqfM7vtvbzuJ4IxxC6hIemiFZXx7mkc2Q62SUuIcrSSGC2tE8P3xB3z0QIs9atPqPB2gYrNZ1Y1KcOesUL8YxVMqUV1opObJEgaVdcOmd0UbjzGbXbLeH6RDhfZjKd8coP5yFeI7HQXW9x8f5AC38F37XepYUuWVzkYseJxD/tD0Po6B7bLGDVF0Gw4EAEY/BSEm5ZvXhx4FB2/1lH2gSTht5wmyiIKNCREKuSsfUhLZ4KUOmRS6rQ7V6n87juNvIcHpIlQiBRkP4kzLgNhykJazpm+5Js+G+Sk6JGfjyEyjgaeeHHfth0qCJlFPc79Ci4kLbRVkooHFPjKUyYoKDiIpOsLmFog0QnpFN8xCWIBzhwmfAmysyYO1amY3+bBza4i0K0iNogMpZePyR6P+SkjI4KgBuK1cJw6jvDTWyp8QW8nymXJF6OAT4RAYdcDkd9AzNXEnGmK5aBjTGNI7NMEbKwfuOYs3OZlJ89zdB2lPeiwiU4+JaZBX7SBnjeEivrijD6whVgyHvsVwdCTed6Nb8lCLnXomRE74xEk6W2ugnS1pvOQC1LnUnXtDSymUjlJnXAjGGssE2m/1xp+Gpbx0AD6MPQSQWfK3HHDckGLPE X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 6:27A+ADdL2jTNCQZ5+bvlCfMuCTA78WTpo+SubnQYGa97F/rjHHx7L3nREYKu9Uo1UcXqvCUU3SQcJ66+lU5kM/DMlujZs+S0q3r8LCVO8+u7LHcynGCJRI+SidFIG5WkwKWfAsbS4+Ftwki6FGe8Dk5xOULdltSrJ8Zanlt9EY2IpOyFT3wkuGxVZ/1UlV1qAwiMP/VpWqgNJNKiBaU06iVI2Wbpr1qPhaS+A38WkGU4fp/fuUippn4I8CQpOFEn3j1qIkNtcf3ECKW9F68kNyDVe62vMLEE8mLE4Da6ir1tNiisOO1Y5lYDEhv8l5IRWC9JKCb6ar+hP40zIrbb/i2D95fEICG0ZZasbsuzkShFAmTnvi6V4YHLZEC9pbqUdgh+wObWRX8pwGYgjvx7py5Y3UtNKJFm5dTqWGAB96yTQtfdSzRfEe9EGdWAFEK3h384X4Itscu1z4WEaigAJcC33oqBcA9sqoJmxfg+hwegRnWszQyKllnDPgKJqNt00/DReOJXfyHk05uToKBUax7pt8+rFcg93hcrI+Ciyw7T6tObDNbaEkRGVH0C4isu; 5:i0f5+e86lMQy8R79J8wATpvaGT1/7uGz6fgN3Cqcz8ESI0UHi0ZD03GSmFbAK3BGgL6KQ0d6P6k37DJ56elvG/9ihHS8agHNbauSPI3CoNBrmvp/GEAG14M+rgTlmrp73FexihqPsoxWzGEzzS9EcQ==; 24:DlR/3drX5aHK9uv6uGrsH1AifSzCNSBRFobYkox6bZ0pviNGsomLphws1ixtIQfGjA8m3mGEhNKdt4DT1ZyV0f7wN/XO8ixFVHvxIlrQw14= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM4PR0701MB2114; 7:MYyGpUmj842nVO8J5HLT7EBrQsCLLcdBX2Vhonmk1eUmqlO/JynFfCuYfHbNVx4RoyK83mUjHK21NBvnQYl1YMFfywOjxyIVRmd8R4vatlFrRuy0ImWKZEftZbXEvk4Z6GgHTRtFgxNgL3ghqo7OjxAAUdDgD0gLwpwFhEnhDb/+VdWO5SnfPSmJyCYvh2hd+VuvXJQ1MrReWJEocoKHBoQM6/SwW/NslbIWCbJ2OROwKoTwIrKEH0nSJO566Yq6xj++QYjBE7Rb7upFJE78/3VuBRgZy8dU2LMJaUzOQc6TKKvlJ0wP0WGU9YGJ8r9Ey+Jx2MqFx/WchtwXAWi5vA== X-OriginatorOrg: nokia.onmicrosoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2017 10:50:08.0951 (UTC) X-MS-Exchange-CrossTenant-Id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5d471751-9675-428d-917b-70f44f9630b0; Ip=[131.228.2.240]; Helo=[mailrelay.int.nokia.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0701MB2114 Subject: [lng-odp] [API-NEXT PATCH v2 2/8] linux-gen: cpu_flags: added x86 cpu flag read functions X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" When building on x86 CPU flags can be used to determine which CPU features are supported. CPU flag definitions and the code to read the flags is from DPDK. Signed-off-by: Petri Savolainen --- configure.ac | 1 + platform/Makefile.inc | 4 +- platform/linux-generic/Makefile.am | 4 + platform/linux-generic/arch/x86/cpu_flags.c | 359 ++++++++++++++++++++++++++++ platform/linux-generic/arch/x86/cpu_flags.h | 20 ++ 5 files changed, 387 insertions(+), 1 deletion(-) create mode 100644 platform/linux-generic/arch/x86/cpu_flags.c create mode 100644 platform/linux-generic/arch/x86/cpu_flags.h -- 2.11.0 diff --git a/configure.ac b/configure.ac index e86e2dca..38129030 100644 --- a/configure.ac +++ b/configure.ac @@ -224,6 +224,7 @@ AM_CONDITIONAL([HAVE_DOXYGEN], [test "x${DOXYGEN}" = "xdoxygen"]) AM_CONDITIONAL([user_guide], [test "x${user_guides}" = "xyes" ]) AM_CONDITIONAL([HAVE_MSCGEN], [test "x${MSCGEN}" = "xmscgen"]) AM_CONDITIONAL([helper_linux], [test x$helper_linux = xyes ]) +AM_CONDITIONAL([ARCH_IS_X86], [test "x${ARCH_DIR}" = "xx86"]) ########################################################################## # Setup doxygen documentation diff --git a/platform/Makefile.inc b/platform/Makefile.inc index 874cf887..f0776134 100644 --- a/platform/Makefile.inc +++ b/platform/Makefile.inc @@ -111,4 +111,6 @@ EXTRA_DIST = \ arch/powerpc/odp_sysinfo_parse.c \ arch/x86/odp/api/cpu_arch.h \ arch/x86/odp_cpu_arch.c \ - arch/x86/odp_sysinfo_parse.c + arch/x86/odp_sysinfo_parse.c \ + arch/x86/cpu_flags.c \ + arch/x86/cpu_flags.h diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 81a19011..60b7f849 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -252,6 +252,10 @@ __LIB__libodp_linux_la_SOURCES = \ arch/@ARCH_DIR@/odp_cpu_arch.c \ arch/@ARCH_DIR@/odp_sysinfo_parse.c +if ARCH_IS_X86 +__LIB__libodp_linux_la_SOURCES += arch/@ARCH_DIR@/cpu_flags.c +endif + if HAVE_PCAP __LIB__libodp_linux_la_SOURCES += pktio/pcap.c endif diff --git a/platform/linux-generic/arch/x86/cpu_flags.c b/platform/linux-generic/arch/x86/cpu_flags.c new file mode 100644 index 00000000..954dac27 --- /dev/null +++ b/platform/linux-generic/arch/x86/cpu_flags.c @@ -0,0 +1,359 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +enum rte_cpu_flag_t { + /* (EAX 01h) ECX features*/ + RTE_CPUFLAG_SSE3 = 0, /**< SSE3 */ + RTE_CPUFLAG_PCLMULQDQ, /**< PCLMULQDQ */ + RTE_CPUFLAG_DTES64, /**< DTES64 */ + RTE_CPUFLAG_MONITOR, /**< MONITOR */ + RTE_CPUFLAG_DS_CPL, /**< DS_CPL */ + RTE_CPUFLAG_VMX, /**< VMX */ + RTE_CPUFLAG_SMX, /**< SMX */ + RTE_CPUFLAG_EIST, /**< EIST */ + RTE_CPUFLAG_TM2, /**< TM2 */ + RTE_CPUFLAG_SSSE3, /**< SSSE3 */ + RTE_CPUFLAG_CNXT_ID, /**< CNXT_ID */ + RTE_CPUFLAG_FMA, /**< FMA */ + RTE_CPUFLAG_CMPXCHG16B, /**< CMPXCHG16B */ + RTE_CPUFLAG_XTPR, /**< XTPR */ + RTE_CPUFLAG_PDCM, /**< PDCM */ + RTE_CPUFLAG_PCID, /**< PCID */ + RTE_CPUFLAG_DCA, /**< DCA */ + RTE_CPUFLAG_SSE4_1, /**< SSE4_1 */ + RTE_CPUFLAG_SSE4_2, /**< SSE4_2 */ + RTE_CPUFLAG_X2APIC, /**< X2APIC */ + RTE_CPUFLAG_MOVBE, /**< MOVBE */ + RTE_CPUFLAG_POPCNT, /**< POPCNT */ + RTE_CPUFLAG_TSC_DEADLINE, /**< TSC_DEADLINE */ + RTE_CPUFLAG_AES, /**< AES */ + RTE_CPUFLAG_XSAVE, /**< XSAVE */ + RTE_CPUFLAG_OSXSAVE, /**< OSXSAVE */ + RTE_CPUFLAG_AVX, /**< AVX */ + RTE_CPUFLAG_F16C, /**< F16C */ + RTE_CPUFLAG_RDRAND, /**< RDRAND */ + + /* (EAX 01h) EDX features */ + RTE_CPUFLAG_FPU, /**< FPU */ + RTE_CPUFLAG_VME, /**< VME */ + RTE_CPUFLAG_DE, /**< DE */ + RTE_CPUFLAG_PSE, /**< PSE */ + RTE_CPUFLAG_TSC, /**< TSC */ + RTE_CPUFLAG_MSR, /**< MSR */ + RTE_CPUFLAG_PAE, /**< PAE */ + RTE_CPUFLAG_MCE, /**< MCE */ + RTE_CPUFLAG_CX8, /**< CX8 */ + RTE_CPUFLAG_APIC, /**< APIC */ + RTE_CPUFLAG_SEP, /**< SEP */ + RTE_CPUFLAG_MTRR, /**< MTRR */ + RTE_CPUFLAG_PGE, /**< PGE */ + RTE_CPUFLAG_MCA, /**< MCA */ + RTE_CPUFLAG_CMOV, /**< CMOV */ + RTE_CPUFLAG_PAT, /**< PAT */ + RTE_CPUFLAG_PSE36, /**< PSE36 */ + RTE_CPUFLAG_PSN, /**< PSN */ + RTE_CPUFLAG_CLFSH, /**< CLFSH */ + RTE_CPUFLAG_DS, /**< DS */ + RTE_CPUFLAG_ACPI, /**< ACPI */ + RTE_CPUFLAG_MMX, /**< MMX */ + RTE_CPUFLAG_FXSR, /**< FXSR */ + RTE_CPUFLAG_SSE, /**< SSE */ + RTE_CPUFLAG_SSE2, /**< SSE2 */ + RTE_CPUFLAG_SS, /**< SS */ + RTE_CPUFLAG_HTT, /**< HTT */ + RTE_CPUFLAG_TM, /**< TM */ + RTE_CPUFLAG_PBE, /**< PBE */ + + /* (EAX 06h) EAX features */ + RTE_CPUFLAG_DIGTEMP, /**< DIGTEMP */ + RTE_CPUFLAG_TRBOBST, /**< TRBOBST */ + RTE_CPUFLAG_ARAT, /**< ARAT */ + RTE_CPUFLAG_PLN, /**< PLN */ + RTE_CPUFLAG_ECMD, /**< ECMD */ + RTE_CPUFLAG_PTM, /**< PTM */ + + /* (EAX 06h) ECX features */ + RTE_CPUFLAG_MPERF_APERF_MSR, /**< MPERF_APERF_MSR */ + RTE_CPUFLAG_ACNT2, /**< ACNT2 */ + RTE_CPUFLAG_ENERGY_EFF, /**< ENERGY_EFF */ + + /* (EAX 07h, ECX 0h) EBX features */ + RTE_CPUFLAG_FSGSBASE, /**< FSGSBASE */ + RTE_CPUFLAG_BMI1, /**< BMI1 */ + RTE_CPUFLAG_HLE, /**< Hardware Lock elision */ + RTE_CPUFLAG_AVX2, /**< AVX2 */ + RTE_CPUFLAG_SMEP, /**< SMEP */ + RTE_CPUFLAG_BMI2, /**< BMI2 */ + RTE_CPUFLAG_ERMS, /**< ERMS */ + RTE_CPUFLAG_INVPCID, /**< INVPCID */ + RTE_CPUFLAG_RTM, /**< Transactional memory */ + RTE_CPUFLAG_AVX512F, /**< AVX512F */ + + /* (EAX 80000001h) ECX features */ + RTE_CPUFLAG_LAHF_SAHF, /**< LAHF_SAHF */ + RTE_CPUFLAG_LZCNT, /**< LZCNT */ + + /* (EAX 80000001h) EDX features */ + RTE_CPUFLAG_SYSCALL, /**< SYSCALL */ + RTE_CPUFLAG_XD, /**< XD */ + RTE_CPUFLAG_1GB_PG, /**< 1GB_PG */ + RTE_CPUFLAG_RDTSCP, /**< RDTSCP */ + RTE_CPUFLAG_EM64T, /**< EM64T */ + + /* (EAX 80000007h) EDX features */ + RTE_CPUFLAG_INVTSC, /**< INVTSC */ + + /* The last item */ + RTE_CPUFLAG_NUMFLAGS, /**< This should always be the last! */ +}; + +enum cpu_register_t { + RTE_REG_EAX = 0, + RTE_REG_EBX, + RTE_REG_ECX, + RTE_REG_EDX, +}; + +typedef uint32_t cpuid_registers_t[4]; + +/** + * Struct to hold a processor feature entry + */ +struct feature_entry { + uint32_t leaf; /**< cpuid leaf */ + uint32_t subleaf; /**< cpuid subleaf */ + uint32_t reg; /**< cpuid register */ + uint32_t bit; /**< cpuid register bit */ +#define CPU_FLAG_NAME_MAX_LEN 64 + char name[CPU_FLAG_NAME_MAX_LEN]; /**< String for printing */ +}; + +#define FEAT_DEF(name, leaf, subleaf, reg, bit) \ + [RTE_CPUFLAG_##name] = {leaf, subleaf, reg, bit, #name }, + +static const struct feature_entry cpu_feature_table[] = { + FEAT_DEF(SSE3, 0x00000001, 0, RTE_REG_ECX, 0) + FEAT_DEF(PCLMULQDQ, 0x00000001, 0, RTE_REG_ECX, 1) + FEAT_DEF(DTES64, 0x00000001, 0, RTE_REG_ECX, 2) + FEAT_DEF(MONITOR, 0x00000001, 0, RTE_REG_ECX, 3) + FEAT_DEF(DS_CPL, 0x00000001, 0, RTE_REG_ECX, 4) + FEAT_DEF(VMX, 0x00000001, 0, RTE_REG_ECX, 5) + FEAT_DEF(SMX, 0x00000001, 0, RTE_REG_ECX, 6) + FEAT_DEF(EIST, 0x00000001, 0, RTE_REG_ECX, 7) + FEAT_DEF(TM2, 0x00000001, 0, RTE_REG_ECX, 8) + FEAT_DEF(SSSE3, 0x00000001, 0, RTE_REG_ECX, 9) + FEAT_DEF(CNXT_ID, 0x00000001, 0, RTE_REG_ECX, 10) + FEAT_DEF(FMA, 0x00000001, 0, RTE_REG_ECX, 12) + FEAT_DEF(CMPXCHG16B, 0x00000001, 0, RTE_REG_ECX, 13) + FEAT_DEF(XTPR, 0x00000001, 0, RTE_REG_ECX, 14) + FEAT_DEF(PDCM, 0x00000001, 0, RTE_REG_ECX, 15) + FEAT_DEF(PCID, 0x00000001, 0, RTE_REG_ECX, 17) + FEAT_DEF(DCA, 0x00000001, 0, RTE_REG_ECX, 18) + FEAT_DEF(SSE4_1, 0x00000001, 0, RTE_REG_ECX, 19) + FEAT_DEF(SSE4_2, 0x00000001, 0, RTE_REG_ECX, 20) + FEAT_DEF(X2APIC, 0x00000001, 0, RTE_REG_ECX, 21) + FEAT_DEF(MOVBE, 0x00000001, 0, RTE_REG_ECX, 22) + FEAT_DEF(POPCNT, 0x00000001, 0, RTE_REG_ECX, 23) + FEAT_DEF(TSC_DEADLINE, 0x00000001, 0, RTE_REG_ECX, 24) + FEAT_DEF(AES, 0x00000001, 0, RTE_REG_ECX, 25) + FEAT_DEF(XSAVE, 0x00000001, 0, RTE_REG_ECX, 26) + FEAT_DEF(OSXSAVE, 0x00000001, 0, RTE_REG_ECX, 27) + FEAT_DEF(AVX, 0x00000001, 0, RTE_REG_ECX, 28) + FEAT_DEF(F16C, 0x00000001, 0, RTE_REG_ECX, 29) + FEAT_DEF(RDRAND, 0x00000001, 0, RTE_REG_ECX, 30) + + FEAT_DEF(FPU, 0x00000001, 0, RTE_REG_EDX, 0) + FEAT_DEF(VME, 0x00000001, 0, RTE_REG_EDX, 1) + FEAT_DEF(DE, 0x00000001, 0, RTE_REG_EDX, 2) + FEAT_DEF(PSE, 0x00000001, 0, RTE_REG_EDX, 3) + FEAT_DEF(TSC, 0x00000001, 0, RTE_REG_EDX, 4) + FEAT_DEF(MSR, 0x00000001, 0, RTE_REG_EDX, 5) + FEAT_DEF(PAE, 0x00000001, 0, RTE_REG_EDX, 6) + FEAT_DEF(MCE, 0x00000001, 0, RTE_REG_EDX, 7) + FEAT_DEF(CX8, 0x00000001, 0, RTE_REG_EDX, 8) + FEAT_DEF(APIC, 0x00000001, 0, RTE_REG_EDX, 9) + FEAT_DEF(SEP, 0x00000001, 0, RTE_REG_EDX, 11) + FEAT_DEF(MTRR, 0x00000001, 0, RTE_REG_EDX, 12) + FEAT_DEF(PGE, 0x00000001, 0, RTE_REG_EDX, 13) + FEAT_DEF(MCA, 0x00000001, 0, RTE_REG_EDX, 14) + FEAT_DEF(CMOV, 0x00000001, 0, RTE_REG_EDX, 15) + FEAT_DEF(PAT, 0x00000001, 0, RTE_REG_EDX, 16) + FEAT_DEF(PSE36, 0x00000001, 0, RTE_REG_EDX, 17) + FEAT_DEF(PSN, 0x00000001, 0, RTE_REG_EDX, 18) + FEAT_DEF(CLFSH, 0x00000001, 0, RTE_REG_EDX, 19) + FEAT_DEF(DS, 0x00000001, 0, RTE_REG_EDX, 21) + FEAT_DEF(ACPI, 0x00000001, 0, RTE_REG_EDX, 22) + FEAT_DEF(MMX, 0x00000001, 0, RTE_REG_EDX, 23) + FEAT_DEF(FXSR, 0x00000001, 0, RTE_REG_EDX, 24) + FEAT_DEF(SSE, 0x00000001, 0, RTE_REG_EDX, 25) + FEAT_DEF(SSE2, 0x00000001, 0, RTE_REG_EDX, 26) + FEAT_DEF(SS, 0x00000001, 0, RTE_REG_EDX, 27) + FEAT_DEF(HTT, 0x00000001, 0, RTE_REG_EDX, 28) + FEAT_DEF(TM, 0x00000001, 0, RTE_REG_EDX, 29) + FEAT_DEF(PBE, 0x00000001, 0, RTE_REG_EDX, 31) + + FEAT_DEF(DIGTEMP, 0x00000006, 0, RTE_REG_EAX, 0) + FEAT_DEF(TRBOBST, 0x00000006, 0, RTE_REG_EAX, 1) + FEAT_DEF(ARAT, 0x00000006, 0, RTE_REG_EAX, 2) + FEAT_DEF(PLN, 0x00000006, 0, RTE_REG_EAX, 4) + FEAT_DEF(ECMD, 0x00000006, 0, RTE_REG_EAX, 5) + FEAT_DEF(PTM, 0x00000006, 0, RTE_REG_EAX, 6) + + FEAT_DEF(MPERF_APERF_MSR, 0x00000006, 0, RTE_REG_ECX, 0) + FEAT_DEF(ACNT2, 0x00000006, 0, RTE_REG_ECX, 1) + FEAT_DEF(ENERGY_EFF, 0x00000006, 0, RTE_REG_ECX, 3) + + FEAT_DEF(FSGSBASE, 0x00000007, 0, RTE_REG_EBX, 0) + FEAT_DEF(BMI1, 0x00000007, 0, RTE_REG_EBX, 2) + FEAT_DEF(HLE, 0x00000007, 0, RTE_REG_EBX, 4) + FEAT_DEF(AVX2, 0x00000007, 0, RTE_REG_EBX, 5) + FEAT_DEF(SMEP, 0x00000007, 0, RTE_REG_EBX, 6) + FEAT_DEF(BMI2, 0x00000007, 0, RTE_REG_EBX, 7) + FEAT_DEF(ERMS, 0x00000007, 0, RTE_REG_EBX, 8) + FEAT_DEF(INVPCID, 0x00000007, 0, RTE_REG_EBX, 10) + FEAT_DEF(RTM, 0x00000007, 0, RTE_REG_EBX, 11) + FEAT_DEF(AVX512F, 0x00000007, 0, RTE_REG_EBX, 16) + + FEAT_DEF(LAHF_SAHF, 0x80000001, 0, RTE_REG_ECX, 0) + FEAT_DEF(LZCNT, 0x80000001, 0, RTE_REG_ECX, 4) + + FEAT_DEF(SYSCALL, 0x80000001, 0, RTE_REG_EDX, 11) + FEAT_DEF(XD, 0x80000001, 0, RTE_REG_EDX, 20) + FEAT_DEF(1GB_PG, 0x80000001, 0, RTE_REG_EDX, 26) + FEAT_DEF(RDTSCP, 0x80000001, 0, RTE_REG_EDX, 27) + FEAT_DEF(EM64T, 0x80000001, 0, RTE_REG_EDX, 29) + + FEAT_DEF(INVTSC, 0x80000007, 0, RTE_REG_EDX, 8) +}; + +/* + * Execute CPUID instruction and get contents of a specific register + * + * This function, when compiled with GCC, will generate architecture-neutral + * code, as per GCC manual. + */ +static void cpu_get_features(uint32_t leaf, uint32_t subleaf, + cpuid_registers_t out) +{ +#if defined(__i386__) && defined(__PIC__) + /* %ebx is a forbidden register if we compile with -fPIC or -fPIE */ + __asm__ __volatile__("movl %%ebx,%0 ; cpuid ; xchgl %%ebx,%0" + : "=r" (out[RTE_REG_EBX]), + "=a" (out[RTE_REG_EAX]), + "=c" (out[RTE_REG_ECX]), + "=d" (out[RTE_REG_EDX]) + : "a" (leaf), "c" (subleaf)); +#else + __asm__ __volatile__("cpuid" + : "=a" (out[RTE_REG_EAX]), + "=b" (out[RTE_REG_EBX]), + "=c" (out[RTE_REG_ECX]), + "=d" (out[RTE_REG_EDX]) + : "a" (leaf), "c" (subleaf)); +#endif +} + +static int cpu_get_flag_enabled(enum rte_cpu_flag_t feature) +{ + const struct feature_entry *feat; + cpuid_registers_t regs; + + if (feature >= RTE_CPUFLAG_NUMFLAGS) + /* Flag does not match anything in the feature tables */ + return -1; + + feat = &cpu_feature_table[feature]; + + if (!feat->leaf) + /* This entry in the table wasn't filled out! */ + return -1; + + cpu_get_features(feat->leaf & 0xffff0000, 0, regs); + if (((regs[RTE_REG_EAX] ^ feat->leaf) & 0xffff0000) || + regs[RTE_REG_EAX] < feat->leaf) + return 0; + + /* get the cpuid leaf containing the desired feature */ + cpu_get_features(feat->leaf, feat->subleaf, regs); + + /* check if the feature is enabled */ + return (regs[feat->reg] >> feat->bit) & 1; +} + +static const char *cpu_get_flag_name(enum rte_cpu_flag_t feature) +{ + if (feature >= RTE_CPUFLAG_NUMFLAGS) + return NULL; + return cpu_feature_table[feature].name; +} + +void cpu_flags_print_all(void) +{ + int len, i; + int max_str = 1024; + int max_len = max_str - 1; + char str[max_str]; + + len = snprintf(str, max_len, "\nCPU features supported:\n"); + + for (i = 0; i < RTE_CPUFLAG_NUMFLAGS; i++) { + if (cpu_get_flag_enabled(i) > 0) + len += snprintf(&str[len], max_len - len, "%s ", + cpu_get_flag_name(i)); + } + + len += snprintf(&str[len], max_len - len, + "\n\nCPU features NOT supported:\n"); + + for (i = 0; i < RTE_CPUFLAG_NUMFLAGS; i++) { + if (cpu_get_flag_enabled(i) <= 0) + len += snprintf(&str[len], max_len - len, "%s ", + cpu_get_flag_name(i)); + } + + len += snprintf(&str[len], max_len - len, "\n\n"); + + str[len] = '\0'; + ODP_PRINT("%s", str); +} diff --git a/platform/linux-generic/arch/x86/cpu_flags.h b/platform/linux-generic/arch/x86/cpu_flags.h new file mode 100644 index 00000000..f709ca08 --- /dev/null +++ b/platform/linux-generic/arch/x86/cpu_flags.h @@ -0,0 +1,20 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PLAT_CPU_FLAGS_H_ +#define ODP_PLAT_CPU_FLAGS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +void cpu_flags_print_all(void); + +#ifdef __cplusplus +} +#endif + +#endif