From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E66F7C54EE9 for ; Wed, 28 Sep 2022 01:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232478AbiI1B1N (ORCPT ); Tue, 27 Sep 2022 21:27:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232160AbiI1B1J (ORCPT ); Tue, 27 Sep 2022 21:27:09 -0400 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2085.outbound.protection.outlook.com [40.107.94.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B8D0118DE0; Tue, 27 Sep 2022 18:27:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PjYARG0+NMub8bKXLwF8jZ2r6RSuh1SYBdRjupGt4bOQXBpVTUFDI5H4yKXTtp0g8qa/Zu/SYbEu4QMMa2whNF5MB2Vxw27j1/6OqF4vtNy4F/C42wjcKLADl8/NbEwx6th25BTelis5tX2AvQSM3U4eXiVzPdBFf/lmxC7eJhIDQT7ItV49UFKDpTzuRMDS/uo9QV/LJdGa88AjULCn1pJbu9oeCtd8rCZbEdExjmaMKnhB21OOFflMZqZigt7rhnu1WkARjEOCewp4tYhmqQGTgnRS3RoStCbbo9PdL/szrXCYXoVl1KbmZdedmkGAgvyK/wXvZDEXO7tEzMo31Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1RYCOeO9hFWqrBdzvha751IMmg60pRt14ymdnHbnxFA=; b=XsGkxgUs9OvLVIzTkM9vouLjWrPha80UGRtYftQ5WIv/e6HhZAc9D17BNsx3qZ7HabHMCqPmeufR/6SfoECTXyw07FwPX8nc4tHjRDaX2OX47Z6pkwKuOwko/6HOx5aOOK4yQT2Bswe5bq0xF55WyZs5qgEsJTld/5RLmwA0mh5X0zE0dUwCNrWc0PYFL/LHpIk2oIvlSS8Eme7Ra0eF535GlUVnZAZnabCioDudLvrktfBfx7WUMm+tsgWpbZMljlw+XRqMCfGSgfPBIVpRgi+qAl4YllItEcE8DSg+89NvvPHnuFF+xLmYaVmMyNVZHkNAEe2+LG46caZdA7kuNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1RYCOeO9hFWqrBdzvha751IMmg60pRt14ymdnHbnxFA=; b=NKq9HAW7M05/8PHZZQz+YFpoadhMW8yVfoEQv9XO4gvVDrkLOXoC8V+7lJxzfg2BRtnHfSnbMLVS3xV17eeLfPwmhTB6QvFYc/rymnJE3T8z/ub0YaEoJ6xuwTOjx3Q14uhYtbaevDlIm99Z9AvMmIhIWBiCUOKhkdCzlYvXBV3Y3fWh4x0Vo2rBQ4VpPtvQWhPiKopFhIEwgd78+3VGHlW4Z+MHkATn0zGfIjh7YPTBmS7PTd46lR6KHMvS3fJ6pdhArUBFSfXJklcDyDlb7DtPrteLpbuDL+cF7Swc00of/algwwiCIhcVbj9eDKAhl+TE79TSeOau01wGnwe5/Q== Received: from SJ0PR12MB5676.namprd12.prod.outlook.com (2603:10b6:a03:42e::8) by SJ0PR12MB7065.namprd12.prod.outlook.com (2603:10b6:a03:4ae::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.26; Wed, 28 Sep 2022 01:27:04 +0000 Received: from SJ0PR12MB5676.namprd12.prod.outlook.com ([fe80::3c98:4af6:e849:aa5]) by SJ0PR12MB5676.namprd12.prod.outlook.com ([fe80::3c98:4af6:e849:aa5%5]) with mapi id 15.20.5654.024; Wed, 28 Sep 2022 01:27:04 +0000 From: Besar Wicaksono To: Suzuki K Poulose , "robin.murphy@arm.com" , "catalin.marinas@arm.com" , "will@kernel.org" , "mark.rutland@arm.com" CC: "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-tegra@vger.kernel.org" , "sudeep.holla@arm.com" , "thanu.rangarajan@arm.com" , "Michael.Williams@arm.com" , Thierry Reding , Jonathan Hunter , Vikram Sethi , "mathieu.poirier@linaro.org" , "mike.leach@linaro.org" , "leo.yan@linaro.org" Subject: RE: [PATCH v4 1/2] perf: arm_cspmu: Add support for ARM CoreSight PMU driver Thread-Topic: [PATCH v4 1/2] perf: arm_cspmu: Add support for ARM CoreSight PMU driver Thread-Index: AQHYsAscx+1Do35BjUm/Kr4IwLOFta3za4EAgADmhAA= Date: Wed, 28 Sep 2022 01:27:04 +0000 Message-ID: References: <20220814182351.8861-1-bwicaksono@nvidia.com> <20220814182351.8861-2-bwicaksono@nvidia.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SJ0PR12MB5676:EE_|SJ0PR12MB7065:EE_ x-ms-office365-filtering-correlation-id: abe9cc89-bb8b-4cc0-0ea4-08daa0f08ccd x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: FMWYkbd40lfPxfZFm/GIc/dKCw19GbPE9FZjB0t185qGbAtzx0uFD/zI0kwj8rUAoaG/bkX4SE7S4EvImIkzNyPKAkOBNpyPCWyb1yTmU85LoBvjvWGpRBh2888iE1cTEOr/LGO0peZhJxTNzuGnb37ffWSSTgCg8MMw15/KO0ou7hYOPvXaO0wK/l+yoUEhx2wBPNSYHLDvPCrMfJdGfPlLNDdvZagpcqAt0q2LVz8iO+pFuYk+T1RUH0sR0brz0lI/pr/yHq40Jjd9fcPeq5HmzIx37+ImCU/LTrlNE/+VAZSpQF5/8q2dwsA+PrC8hELqqGKLYbeeBB9p9PnQNNMH6BkH7j9tIyP4+B1YHgQT3zbzecXPCA9O2E5SIgFDevk3U9V96Nt65Ie3kwARZa5oIaBi6iIZncV/nhEKfzImj3XAK7oJm5hqpXePYPuxy8Srlh1BpQyr5rWZEw+5rH8v9gl+gPUur7jN+pjSiH2FCTxVnPg+yRlV5BAMoh6WjOQsqsGFizWA8ogWmZIlvVtrYdHDng6UNF4i67BdMC8CRO3PHKr8y0BKNO+r3FUI/CW4JkK1ecOcPZwhA2StCNArgy/YEfe2O7a5sBaPdX9znMLuG2OE2U0MLfO7SvQ15/UwFCDQhkuhtgzloF3NrfEdGW5OZxR5YpwEl2gHQNdxCXGS9s04uEh0pv8meurM8bVvK1Zc+ZgjsVHlugCmM0u38epzGRQkU9y/mulxr5dnDyZTMlfzFAUBxM6VcdUAi53gFI8VdshuPyfud1xhseyB5PikqCmDnka/lMHzoJqhFwPmf/WGv4ualmv1p6GdHslqnMfAIaET9RTLiDeVMTi4kEd/T8755Uw+nie4/fmxGeFeNR7Dhrs0YpzBGU+mz3gr+3ZHTf1KAfs1FZBGiw== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR12MB5676.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(346002)(366004)(376002)(396003)(39860400002)(136003)(451199015)(7696005)(54906003)(110136005)(122000001)(33656002)(2906002)(7416002)(86362001)(52536014)(4326008)(186003)(41300700001)(64756008)(66946007)(38070700005)(30864003)(5660300002)(76116006)(8676002)(66476007)(66556008)(9686003)(26005)(66446008)(316002)(8936002)(6506007)(53546011)(38100700002)(83380400001)(478600001)(55016003)(966005)(71200400001)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?RWhGMzBuN1lSelZYY2lFdUs2MG9FclBOWVNWS2dOSEc5bGlWSHB0eitqSzJ3?= =?utf-8?B?dCtSNlJ6dUZvUjc3ZkcrNllVWkdVa0hBeEhGY001ME5HUHhuc1VzVXYyMTYz?= =?utf-8?B?Rms0VUlTT2pGdFBrMW5DM0REd2lHMEUycGRheDYrTnJJeGpRQk9VTlN3RGlJ?= =?utf-8?B?M1JXdlN5TU9oZWxHK1o1YWg3U3YyTndkR3VCZnI3ZEdNVWxYdG1pdTJJZ2F0?= =?utf-8?B?U2xZa2FQVUgrWG9yM3JZOTM2dTFOcm9vOXV1VXRjMlRLbk9oSXA0Y0dwQ3VF?= =?utf-8?B?QW14enR3dzV6aDJENWhMcnRFMDM4QmZoSHZCQWxFVUNTc0JLNzMzZmdZQnpn?= =?utf-8?B?dUd3YzBzaEJRQUQ4KzNkMkdTSzBTT0d5V010L2RhY1kvYU00bFduUEI1NnRG?= =?utf-8?B?SWxseVJ1bXBLSzN4dXdCWEUyWnlvWmRwWXhTWWJkSDZkcG9wK3kwTmZFN0FP?= =?utf-8?B?YkdDUytZYTBRdjZyRTZNVjliV1JUWjQxSzFUdG1ZMWZ3NDZhM2UyWDFPSWRh?= =?utf-8?B?N0ZsanpwYS9uSW9INzhrZndlcXpBcDA1Z25ZeTliQTdOOGtrSDQ3eWgrcTc0?= =?utf-8?B?NmorS29ZdFNtUUpPQlpIb3MwS1FKWS9STUxqVmc3dTlrb3kvREZMZ2pKc095?= =?utf-8?B?cXNvV1UwbzR5QmNIdEU3S052cXFZOU9aMzg5eHp2SjZIS2pocWdnbG1STHJ0?= =?utf-8?B?VmxWTkV0aUFjS1JjK1hOZWtpV3BRbjVPZGpCeFQrOGlhYXV4dGFDRGpSRWVP?= =?utf-8?B?RXRNajVlTzJQK285T2R1MWRZN0hyNW5HbVRHc1JPbkJINmpCTFIxbnlWTkRl?= =?utf-8?B?ZGZWWFN0YTE3MXh2bWltd1pQMlNsdkNJRkp5am9sdWZpQzd5RHVES0xZbUNM?= =?utf-8?B?VGE0V2V5di8wNDQ1TTA0UWVoVmtiUnVTb1BxMldIWnlUQ2hscFBPMmtFRis2?= =?utf-8?B?dnE5VUlKY0VwTG5zakFuR2kzeENsTVhubnlRUEEvelFZWTNmMDcvbVpEU01W?= =?utf-8?B?ZTdTMGNxc2hHWWVuaVhOR20yUG9FSURyZDZGSjI5RVppdGszK0V4dEdBRHhB?= =?utf-8?B?MU5ETU1MaXFxOXdDVHRUS0w2OXZxMkRKa0JUQUg5SUtJYzVGbW1UWHdtSElw?= =?utf-8?B?amFnVmNmUUxpM3EzSGlBTVFtckgzSERKR0dxeFRtdzJMSWJRaWlTenFhRHov?= =?utf-8?B?TFZWMWhPcXdtU1UwOGlycmk1WmFjdUdyTEw1NmRyMlpoVWhRQ00zZldjTjFI?= =?utf-8?B?Vk5LSHNrTEJ6aFFRcjk2aTlkSmlVQ0Vyc212STRvcUhMWHZDbGVIb3Vydm5t?= =?utf-8?B?S3JEemRqWVEyQzczdGJvR2YxVUY2bEJlaVh6WkxZa2QzV3pMY0JNTXE3bHE0?= =?utf-8?B?dlp5RWFwMkNzSTV5ekdkcGFyK3VSTXpzcE9pem4zVUJYTXFURWpaS2VSOXRP?= =?utf-8?B?dFRXYVZ3YXVSWlo4S0x5TUNob2JveXFWa1BmRzhlYW1wS0hEV0o1QlJSSFlT?= =?utf-8?B?MWxEaWVoSGRsM253MGc0enYzbU5VVkhzckNEQU5TL0lRanJnVlZTaHRtQUJp?= =?utf-8?B?d25QdTg5UUhMaU42WFV0SlZtY3N4OU45WHlTd0NmVjRXR2hITHgrc3RKT1Jt?= =?utf-8?B?QWRzYjdmTm1seDdlTGo5dmpYbncyVEM0bHVTUEtCZVZMYzJFNVRpNUZTNzBH?= =?utf-8?B?MFRHd2E0UzRZNEJnczZBdW1oY2dEWFAvVzZlT2tqaVFvOXJ6bmNPMTJhQytD?= =?utf-8?B?LzFSTkV6aDFVWXBJODdmOTBkSXJSSXJodTg0TE00TjY0RWVtZW1MS3dTZkQy?= =?utf-8?B?QTBwKytoVkVROUZJOEQyZEZUNVh4SU9zdWVMNGNTcXJMYnBDeUJkWm1DK1BW?= =?utf-8?B?Q0crOERIb3hjUDV2WWFrUUI0cER5TzV0a25FcnFmcCt3OFlJUVRuWGZXTlJK?= =?utf-8?B?YmZjT2lVUXczVzU3S0xOR2hpRlQ0bm5OVG9UV2xKZDJpay9DaUpESHk5NFpv?= =?utf-8?B?OS9TbWV2KytTU2I5cWRlcEpHS1BRcWJtSWVVMExBNkR6NkE1NHJ4aFVUOGpl?= =?utf-8?B?RnplTmJvYkZleG16Sm9xNW1qNXNuaHZEbjVyMkhKTWxTSE1xcE1RQXl6SXpK?= =?utf-8?Q?SYDE4PZeF3XZLTa71T9QmPuHm?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SJ0PR12MB5676.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: abe9cc89-bb8b-4cc0-0ea4-08daa0f08ccd X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Sep 2022 01:27:04.0878 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: gT7HuA2l9barJUD8/le9DEYo7/nHkWztJTBlT/VGCheWDcf5J5T89kiuCEfcvFFMVjKuh/lzy5nbpdV8+tayyg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB7065 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogU3V6dWtpIEsgUG91bG9z ZSA8c3V6dWtpLnBvdWxvc2VAYXJtLmNvbT4NCj4gU2VudDogVHVlc2RheSwgU2VwdGVtYmVyIDI3 LCAyMDIyIDY6MzkgQU0NCj4gVG86IEJlc2FyIFdpY2Frc29ubyA8YndpY2Frc29ub0BudmlkaWEu Y29tPjsgcm9iaW4ubXVycGh5QGFybS5jb207DQo+IGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tOyB3 aWxsQGtlcm5lbC5vcmc7IG1hcmsucnV0bGFuZEBhcm0uY29tDQo+IENjOiBsaW51eC1hcm0ta2Vy bmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7DQo+ IGxpbnV4LXRlZ3JhQHZnZXIua2VybmVsLm9yZzsgc3VkZWVwLmhvbGxhQGFybS5jb207DQo+IHRo YW51LnJhbmdhcmFqYW5AYXJtLmNvbTsgTWljaGFlbC5XaWxsaWFtc0Bhcm0uY29tOyBUaGllcnJ5 IFJlZGluZw0KPiA8dHJlZGluZ0BudmlkaWEuY29tPjsgSm9uYXRoYW4gSHVudGVyIDxqb25hdGhh bmhAbnZpZGlhLmNvbT47IFZpa3JhbQ0KPiBTZXRoaSA8dnNldGhpQG52aWRpYS5jb20+OyBtYXRo aWV1LnBvaXJpZXJAbGluYXJvLm9yZzsNCj4gbWlrZS5sZWFjaEBsaW5hcm8ub3JnOyBsZW8ueWFu QGxpbmFyby5vcmcNCj4gU3ViamVjdDogUmU6IFtQQVRDSCB2NCAxLzJdIHBlcmY6IGFybV9jc3Bt dTogQWRkIHN1cHBvcnQgZm9yIEFSTQ0KPiBDb3JlU2lnaHQgUE1VIGRyaXZlcg0KPiANCj4gRXh0 ZXJuYWwgZW1haWw6IFVzZSBjYXV0aW9uIG9wZW5pbmcgbGlua3Mgb3IgYXR0YWNobWVudHMNCj4g DQo+IA0KPiBPbiAxNC8wOC8yMDIyIDE5OjIzLCBCZXNhciBXaWNha3Nvbm8gd3JvdGU6DQo+ID4g QWRkIHN1cHBvcnQgZm9yIEFSTSBDb3JlU2lnaHQgUE1VIGRyaXZlciBmcmFtZXdvcmsgYW5kIGlu dGVyZmFjZXMuDQo+ID4gVGhlIGRyaXZlciBwcm92aWRlcyBnZW5lcmljIGltcGxlbWVudGF0aW9u IHRvIG9wZXJhdGUgdW5jb3JlIFBNVSBiYXNlZA0KPiA+IG9uIEFSTSBDb3JlU2lnaHQgUE1VIGFy Y2hpdGVjdHVyZS4gVGhlIGRyaXZlciBhbHNvIHByb3ZpZGVzIGludGVyZmFjZQ0KPiA+IHRvIGdl dCB2ZW5kb3IvaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24sIGZvciBleGFtcGxl IGV2ZW50DQo+ID4gYXR0cmlidXRlcyBhbmQgZm9ybWF0aW5nLg0KPiA+DQo+ID4gVGhlIHNwZWNp ZmljYXRpb24gdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCBiZWxvdzoN Cj4gPiAgICogQUNQSSBBcm0gUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0IHRhYmxlOg0KPiA+ ICAgICAgICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vZG9jdW1lbnRhdGlvbi9kZW4wMTE3 L2xhdGVzdA0KPiA+ICAgKiBBUk0gQ29yZXNpZ2h0IFBNVSBhcmNoaXRlY3R1cmU6DQo+ID4gICAg ICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2loaTAwOTEvbGF0 ZXN0DQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBCZXNhciBXaWNha3Nvbm8gPGJ3aWNha3Nvbm9A bnZpZGlhLmNvbT4NCj4gPiAtLS0NCj4gPiAgIGFyY2gvYXJtNjQvY29uZmlncy9kZWZjb25maWcg ICAgICAgfCAgICAxICsNCj4gPiAgIGRyaXZlcnMvcGVyZi9LY29uZmlnICAgICAgICAgICAgICAg fCAgICAyICsNCj4gPiAgIGRyaXZlcnMvcGVyZi9NYWtlZmlsZSAgICAgICAgICAgICAgfCAgICAx ICsNCj4gPiAgIGRyaXZlcnMvcGVyZi9hcm1fY3NwbXUvS2NvbmZpZyAgICAgfCAgIDEzICsNCj4g PiAgIGRyaXZlcnMvcGVyZi9hcm1fY3NwbXUvTWFrZWZpbGUgICAgfCAgICA2ICsNCj4gPiAgIGRy aXZlcnMvcGVyZi9hcm1fY3NwbXUvYXJtX2NzcG11LmMgfCAxMjYyDQo+ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysNCj4gPiAgIGRyaXZlcnMvcGVyZi9hcm1fY3NwbXUvYXJtX2NzcG11Lmgg fCAgMTUxICsrKysNCj4gPiAgIDcgZmlsZXMgY2hhbmdlZCwgMTQzNiBpbnNlcnRpb25zKCspDQo+ ID4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9wZXJmL2FybV9jc3BtdS9LY29uZmlnDQo+ ID4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9wZXJmL2FybV9jc3BtdS9NYWtlZmlsZQ0K PiA+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGVyZi9hcm1fY3NwbXUvYXJtX2NzcG11 LmMNCj4gPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3BlcmYvYXJtX2NzcG11L2FybV9j c3BtdS5oDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jb25maWdzL2RlZmNvbmZp ZyBiL2FyY2gvYXJtNjQvY29uZmlncy9kZWZjb25maWcNCj4gPiBpbmRleCA3ZDExMDUzNDNiYzIu LmVlMzFjOTE1OWE1YiAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL2FybTY0L2NvbmZpZ3MvZGVmY29u ZmlnDQo+ID4gKysrIGIvYXJjaC9hcm02NC9jb25maWdzL2RlZmNvbmZpZw0KPiA+IEBAIC0xMjEy LDYgKzEyMTIsNyBAQCBDT05GSUdfUEhZX1VOSVBISUVSX1VTQjM9eQ0KPiA+ICAgQ09ORklHX1BI WV9URUdSQV9YVVNCPXkNCj4gPiAgIENPTkZJR19QSFlfQU02NTRfU0VSREVTPW0NCj4gPiAgIENP TkZJR19QSFlfSjcyMUVfV0laPW0NCj4gPiArQ09ORklHX0FSTV9DT1JFU0lHSFRfUE1VX0FSQ0hf U1lTVEVNX1BNVT15DQo+ID4gICBDT05GSUdfQVJNX1NNTVVfVjNfUE1VPW0NCj4gPiAgIENPTkZJ R19GU0xfSU1YOF9ERFJfUE1VPW0NCj4gPiAgIENPTkZJR19RQ09NX0wyX1BNVT15DQo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvcGVyZi9LY29uZmlnIGIvZHJpdmVycy9wZXJmL0tjb25maWcNCj4g PiBpbmRleCAxZTJkNjk0NTM3NzEuLmM5NGQzNjAxZWI0OCAxMDA2NDQNCj4gPiAtLS0gYS9kcml2 ZXJzL3BlcmYvS2NvbmZpZw0KPiA+ICsrKyBiL2RyaXZlcnMvcGVyZi9LY29uZmlnDQo+ID4gQEAg LTE5Miw0ICsxOTIsNiBAQCBjb25maWcgTUFSVkVMTF9DTjEwS19ERFJfUE1VDQo+ID4gICAgICAg ICBFbmFibGUgcGVyZiBzdXBwb3J0IGZvciBNYXJ2ZWxsIEREUiBQZXJmb3JtYW5jZSBtb25pdG9y aW5nDQo+ID4gICAgICAgICBldmVudCBvbiBDTjEwSyBwbGF0Zm9ybS4NCj4gPg0KPiA+ICtzb3Vy Y2UgImRyaXZlcnMvcGVyZi9hcm1fY3NwbXUvS2NvbmZpZyINCj4gPiArDQo+ID4gICBlbmRtZW51 DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGVyZi9NYWtlZmlsZSBiL2RyaXZlcnMvcGVyZi9N YWtlZmlsZQ0KPiA+IGluZGV4IDU3YTI3OWM2MWRmNS4uM2JjOTMyM2YwOTY1IDEwMDY0NA0KPiA+ IC0tLSBhL2RyaXZlcnMvcGVyZi9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvcGVyZi9NYWtl ZmlsZQ0KPiA+IEBAIC0yMCwzICsyMCw0IEBAIG9iai0kKENPTkZJR19BUk1fRE1DNjIwX1BNVSkg Kz0NCj4gYXJtX2RtYzYyMF9wbXUubw0KPiA+ICAgb2JqLSQoQ09ORklHX01BUlZFTExfQ04xMEtf VEFEX1BNVSkgKz0NCj4gbWFydmVsbF9jbjEwa190YWRfcG11Lm8NCj4gPiAgIG9iai0kKENPTkZJ R19NQVJWRUxMX0NOMTBLX0REUl9QTVUpICs9DQo+IG1hcnZlbGxfY24xMGtfZGRyX3BtdS5vDQo+ ID4gICBvYmotJChDT05GSUdfQVBQTEVfTTFfQ1BVX1BNVSkgKz0gYXBwbGVfbTFfY3B1X3BtdS5v DQo+ID4gK29iai0kKENPTkZJR19BUk1fQ09SRVNJR0hUX1BNVV9BUkNIX1NZU1RFTV9QTVUpICs9 DQo+IGFybV9jc3BtdS8NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wZXJmL2FybV9jc3BtdS9L Y29uZmlnDQo+IGIvZHJpdmVycy9wZXJmL2FybV9jc3BtdS9LY29uZmlnDQo+ID4gbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmMyYzU2ZWNhZmNjYg0KPiA+IC0t LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL3BlcmYvYXJtX2NzcG11L0tjb25maWcNCj4g PiBAQCAtMCwwICsxLDEzIEBADQo+ID4gKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjANCj4gPiArIw0KPiA+ICsjIENvcHlyaWdodCAoYykgMjAyMiwgTlZJRElBIENPUlBPUkFUSU9O ICYgQUZGSUxJQVRFUy4NCj4gPiArDQo+ID4gK2NvbmZpZyBBUk1fQ09SRVNJR0hUX1BNVV9BUkNI X1NZU1RFTV9QTVUNCj4gPiArICAgICB0cmlzdGF0ZSAiQVJNIENvcmVzaWdodCBBcmNoaXRlY3R1 cmUgUE1VIg0KPiA+ICsgICAgIGRlcGVuZHMgb24gQUNQSQ0KPiA+ICsgICAgIGRlcGVuZHMgb24g QUNQSV9BUE1UIHx8IENPTVBJTEVfVEVTVA0KPiA+ICsgICAgIGhlbHANCj4gPiArICAgICAgIFBy b3ZpZGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdCAoUE1VKSBkZXZp Y2VzDQo+ID4gKyAgICAgICBiYXNlZCBvbiBBUk0gQ29yZVNpZ2h0IFBNVSBhcmNoaXRlY3R1cmUu IE5vdGUgdGhhdCB0aGlzIFBNVQ0KPiA+ICsgICAgICAgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IGhh dmUgcmVsYXRpb25zaGlwIHdpdGggdGhlIEFSTSBDb3JlU2lnaHQNCj4gPiArICAgICAgIFNlbGYt SG9zdGVkIFRyYWNpbmcuDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGVyZi9hcm1fY3NwbXUv TWFrZWZpbGUNCj4gYi9kcml2ZXJzL3BlcmYvYXJtX2NzcG11L01ha2VmaWxlDQo+ID4gbmV3IGZp bGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmNkYzM0NTVmNzRkOA0KPiA+ IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL3BlcmYvYXJtX2NzcG11L01ha2VmaWxl DQo+ID4gQEAgLTAsMCArMSw2IEBADQo+ID4gKyMgQ29weXJpZ2h0IChjKSAyMDIyLCBOVklESUEg Q09SUE9SQVRJT04gJiBBRkZJTElBVEVTLg0KPiA+ICsjDQo+ID4gKyMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjANCj4gPiArDQo+ID4gK29iai0kKENPTkZJR19BUk1fQ09SRVNJR0hU X1BNVV9BUkNIX1NZU1RFTV9QTVUpICs9IFwNCj4gPiArICAgICBhcm1fY3NwbXUubw0KPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3BlcmYvYXJtX2NzcG11L2FybV9jc3BtdS5jDQo+IGIvZHJpdmVy cy9wZXJmL2FybV9jc3BtdS9hcm1fY3NwbXUuYw0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ ID4gaW5kZXggMDAwMDAwMDAwMDAwLi40MTA4NzZmODZlYjANCj4gPiAtLS0gL2Rldi9udWxsDQo+ ID4gKysrIGIvZHJpdmVycy9wZXJmL2FybV9jc3BtdS9hcm1fY3NwbXUuYw0KPiA+IEBAIC0wLDAg KzEsMTI2MiBAQA0KPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ ICsvKg0KPiA+ICsgKiBBUk0gQ29yZVNpZ2h0IEFyY2hpdGVjdHVyZSBQTVUgZHJpdmVyLg0KPiA+ ICsgKg0KPiA+ICsgKiBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHVuY29yZSBQTVUgYmFz ZWQgb24gQVJNIENvcmVTaWdodA0KPiBQZXJmb3JtYW5jZQ0KPiA+ICsgKiBNb25pdG9yaW5nIFVu aXQgQXJjaGl0ZWN0dXJlLiBUaGUgUE1VIGlzIGFjY2Vzc2libGUgdmlhIE1NSU8gcmVnaXN0ZXJz DQo+IGFuZA0KPiA+ICsgKiBsaWtlIG90aGVyIHVuY29yZSBQTVVzLCBpdCBkb2VzIG5vdCBzdXBw b3J0IHByb2Nlc3Mgc3BlY2lmaWMgZXZlbnRzIGFuZA0KPiA+ICsgKiBjYW5ub3QgYmUgdXNlZCBp biBzYW1wbGluZyBtb2RlLg0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24g b3RoZXIgdW5jb3JlIFBNVXMgbGlrZSBBUk0gRFNVIFBNVS4gSXQNCj4gcHJvdmlkZXMgYQ0KPiA+ ICsgKiBnZW5lcmljIGltcGxlbWVudGF0aW9uIHRvIG9wZXJhdGUgdGhlIFBNVSBhY2NvcmRpbmcg dG8gQ29yZVNpZ2h0DQo+IFBNVQ0KPiA+ICsgKiBhcmNoaXRlY3R1cmUgYW5kIEFDUEkgQVJNIFBN VSB0YWJsZSAoQVBNVCkgZG9jdW1lbnRzIGJlbG93Og0KPiA+ICsgKiAgIC0gQVJNIENvcmVTaWdo dCBQTVUgYXJjaGl0ZWN0dXJlIGRvY3VtZW50IG51bWJlcjogQVJNIElISSAwMDkxDQo+IEEuYS0w MGJldDAuDQo+ID4gKyAqICAgLSBBUE1UIGRvY3VtZW50IG51bWJlcjogQVJNIERFTjAxMTcuDQo+ ID4gKyAqDQo+ID4gKyAqIFRoZSB1c2VyIHNob3VsZCByZWZlciB0byB0aGUgdmVuZG9yIHRlY2hu aWNhbCBkb2N1bWVudGF0aW9uIHRvIGdldA0KPiBkZXRhaWxzDQo+ID4gKyAqIGFib3V0IHRoZSBz dXBwb3J0ZWQgZXZlbnRzLg0KPiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjIsIE5W SURJQSBDT1JQT1JBVElPTiAmIEFGRklMSUFURVMuDQo+ID4gKyAqDQo+ID4gKyAqLw0KPiA+ICsN Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2NhY2hl aW5mby5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4NCj4gPiArI2luY2x1ZGUgPGxp bnV4L2ludGVycnVwdC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvaW8tNjQtbm9uYXRvbWljLWxv LWhpLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gPiArI2luY2x1ZGUgPGxp bnV4L3BlcmZfZXZlbnQuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5o Pg0KPiA+ICsjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRl ICJhcm1fY3NwbXUuaCINCj4gPiArDQo+ID4gKyNkZWZpbmUgUE1VTkFNRSAiYXJtX2NzcG11Ig0K PiA+ICsjZGVmaW5lIERSVk5BTUUgImFybS1jcy1hcmNoLXBtdSINCj4gPiArDQo+ID4gKyNkZWZp bmUgQVJNX0NTUE1VX0NQVU1BU0tfQVRUUihfbmFtZSwgX2NvbmZpZykgICAgICAgICAgICAgICAg ICAgICAgIFwNCj4gPiArICAgICBBUk1fQ1NQTVVfRVhUX0FUVFIoX25hbWUsIGFybV9jc3BtdV9j cHVtYXNrX3Nob3csICAgICAgIFwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo dW5zaWduZWQgbG9uZylfY29uZmlnKQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogQ29yZVNpZ2h0 IFBNVSBBcmNoIHJlZ2lzdGVyIG9mZnNldHMuDQo+ID4gKyAqLw0KPiA+ICsjZGVmaW5lIFBNRVZD TlRSX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MA0KPiA+ICsjZGVmaW5l IFBNRVZDTlRSX0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NA0KPiA+ICsj ZGVmaW5lIFBNRVZUWVBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAw DQo+ID4gKyNkZWZpbmUgUE1DQ0ZJTFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMHg0N0MNCj4gPiArI2RlZmluZSBQTUVWRklMVFIgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAweEEwMA0KPiA+ICsjZGVmaW5lIFBNQ05URU5TRVQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDB4QzAwDQo+ID4gKyNkZWZpbmUgUE1DTlRFTkNMUiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMjANCj4gPiArI2RlZmluZSBQTUlOVEVOU0VU ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEM0MA0KPiA+ICsjZGVmaW5lIFBN SU5URU5DTFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzYwDQo+ID4gKyNk ZWZpbmUgUE1PVlNDTFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDODAN Cj4gPiArI2RlZmluZSBQTU9WU1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAweENDMA0KPiA+ICsjZGVmaW5lIFBNQ0ZHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMHhFMDANCj4gPiArI2RlZmluZSBQTUNSICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAweEUwNA0KPiA+ICsjZGVmaW5lIFBNSUlEUiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMDgNCj4gPiArDQo+ ID4gKy8qIFBNQ0ZHUiByZWdpc3RlciBmaWVsZCAqLw0KPiA+ICsjZGVmaW5lIFBNQ0ZHUl9OQ0cg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTk1BU0soMzEsIDI4KQ0KPiA+ICsj ZGVmaW5lIFBNQ0ZHUl9IREJHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgy NCkNCj4gPiArI2RlZmluZSBQTUNGR1JfVFJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBCSVQoMjMpDQo+ID4gKyNkZWZpbmUgUE1DRkdSX1NTICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgQklUKDIyKQ0KPiA+ICsjZGVmaW5lIFBNQ0ZHUl9GWk8gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMSkNCj4gPiArI2RlZmluZSBQTUNGR1JfTVNJ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjApDQo+ID4gKyNkZWZpbmUg UE1DRkdSX1VFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE5KQ0KPiA+ ICsjZGVmaW5lIFBNQ0ZHUl9OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJ VCgxNykNCj4gPiArI2RlZmluZSBQTUNGR1JfRVggICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBCSVQoMTYpDQo+ID4gKyNkZWZpbmUgUE1DRkdSX0NDRCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgQklUKDE1KQ0KPiA+ICsjZGVmaW5lIFBNQ0ZHUl9DQyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNCkNCj4gPiArI2RlZmluZSBQTUNGR1Jf U0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5NQVNLKDEzLCA4KQ0KPiA+ ICsjZGVmaW5lIFBNQ0ZHUl9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdF Tk1BU0soNywgMCkNCj4gPiArDQo+ID4gKy8qIFBNQ1IgcmVnaXN0ZXIgZmllbGQgKi8NCj4gPiAr I2RlZmluZSBQTUNSX1RSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQo MTEpDQo+ID4gKyNkZWZpbmUgUE1DUl9IREJHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQklUKDEwKQ0KPiA+ICsjZGVmaW5lIFBNQ1JfRlpPICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEJJVCg5KQ0KPiA+ICsjZGVmaW5lIFBNQ1JfTkEgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDgpDQo+ID4gKyNkZWZpbmUgUE1D Ul9EUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNSkN Cj4gPiArI2RlZmluZSBQTUNSX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEJJVCg0KQ0KPiA+ICsjZGVmaW5lIFBNQ1JfRCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMpDQo+ID4gKyNkZWZpbmUgUE1DUl9DICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMikNCj4gPiAr I2RlZmluZSBQTUNSX1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEJJVCgxKQ0KPiA+ICsjZGVmaW5lIFBNQ1JfRSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgQklUKDApDQo+ID4gKw0KPiA+ICsvKiBFYWNoIFNFVC9DTFIg cmVnaXN0ZXIgc3VwcG9ydHMgdXAgdG8gMzIgY291bnRlcnMuICovDQo+ID4gKyNkZWZpbmUgQVJN X0NTUE1VX1NFVF9DTFJfQ09VTlRFUl9TSElGVCAgICAgICAgICAgICAgNQ0KPiA+ICsjZGVmaW5l IEFSTV9DU1BNVV9TRVRfQ0xSX0NPVU5URVJfTlVNICAgICAgICAgICAgICAgIFwNCj4gPiArICAg ICAoMSA8PCBBUk1fQ1NQTVVfU0VUX0NMUl9DT1VOVEVSX1NISUZUKQ0KPiA+ICsNCj4gPiArLyog VGhlIG51bWJlciBvZiAzMi1iaXQgU0VUL0NMUiByZWdpc3RlciB0aGF0IGNhbiBiZSBzdXBwb3J0 ZWQuICovDQo+ID4gKyNkZWZpbmUgQVJNX0NTUE1VX1NFVF9DTFJfTUFYX05VTSAoKFBNQ05URU5D TFIgLQ0KPiBQTUNOVEVOU0VUKSAvIHNpemVvZih1MzIpKQ0KPiA+ICsNCj4gPiArc3RhdGljX2Fz c2VydCgNCj4gPiArICAgICAoQVJNX0NTUE1VX1NFVF9DTFJfTUFYX05VTSAqDQo+IEFSTV9DU1BN VV9TRVRfQ0xSX0NPVU5URVJfTlVNKSA+PQ0KPiA+ICsgICAgIEFSTV9DU1BNVV9NQVhfSFdfQ05U UlMpOw0KPiA+ICsNCj4gPiArLyogQ29udmVydCBjb3VudGVyIGlkeCBpbnRvIFNFVC9DTFIgcmVn aXN0ZXIgbnVtYmVyLiAqLw0KPiA+ICsjZGVmaW5lIENPVU5URVJfVE9fU0VUX0NMUl9JRChpZHgp ICAgICAgICAgICAgICAgICAgIFwNCj4gPiArICAgICAoaWR4ID4+IEFSTV9DU1BNVV9TRVRfQ0xS X0NPVU5URVJfU0hJRlQpDQo+ID4gKw0KPiA+ICsvKiBDb252ZXJ0IGNvdW50ZXIgaWR4IGludG8g U0VUL0NMUiByZWdpc3RlciBiaXQuICovDQo+ID4gKyNkZWZpbmUgQ09VTlRFUl9UT19TRVRfQ0xS X0JJVChpZHgpICAgICAgICAgICAgICAgICAgXA0KPiA+ICsgICAgIChpZHggJiAoQVJNX0NTUE1V X1NFVF9DTFJfQ09VTlRFUl9OVU0gLSAxKSkNCj4gPiArDQo+ID4gKyNkZWZpbmUgQVJNX0NTUE1V X0FDVElWRV9DUFVfTUFTSyAgICAgICAgICAgIDB4MA0KPiA+ICsjZGVmaW5lIEFSTV9DU1BNVV9B U1NPQ0lBVEVEX0NQVV9NQVNLICAgICAgICAgICAgICAgIDB4MQ0KPiA+ICsNCj4gPiArLyogQ2hl Y2sgaWYgZmllbGQgZiBpbiBmbGFncyBpcyBzZXQgd2l0aCB2YWx1ZSB2ICovDQo+ID4gKyNkZWZp bmUgQ0hFQ0tfQVBNVF9GTEFHKGZsYWdzLCBmLCB2KSBcDQo+ID4gKyAgICAgKChmbGFncyAmIChB Q1BJX0FQTVRfRkxBR1NfICMjIGYpKSA9PSAoQUNQSV9BUE1UX0ZMQUdTXyAjIyBmICMjDQo+IF8g IyMgdikpDQo+ID4gKw0KPiA+ICsvKiBDaGVjayBhbmQgdXNlIGRlZmF1bHQgaWYgaW1wbGVtZW50 ZXIgZG9lc24ndCBwcm92aWRlIGF0dHJpYnV0ZQ0KPiBjYWxsYmFjayAqLw0KPiA+ICsjZGVmaW5l IENIRUNLX0RFRkFVTFRfSU1QTF9PUFMob3BzLCBjYWxsYmFjaykgICAgICAgICAgICAgICAgICAg ICAgICBcDQo+ID4gKyAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcDQo+ID4gKyAgICAgICAgICAgICBpZiAoIW9wcy0+Y2FsbGJhY2sp ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQo+ID4gKyAgICAgICAgICAgICAgICAgICAg IG9wcy0+Y2FsbGJhY2sgPSBhcm1fY3NwbXVfICMjIGNhbGxiYWNrOyBcDQo+ID4gKyAgICAgfSB3 aGlsZSAoMCkNCj4gPiArDQo+ID4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFybV9jc3BtdV9jcHVo cF9zdGF0ZTsNCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIEluIENvcmVTaWdodCBQTVUgYXJjaGl0 ZWN0dXJlLCBhbGwgb2YgdGhlIE1NSU8gcmVnaXN0ZXJzIGFyZSAzMi1iaXQNCj4gZXhjZXB0DQo+ ID4gKyAqIGNvdW50ZXIgcmVnaXN0ZXIuIFRoZSBjb3VudGVyIHJlZ2lzdGVyIGNhbiBiZSBpbXBs ZW1lbnRlZCBhcyAzMi1iaXQgb3INCj4gNjQtYml0DQo+ID4gKyAqIHJlZ2lzdGVyIGRlcGVuZGlu ZyBvbiB0aGUgdmFsdWUgb2YgUE1DRkdSLlNJWkUgZmllbGQuIEZvciA2NC1iaXQNCj4gYWNjZXNz LA0KPiA+ICsgKiBzaW5nbGUtY29weSA2NC1iaXQgYXRvbWljIHN1cHBvcnQgaXMgaW1wbGVtZW50 YXRpb24gZGVmaW5lZC4gQVBNVA0KPiBub2RlIGZsYWcNCj4gPiArICogaXMgdXNlZCB0byBpZGVu dGlmeSBpZiB0aGUgUE1VIHN1cHBvcnRzIDY0LWJpdCBzaW5nbGUgY29weSBhdG9taWMuIElmIDY0 LQ0KPiBiaXQNCj4gPiArICogc2luZ2xlIGNvcHkgYXRvbWljIGlzIG5vdCBzdXBwb3J0ZWQsIHRo ZSBkcml2ZXIgdHJlYXRzIHRoZSByZWdpc3RlciBhcyBhDQo+IHBhaXINCj4gPiArICogb2YgMzIt Yml0IHJlZ2lzdGVyLg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIFJlYWQgNjQt Yml0IHJlZ2lzdGVyIGFzIGEgcGFpciBvZiAzMi1iaXQgcmVnaXN0ZXJzIHVzaW5nIGhpLWxvLWhp IHNlcXVlbmNlLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIHU2NCByZWFkX3JlZzY0X2hpbG9oaShj b25zdCB2b2lkIF9faW9tZW0gKmFkZHIpDQo+ID4gK3sNCj4gPiArICAgICB1MzIgdmFsX2xvLCB2 YWxfaGk7DQo+ID4gKyAgICAgdTY0IHZhbDsNCj4gPiArDQo+ID4gKyAgICAgLyogVXNlIGhpZ2gt bG93LWhpZ2ggc2VxdWVuY2UgdG8gYXZvaWQgdGVhcmluZyAqLw0KPiA+ICsgICAgIGRvIHsNCj4g PiArICAgICAgICAgICAgIHZhbF9oaSA9IHJlYWRsKGFkZHIgKyA0KTsNCj4gPiArICAgICAgICAg ICAgIHZhbF9sbyA9IHJlYWRsKGFkZHIpOw0KPiA+ICsgICAgIH0gd2hpbGUgKHZhbF9oaSAhPSBy ZWFkbChhZGRyICsgNCkpOw0KPiA+ICsNCj4gPiArICAgICB2YWwgPSAoKCh1NjQpdmFsX2hpIDw8 IDMyKSB8IHZhbF9sbyk7DQo+ID4gKw0KPiA+ICsgICAgIHJldHVybiB2YWw7DQo+ID4gK30NCj4g PiArDQo+ID4gKy8qIENoZWNrIGlmIFBNVSBzdXBwb3J0cyA2NC1iaXQgc2luZ2xlIGNvcHkgYXRv bWljLiAqLw0KPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgc3VwcG9ydHNfNjRiaXRfYXRvbWljcyhj b25zdCBzdHJ1Y3QgYXJtX2NzcG11DQo+ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHJldHVy biBDSEVDS19BUE1UX0ZMQUcoY3NwbXUtPmFwbXRfbm9kZS0+ZmxhZ3MsIEFUT01JQywNCj4gU1VQ UCk7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qIENoZWNrIGlmIGN5Y2xlIGNvdW50ZXIgaXMgc3Vw cG9ydGVkLiAqLw0KPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgc3VwcG9ydHNfY3ljbGVfY291bnRl cihjb25zdCBzdHJ1Y3QgYXJtX2NzcG11DQo+ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHJl dHVybiAoY3NwbXUtPnBtY2ZnciAmIFBNQ0ZHUl9DQyk7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8q IEdldCBjb3VudGVyIHNpemUsIHdoaWNoIGlzIChQTUNGR1JfU0laRSArIDEpLiAqLw0KPiA+ICtz dGF0aWMgaW5saW5lIHUzMiBjb3VudGVyX3NpemUoY29uc3Qgc3RydWN0IGFybV9jc3BtdSAqY3Nw bXUpDQo+ID4gK3sNCj4gPiArICAgICByZXR1cm4gRklFTERfR0VUKFBNQ0ZHUl9TSVpFLCBjc3Bt dS0+cG1jZmdyKSArIDE7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qIEdldCBjb3VudGVyIG1hc2su ICovDQo+ID4gK3N0YXRpYyBpbmxpbmUgdTY0IGNvdW50ZXJfbWFzayhjb25zdCBzdHJ1Y3QgYXJt X2NzcG11ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHJldHVybiBHRU5NQVNLX1VMTChjb3Vu dGVyX3NpemUoY3NwbXUpIC0gMSwgMCk7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qIENoZWNrIGlm IGNvdW50ZXIgaXMgaW1wbGVtZW50ZWQgYXMgNjQtYml0IHJlZ2lzdGVyLiAqLw0KPiA+ICtzdGF0 aWMgaW5saW5lIGJvb2wgdXNlXzY0Yl9jb3VudGVyX3JlZyhjb25zdCBzdHJ1Y3QgYXJtX2NzcG11 ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHJldHVybiAoY291bnRlcl9zaXplKGNzcG11KSA+ IDMyKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3NpemVfdCBhcm1fY3NwbXVfc3lzZnNfZXZlbnRf c2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikNCj4gPiArew0KPiA+ ICsgICAgIHN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSAqZWF0dHIgPQ0KPiA+ICsgICAgICAgICAg ICAgY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSwgYXR0cik7DQo+ ID4gKyAgICAgcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAiZXZlbnQ9MHglbGx4XG4iLA0KPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZWF0dHItPnZhcik7DQo+ ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoYXJtX2NzcG11X3N5c2ZzX2V2ZW50X3Nob3cp Ow0KPiA+ICsNCj4gPiArLyogRGVmYXVsdCBldmVudCBsaXN0LiAqLw0KPiA+ICtzdGF0aWMgc3Ry dWN0IGF0dHJpYnV0ZSAqYXJtX2NzcG11X2V2ZW50X2F0dHJzW10gPSB7DQo+ID4gKyAgICAgQVJN X0NTUE1VX0VWRU5UX0FUVFIoY3ljbGVzLA0KPiBBUk1fQ1NQTVVfRVZUX0NZQ0xFU19ERUZBVUxU KSwNCj4gPiArICAgICBOVUxMLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBh dHRyaWJ1dGUgKioNCj4gPiArYXJtX2NzcG11X2dldF9ldmVudF9hdHRycyhjb25zdCBzdHJ1Y3Qg YXJtX2NzcG11ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHJldHVybiBhcm1fY3NwbXVfZXZl bnRfYXR0cnM7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB1bW9kZV90DQo+ID4gK2FybV9j c3BtdV9ldmVudF9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IHVu dXNlZCkNCj4gPiArew0KPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2 KGtvYmopOw0KPiA+ICsgICAgIHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11ID0gdG9fYXJtX2NzcG11 KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsNCj4gPiArICAgICBzdHJ1Y3QgcGVyZl9wbXVfZXZlbnRz X2F0dHIgKmVhdHRyOw0KPiA+ICsNCj4gPiArICAgICBlYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRy LCB0eXBlb2YoKmVhdHRyKSwgYXR0ci5hdHRyKTsNCj4gPiArDQo+ID4gKyAgICAgLyogSGlkZSBj eWNsZSBldmVudCBpZiBub3Qgc3VwcG9ydGVkICovDQo+ID4gKyAgICAgaWYgKCFzdXBwb3J0c19j eWNsZV9jb3VudGVyKGNzcG11KSAmJg0KPiA+ICsgICAgICAgICBlYXR0ci0+aWQgPT0gQVJNX0NT UE1VX0VWVF9DWUNMRVNfREVGQVVMVCkNCj4gPiArICAgICAgICAgICAgIHJldHVybiAwOw0KPiA+ ICsNCj4gPiArICAgICByZXR1cm4gYXR0ci0+bW9kZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3Np emVfdCBhcm1fY3NwbXVfc3lzZnNfZm9ybWF0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LA0KPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICph dHRyLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZikNCj4gPiAr ew0KPiA+ICsgICAgIHN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSAqZWF0dHIgPQ0KPiA+ICsgICAg ICAgICAgICAgY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSwgYXR0 cik7DQo+ID4gKyAgICAgcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAiJXNcbiIsIChjaGFyICopZWF0 dHItPnZhcik7DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoYXJtX2NzcG11X3N5c2Zz X2Zvcm1hdF9zaG93KTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcm1f Y3NwbXVfZm9ybWF0X2F0dHJzW10gPSB7DQo+ID4gKyAgICAgQVJNX0NTUE1VX0ZPUk1BVF9FVkVO VF9BVFRSLA0KPiA+ICsgICAgIEFSTV9DU1BNVV9GT1JNQVRfRklMVEVSX0FUVFIsDQo+ID4gKyAg ICAgTlVMTCwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICoq DQo+ID4gK2FybV9jc3BtdV9nZXRfZm9ybWF0X2F0dHJzKGNvbnN0IHN0cnVjdCBhcm1fY3NwbXUg KmNzcG11KQ0KPiA+ICt7DQo+ID4gKyAgICAgcmV0dXJuIGFybV9jc3BtdV9mb3JtYXRfYXR0cnM7 DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB1MzIgYXJtX2NzcG11X2V2ZW50X3R5cGUoY29u c3Qgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ID4gKyAgICAgcmV0dXJuIGV2 ZW50LT5hdHRyLmNvbmZpZyAmIEFSTV9DU1BNVV9FVkVOVF9NQVNLOw0KPiA+ICt9DQo+ID4gKw0K PiA+ICtzdGF0aWMgYm9vbCBhcm1fY3NwbXVfaXNfY3ljbGVfY291bnRlcl9ldmVudChjb25zdCBz dHJ1Y3QgcGVyZl9ldmVudA0KPiAqZXZlbnQpDQo+ID4gK3sNCj4gPiArICAgICByZXR1cm4gKGV2 ZW50LT5hdHRyLmNvbmZpZyA9PSBBUk1fQ1NQTVVfRVZUX0NZQ0xFU19ERUZBVUxUKTsNCj4gPiAr fQ0KPiA+ICsNCj4gPiArc3RhdGljIHUzMiBhcm1fY3NwbXVfZXZlbnRfZmlsdGVyKGNvbnN0IHN0 cnVjdCBwZXJmX2V2ZW50ICpldmVudCkNCj4gPiArew0KPiA+ICsgICAgIHJldHVybiBldmVudC0+ YXR0ci5jb25maWcxICYgQVJNX0NTUE1VX0ZJTFRFUl9NQVNLOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICtzdGF0aWMgc3NpemVfdCBhcm1fY3NwbXVfaWRlbnRpZmllcl9zaG93KHN0cnVjdCBkZXZpY2Ug KmRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg ZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjaGFyICpwYWdlKQ0KPiA+ICt7DQo+ID4gKyAgICAgc3RydWN0IGFybV9jc3Bt dSAqY3NwbXUgPSB0b19hcm1fY3NwbXUoZGV2X2dldF9kcnZkYXRhKGRldikpOw0KPiA+ICsNCj4g PiArICAgICByZXR1cm4gc3lzZnNfZW1pdChwYWdlLCAiJXNcbiIsIGNzcG11LT5pZGVudGlmaWVy KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGFy bV9jc3BtdV9pZGVudGlmaWVyX2F0dHIgPQ0KPiA+ICsgICAgIF9fQVRUUihpZGVudGlmaWVyLCAw NDQ0LCBhcm1fY3NwbXVfaWRlbnRpZmllcl9zaG93LCBOVUxMKTsNCj4gPiArDQo+ID4gK3N0YXRp YyBzdHJ1Y3QgYXR0cmlidXRlICphcm1fY3NwbXVfaWRlbnRpZmllcl9hdHRyc1tdID0gew0KPiA+ ICsgICAgICZhcm1fY3NwbXVfaWRlbnRpZmllcl9hdHRyLmF0dHIsDQo+ID4gKyAgICAgTlVMTCwN Cj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFybV9j c3BtdV9pZGVudGlmaWVyX2F0dHJfZ3JvdXAgPSB7DQo+ID4gKyAgICAgLmF0dHJzID0gYXJtX2Nz cG11X2lkZW50aWZpZXJfYXR0cnMsDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdGF0aWMgY29uc3Qg Y2hhciAqYXJtX2NzcG11X2dldF9pZGVudGlmaWVyKGNvbnN0IHN0cnVjdCBhcm1fY3NwbXUNCj4g KmNzcG11KQ0KPiA+ICt7DQo+ID4gKyAgICAgY29uc3QgY2hhciAqaWRlbnRpZmllciA9DQo+ID4g KyAgICAgICAgICAgICBkZXZtX2thc3ByaW50Zihjc3BtdS0+ZGV2LCBHRlBfS0VSTkVMLCAiJXgi LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NwbXUtPmltcGwucG1paWRyKTsN Cj4gPiArICAgICByZXR1cm4gaWRlbnRpZmllcjsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGlj IGNvbnN0IGNoYXINCj4gKmFybV9jc3BtdV90eXBlX3N0cltBQ1BJX0FQTVRfTk9ERV9UWVBFX0NP VU5UXSA9IHsNCj4gPiArICAgICAibWMiLA0KPiA+ICsgICAgICJzbW11IiwNCj4gPiArICAgICAi cGNpZSIsDQo+ID4gKyAgICAgImFjcGkiLA0KPiA+ICsgICAgICJjYWNoZSIsDQo+ID4gK307DQo+ ID4gKw0KPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqYXJtX2NzcG11X2dldF9uYW1lKGNvbnN0IHN0 cnVjdCBhcm1fY3NwbXUNCj4gKmNzcG11KQ0KPiA+ICt7DQo+ID4gKyAgICAgc3RydWN0IGRldmlj ZSAqZGV2Ow0KPiA+ICsgICAgIHN0cnVjdCBhY3BpX2FwbXRfbm9kZSAqYXBtdF9ub2RlOw0KPiA+ ICsgICAgIHU4IHBtdV90eXBlOw0KPiA+ICsgICAgIGNoYXIgKm5hbWU7DQo+ID4gKyAgICAgY2hh ciBhY3BpX2hpZF9zdHJpbmdbQUNQSV9JRF9MRU5dID0geyAwIH07DQo+ID4gKyAgICAgc3RhdGlj IGF0b21pY190IHBtdV9pZHhbQUNQSV9BUE1UX05PREVfVFlQRV9DT1VOVF0gPSB7IDAgfTsNCj4g PiArDQo+ID4gKyAgICAgZGV2ID0gY3NwbXUtPmRldjsNCj4gPiArICAgICBhcG10X25vZGUgPSBj c3BtdS0+YXBtdF9ub2RlOw0KPiA+ICsgICAgIHBtdV90eXBlID0gYXBtdF9ub2RlLT50eXBlOw0K PiA+ICsNCj4gPiArICAgICBpZiAocG11X3R5cGUgPj0gQUNQSV9BUE1UX05PREVfVFlQRV9DT1VO VCkgew0KPiA+ICsgICAgICAgICAgICAgZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCBQTVUgdHlw ZS0ldVxuIiwgcG11X3R5cGUpOw0KPiA+ICsgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQo+ID4g KyAgICAgfQ0KPiA+ICsNCj4gPiArICAgICBpZiAocG11X3R5cGUgPT0gQUNQSV9BUE1UX05PREVf VFlQRV9BQ1BJKSB7DQo+ID4gKyAgICAgICAgICAgICBtZW1jcHkoYWNwaV9oaWRfc3RyaW5nLA0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAmYXBtdF9ub2RlLT5pbnN0X3ByaW1hcnksDQo+ID4g KyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcG10X25vZGUtPmluc3RfcHJpbWFyeSkpOw0K PiA+ICsgICAgICAgICAgICAgbmFtZSA9IGRldm1fa2FzcHJpbnRmKGRldiwgR0ZQX0tFUk5FTCwg IiVzXyVzXyVzXyV1IiwNCj4gUE1VTkFNRSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhcm1fY3NwbXVfdHlwZV9zdHJbcG11X3R5cGVdLA0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfaGlkX3N0cmluZywNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhcG10X25vZGUtPmluc3Rfc2Vjb25kYXJ5KTsNCj4g PiArICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgbmFtZSA9IGRldm1fa2FzcHJpbnRm KGRldiwgR0ZQX0tFUk5FTCwgIiVzXyVzXyVkIiwNCj4gUE1VTkFNRSwNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fY3NwbXVfdHlwZV9zdHJbcG11X3R5cGVdLA0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19mZXRjaF9pbmMo JnBtdV9pZHhbcG11X3R5cGVdKSk7DQo+ID4gKyAgICAgfQ0KPiA+ICsNCj4gPiArICAgICByZXR1 cm4gbmFtZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHNzaXplX3QgYXJtX2NzcG11X2Nw dW1hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsDQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmKQ0KPiA+ICt7DQo+ID4gKyAg ICAgc3RydWN0IHBtdSAqcG11ID0gZGV2X2dldF9kcnZkYXRhKGRldik7DQo+ID4gKyAgICAgc3Ry dWN0IGFybV9jc3BtdSAqY3NwbXUgPSB0b19hcm1fY3NwbXUocG11KTsNCj4gPiArICAgICBzdHJ1 Y3QgZGV2X2V4dF9hdHRyaWJ1dGUgKmVhdHRyID0NCj4gPiArICAgICAgICAgICAgIGNvbnRhaW5l cl9vZihhdHRyLCBzdHJ1Y3QgZGV2X2V4dF9hdHRyaWJ1dGUsIGF0dHIpOw0KPiA+ICsgICAgIHVu c2lnbmVkIGxvbmcgbWFza19pZCA9ICh1bnNpZ25lZCBsb25nKWVhdHRyLT52YXI7DQo+ID4gKyAg ICAgY29uc3QgY3B1bWFza190ICpjcHVtYXNrOw0KPiA+ICsNCj4gPiArICAgICBzd2l0Y2ggKG1h c2tfaWQpIHsNCj4gPiArICAgICBjYXNlIEFSTV9DU1BNVV9BQ1RJVkVfQ1BVX01BU0s6DQo+ID4g KyAgICAgICAgICAgICBjcHVtYXNrID0gJmNzcG11LT5hY3RpdmVfY3B1Ow0KPiA+ICsgICAgICAg ICAgICAgYnJlYWs7DQo+ID4gKyAgICAgY2FzZSBBUk1fQ1NQTVVfQVNTT0NJQVRFRF9DUFVfTUFT SzoNCj4gPiArICAgICAgICAgICAgIGNwdW1hc2sgPSAmY3NwbXUtPmFzc29jaWF0ZWRfY3B1czsN Cj4gPiArICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgIGRlZmF1bHQ6DQo+ID4gKyAgICAg ICAgICAgICByZXR1cm4gMDsNCj4gPiArICAgICB9DQo+ID4gKyAgICAgcmV0dXJuIGNwdW1hcF9w cmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgY3B1bWFzayk7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcm1fY3NwbXVfY3B1bWFza19hdHRyc1tdID0gew0K PiA+ICsgICAgIEFSTV9DU1BNVV9DUFVNQVNLX0FUVFIoY3B1bWFzaywNCj4gQVJNX0NTUE1VX0FD VElWRV9DUFVfTUFTSyksDQo+ID4gKyAgICAgQVJNX0NTUE1VX0NQVU1BU0tfQVRUUihhc3NvY2lh dGVkX2NwdXMsDQo+IEFSTV9DU1BNVV9BU1NPQ0lBVEVEX0NQVV9NQVNLKSwNCj4gPiArICAgICBO VUxMLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAg YXJtX2NzcG11X2NwdW1hc2tfYXR0cl9ncm91cCA9IHsNCj4gPiArICAgICAuYXR0cnMgPSBhcm1f Y3NwbXVfY3B1bWFza19hdHRycywNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0cnVjdCBpbXBsX21h dGNoIHsNCj4gPiArICAgICB1MzIgcG1paWRyOw0KPiA+ICsgICAgIHUzMiBtYXNrOw0KPiA+ICsg ICAgIGludCAoKmltcGxfaW5pdF9vcHMpKHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11KTsNCj4gPiAr fTsNCj4gPiArDQo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW1wbF9tYXRjaCBpbXBsX21hdGNo W10gPSB7DQo+ID4gKyAgICAge30NCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgYXJt X2NzcG11X2luaXRfaW1wbF9vcHMoc3RydWN0IGFybV9jc3BtdSAqY3NwbXUpDQo+ID4gK3sNCj4g PiArICAgICBpbnQgcmV0Ow0KPiA+ICsgICAgIHN0cnVjdCBhY3BpX2FwbXRfbm9kZSAqYXBtdF9u b2RlID0gY3NwbXUtPmFwbXRfbm9kZTsNCj4gPiArICAgICBzdHJ1Y3QgYXJtX2NzcG11X2ltcGxf b3BzICppbXBsX29wcyA9ICZjc3BtdS0+aW1wbC5vcHM7DQo+ID4gKyAgICAgY29uc3Qgc3RydWN0 IGltcGxfbWF0Y2ggKm1hdGNoID0gaW1wbF9tYXRjaDsNCj4gPiArDQo+ID4gKyAgICAgLyoNCj4g PiArICAgICAgKiBHZXQgUE1VIGltcGxlbWVudGVyIGFuZCBwcm9kdWN0IGlkIGZyb20gQVBNVCBu b2RlLg0KPiA+ICsgICAgICAqIElmIEFQTVQgbm9kZSBkb2Vzbid0IGhhdmUgaW1wbGVtZW50ZXIv cHJvZHVjdCBpZCwgdHJ5IGdldCBpdA0KPiA+ICsgICAgICAqIGZyb20gUE1JSURSLg0KPiA+ICsg ICAgICAqLw0KPiA+ICsgICAgIGNzcG11LT5pbXBsLnBtaWlkciA9DQo+ID4gKyAgICAgICAgICAg ICAoYXBtdF9ub2RlLT5pbXBsX2lkKSA/IGFwbXRfbm9kZS0+aW1wbF9pZCA6DQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRsKGNzcG11LT5iYXNlMCArIFBNSUlE Uik7DQo+ID4gKw0KPiA+ICsgICAgIC8qIEZpbmQgaW1wbGVtZW50ZXIgc3BlY2lmaWMgYXR0cmli dXRlIG9wcy4gKi8NCj4gPiArICAgICBmb3IgKDsgbWF0Y2gtPnBtaWlkcjsgbWF0Y2grKykgew0K PiA+ICsgICAgICAgICAgICAgY29uc3QgdTMyIG1hc2sgPSBtYXRjaC0+bWFzazsNCj4gPiArDQo+ ID4gKyAgICAgICAgICAgICBpZiAoKG1hdGNoLT5wbWlpZHIgJiBtYXNrKSA9PSAoY3NwbXUtPmlt cGwucG1paWRyICYgbWFzaykpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbWF0 Y2gtPmltcGxfaW5pdF9vcHMoY3NwbXUpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBpZiAo cmV0KQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQo+ID4g Kw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4gPiArICAgICAgICAgICAgIH0N Cj4gPiArICAgICB9DQo+ID4gKw0KPiA+ICsgICAgIC8qIFVzZSBkZWZhdWx0IGNhbGxiYWNrcyBp ZiBpbXBsZW1lbnRlciBkb2Vzbid0IHByb3ZpZGUgb25lLiAqLw0KPiA+ICsgICAgIENIRUNLX0RF RkFVTFRfSU1QTF9PUFMoaW1wbF9vcHMsIGdldF9ldmVudF9hdHRycyk7DQo+ID4gKyAgICAgQ0hF Q0tfREVGQVVMVF9JTVBMX09QUyhpbXBsX29wcywgZ2V0X2Zvcm1hdF9hdHRycyk7DQo+ID4gKyAg ICAgQ0hFQ0tfREVGQVVMVF9JTVBMX09QUyhpbXBsX29wcywgZ2V0X2lkZW50aWZpZXIpOw0KPiA+ ICsgICAgIENIRUNLX0RFRkFVTFRfSU1QTF9PUFMoaW1wbF9vcHMsIGdldF9uYW1lKTsNCj4gPiAr ICAgICBDSEVDS19ERUZBVUxUX0lNUExfT1BTKGltcGxfb3BzLCBpc19jeWNsZV9jb3VudGVyX2V2 ZW50KTsNCj4gPiArICAgICBDSEVDS19ERUZBVUxUX0lNUExfT1BTKGltcGxfb3BzLCBldmVudF90 eXBlKTsNCj4gPiArICAgICBDSEVDS19ERUZBVUxUX0lNUExfT1BTKGltcGxfb3BzLCBldmVudF9m aWx0ZXIpOw0KPiA+ICsgICAgIENIRUNLX0RFRkFVTFRfSU1QTF9PUFMoaW1wbF9vcHMsIGV2ZW50 X2F0dHJfaXNfdmlzaWJsZSk7DQo+ID4gKw0KPiA+ICsgICAgIHJldHVybiAwOw0KPiA+ICt9DQo+ ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqDQo+ID4gK2FybV9jc3Bt dV9hbGxvY19ldmVudF9hdHRyX2dyb3VwKHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11KQ0KPiA+ICt7 DQo+ID4gKyAgICAgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZXZlbnRfZ3JvdXA7DQo+ID4gKyAg ICAgc3RydWN0IGRldmljZSAqZGV2ID0gY3NwbXUtPmRldjsNCj4gPiArICAgICBjb25zdCBzdHJ1 Y3QgYXJtX2NzcG11X2ltcGxfb3BzICppbXBsX29wcyA9ICZjc3BtdS0+aW1wbC5vcHM7DQo+ID4g Kw0KPiA+ICsgICAgIGV2ZW50X2dyb3VwID0NCj4gPiArICAgICAgICAgICAgIGRldm1fa3phbGxv YyhkZXYsIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwKSwgR0ZQX0tFUk5FTCk7DQo+ID4g KyAgICAgaWYgKCFldmVudF9ncm91cCkNCj4gPiArICAgICAgICAgICAgIHJldHVybiBOVUxMOw0K PiA+ICsNCj4gPiArICAgICBldmVudF9ncm91cC0+bmFtZSA9ICJldmVudHMiOw0KPiA+ICsgICAg IGV2ZW50X2dyb3VwLT5hdHRycyA9IGltcGxfb3BzLT5nZXRfZXZlbnRfYXR0cnMoY3NwbXUpOw0K PiA+ICsgICAgIGV2ZW50X2dyb3VwLT5pc192aXNpYmxlID0gaW1wbF9vcHMtPmV2ZW50X2F0dHJf aXNfdmlzaWJsZTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJuIGV2ZW50X2dyb3VwOw0KPiA+ICt9 DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqDQo+ID4gK2FybV9j c3BtdV9hbGxvY19mb3JtYXRfYXR0cl9ncm91cChzdHJ1Y3QgYXJtX2NzcG11ICpjc3BtdSkNCj4g PiArew0KPiA+ICsgICAgIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmZvcm1hdF9ncm91cDsNCj4g PiArICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjc3BtdS0+ZGV2Ow0KPiA+ICsNCj4gPiArICAg ICBmb3JtYXRfZ3JvdXAgPQ0KPiA+ICsgICAgICAgICAgICAgZGV2bV9remFsbG9jKGRldiwgc2l6 ZW9mKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXApLCBHRlBfS0VSTkVMKTsNCj4gPiArICAgICBpZiAo IWZvcm1hdF9ncm91cCkNCj4gPiArICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KPiA+ICsNCj4g PiArICAgICBmb3JtYXRfZ3JvdXAtPm5hbWUgPSAiZm9ybWF0IjsNCj4gPiArICAgICBmb3JtYXRf Z3JvdXAtPmF0dHJzID0gY3NwbXUtPmltcGwub3BzLmdldF9mb3JtYXRfYXR0cnMoY3NwbXUpOw0K PiA+ICsNCj4gPiArICAgICByZXR1cm4gZm9ybWF0X2dyb3VwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICtzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKg0KPiA+ICthcm1fY3NwbXVfYWxsb2Nf YXR0cl9ncm91cChzdHJ1Y3QgYXJtX2NzcG11ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHN0 cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKiphdHRyX2dyb3VwcyA9IE5VTEw7DQo+ID4gKyAgICAgc3Ry dWN0IGRldmljZSAqZGV2ID0gY3NwbXUtPmRldjsNCj4gPiArICAgICBjb25zdCBzdHJ1Y3QgYXJt X2NzcG11X2ltcGxfb3BzICppbXBsX29wcyA9ICZjc3BtdS0+aW1wbC5vcHM7DQo+ID4gKyAgICAg aW50IHJldDsNCj4gPiArDQo+ID4gKyAgICAgcmV0ID0gYXJtX2NzcG11X2luaXRfaW1wbF9vcHMo Y3NwbXUpOw0KPiA+ICsgICAgIGlmIChyZXQpDQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gTlVM TDsNCj4gPiArDQo+ID4gKyAgICAgY3NwbXUtPmlkZW50aWZpZXIgPSBpbXBsX29wcy0+Z2V0X2lk ZW50aWZpZXIoY3NwbXUpOw0KPiA+ICsgICAgIGNzcG11LT5uYW1lID0gaW1wbF9vcHMtPmdldF9u YW1lKGNzcG11KTsNCj4gPiArDQo+ID4gKyAgICAgaWYgKCFjc3BtdS0+aWRlbnRpZmllciB8fCAh Y3NwbXUtPm5hbWUpDQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gTlVMTDsNCj4gPiArDQo+ID4g KyAgICAgYXR0cl9ncm91cHMgPSBkZXZtX2tjYWxsb2MoZGV2LCA1LCBzaXplb2Yoc3RydWN0IGF0 dHJpYnV0ZV9ncm91cCAqKSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBH RlBfS0VSTkVMKTsNCj4gPiArICAgICBpZiAoIWF0dHJfZ3JvdXBzKQ0KPiA+ICsgICAgICAgICAg ICAgcmV0dXJuIE5VTEw7DQo+ID4gKw0KPiA+ICsgICAgIGF0dHJfZ3JvdXBzWzBdID0gYXJtX2Nz cG11X2FsbG9jX2V2ZW50X2F0dHJfZ3JvdXAoY3NwbXUpOw0KPiA+ICsgICAgIGF0dHJfZ3JvdXBz WzFdID0gYXJtX2NzcG11X2FsbG9jX2Zvcm1hdF9hdHRyX2dyb3VwKGNzcG11KTsNCj4gPiArICAg ICBhdHRyX2dyb3Vwc1syXSA9ICZhcm1fY3NwbXVfaWRlbnRpZmllcl9hdHRyX2dyb3VwOw0KPiA+ ICsgICAgIGF0dHJfZ3JvdXBzWzNdID0gJmFybV9jc3BtdV9jcHVtYXNrX2F0dHJfZ3JvdXA7DQo+ ID4gKw0KPiA+ICsgICAgIGlmICghYXR0cl9ncm91cHNbMF0gfHwgIWF0dHJfZ3JvdXBzWzFdKQ0K PiA+ICsgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQo+ID4gKw0KPiA+ICsgICAgIHJldHVybiBh dHRyX2dyb3VwczsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGlubGluZSB2b2lkIGFybV9j c3BtdV9yZXNldF9jb3VudGVycyhzdHJ1Y3QgYXJtX2NzcG11ICpjc3BtdSkNCj4gPiArew0KPiA+ ICsgICAgIHUzMiBwbWNyID0gMDsNCj4gPiArDQo+ID4gKyAgICAgcG1jciB8PSBQTUNSX1A7DQo+ ID4gKyAgICAgcG1jciB8PSBQTUNSX0M7DQo+ID4gKyAgICAgd3JpdGVsKHBtY3IsIGNzcG11LT5i YXNlMCArIFBNQ1IpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgYXJt X2NzcG11X3N0YXJ0X2NvdW50ZXJzKHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11KQ0KPiA+ICt7DQo+ ID4gKyAgICAgd3JpdGVsKFBNQ1JfRSwgY3NwbXUtPmJhc2UwICsgUE1DUik7DQo+ID4gK30NCj4g PiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm1fY3NwbXVfc3RvcF9jb3VudGVycyhzdHJ1 Y3QgYXJtX2NzcG11ICpjc3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHdyaXRlbCgwLCBjc3BtdS0+ YmFzZTAgKyBQTUNSKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgYXJtX2NzcG11 X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpDQo+ID4gK3sNCj4gPiArICAgICBib29sIGRpc2FibGVk Ow0KPiA+ICsgICAgIHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11ID0gdG9fYXJtX2NzcG11KHBtdSk7 DQo+ID4gKw0KPiA+ICsgICAgIGRpc2FibGVkID0gYml0bWFwX2VtcHR5KGNzcG11LT5od19ldmVu dHMudXNlZF9jdHJzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcG11LT5u dW1fbG9naWNhbF9jdHJzKTsNCj4gPiArDQo+ID4gKyAgICAgaWYgKGRpc2FibGVkKQ0KPiA+ICsg ICAgICAgICAgICAgcmV0dXJuOw0KPiA+ICsNCj4gPiArICAgICBhcm1fY3NwbXVfc3RhcnRfY291 bnRlcnMoY3NwbXUpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBhcm1fY3NwbXVf ZGlzYWJsZShzdHJ1Y3QgcG11ICpwbXUpDQo+ID4gK3sNCj4gPiArICAgICBzdHJ1Y3QgYXJtX2Nz cG11ICpjc3BtdSA9IHRvX2FybV9jc3BtdShwbXUpOw0KPiA+ICsNCj4gPiArICAgICBhcm1fY3Nw bXVfc3RvcF9jb3VudGVycyhjc3BtdSk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQg YXJtX2NzcG11X2dldF9ldmVudF9pZHgoc3RydWN0IGFybV9jc3BtdV9od19ldmVudHMNCj4gKmh3 X2V2ZW50cywNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGVyZl9l dmVudCAqZXZlbnQpDQo+ID4gK3sNCj4gPiArICAgICBpbnQgaWR4Ow0KPiA+ICsgICAgIHN0cnVj dCBhcm1fY3NwbXUgKmNzcG11ID0gdG9fYXJtX2NzcG11KGV2ZW50LT5wbXUpOw0KPiA+ICsNCj4g PiArICAgICBpZiAoc3VwcG9ydHNfY3ljbGVfY291bnRlcihjc3BtdSkpIHsNCj4gPiArICAgICAg ICAgICAgIGlmIChjc3BtdS0+aW1wbC5vcHMuaXNfY3ljbGVfY291bnRlcl9ldmVudChldmVudCkp IHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgLyogU2VhcmNoIGZvciBhdmFpbGFibGUgY3lj bGUgY291bnRlci4gKi8NCj4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RfYW5kX3Nl dF9iaXQoY3NwbXUtPmN5Y2xlX2NvdW50ZXJfbG9naWNhbF9pZHgsDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X2V2ZW50cy0+dXNlZF9jdHJzKSkNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsNCj4gPiArDQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc3BtdS0+Y3ljbGVfY291bnRlcl9sb2dp Y2FsX2lkeDsNCj4gPiArICAgICAgICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAv Kg0KPiA+ICsgICAgICAgICAgICAgICogU2VhcmNoIGEgcmVndWxhciBjb3VudGVyIGZyb20gdGhl IHVzZWQgY291bnRlciBiaXRtYXAuDQo+ID4gKyAgICAgICAgICAgICAgKiBUaGUgY3ljbGUgY291 bnRlciBkaXZpZGVzIHRoZSBiaXRtYXAgaW50byB0d28gcGFydHMuIFNlYXJjaA0KPiA+ICsgICAg ICAgICAgICAgICogdGhlIGZpcnN0IHRoZW4gc2Vjb25kIGhhbGYgdG8gZXhjbHVkZSB0aGUgY3lj bGUgY291bnRlciBiaXQuDQo+ID4gKyAgICAgICAgICAgICAgKi8NCj4gPiArICAgICAgICAgICAg IGlkeCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaHdfZXZlbnRzLT51c2VkX2N0cnMsDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcG11LT5jeWNsZV9jb3VudGVy X2xvZ2ljYWxfaWR4KTsNCj4gPiArICAgICAgICAgICAgIGlmIChpZHggPj0gY3NwbXUtPmN5Y2xl X2NvdW50ZXJfbG9naWNhbF9pZHgpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgaWR4ID0g ZmluZF9uZXh0X3plcm9fYml0KA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3 X2V2ZW50cy0+dXNlZF9jdHJzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNz cG11LT5udW1fbG9naWNhbF9jdHJzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNzcG11LT5jeWNsZV9jb3VudGVyX2xvZ2ljYWxfaWR4ICsgMSk7DQo+ID4gKyAgICAgICAgICAg ICB9DQo+ID4gKyAgICAgfSBlbHNlIHsNCj4gPiArICAgICAgICAgICAgIGlkeCA9IGZpbmRfZmly c3RfemVyb19iaXQoaHdfZXZlbnRzLT51c2VkX2N0cnMsDQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNzcG11LT5udW1fbG9naWNhbF9jdHJzKTsNCj4gPiArICAg ICB9DQo+ID4gKw0KPiA+ICsgICAgIGlmIChpZHggPj0gY3NwbXUtPm51bV9sb2dpY2FsX2N0cnMp DQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsNCj4gPiArDQo+ID4gKyAgICAgc2V0 X2JpdChpZHgsIGh3X2V2ZW50cy0+dXNlZF9jdHJzKTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJu IGlkeDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGJvb2wgYXJtX2NzcG11X3ZhbGlkYXRl X2V2ZW50KHN0cnVjdCBwbXUgKnBtdSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IGFybV9jc3BtdV9od19ldmVudHMgKmh3X2V2ZW50cywNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ ID4gKyAgICAgaWYgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkNCj4gPiArICAgICAgICAgICAg IHJldHVybiB0cnVlOw0KPiA+ICsNCj4gPiArICAgICAvKiBSZWplY3QgZ3JvdXBzIHNwYW5uaW5n IG11bHRpcGxlIEhXIFBNVXMuICovDQo+ID4gKyAgICAgaWYgKGV2ZW50LT5wbXUgIT0gcG11KQ0K PiA+ICsgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArICAgICByZXR1cm4g KGFybV9jc3BtdV9nZXRfZXZlbnRfaWR4KGh3X2V2ZW50cywgZXZlbnQpID49IDApOw0KPiA+ICt9 DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBNYWtlIHN1cmUgdGhlIGdyb3VwIG9mIGV2ZW50cyBj YW4gYmUgc2NoZWR1bGVkIGF0IG9uY2UNCj4gPiArICogb24gdGhlIFBNVS4NCj4gPiArICovDQo+ ID4gK3N0YXRpYyBib29sIGFybV9jc3BtdV92YWxpZGF0ZV9ncm91cChzdHJ1Y3QgcGVyZl9ldmVu dCAqZXZlbnQpDQo+ID4gK3sNCj4gPiArICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZywg KmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7DQo+ID4gKyAgICAgc3RydWN0IGFybV9jc3Bt dV9od19ldmVudHMgZmFrZV9od19ldmVudHM7DQo+ID4gKw0KPiA+ICsgICAgIGlmIChldmVudC0+ Z3JvdXBfbGVhZGVyID09IGV2ZW50KQ0KPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQo+ ID4gKw0KPiA+ICsgICAgIG1lbXNldCgmZmFrZV9od19ldmVudHMsIDAsIHNpemVvZihmYWtlX2h3 X2V2ZW50cykpOw0KPiA+ICsNCj4gPiArICAgICBpZiAoIWFybV9jc3BtdV92YWxpZGF0ZV9ldmVu dChldmVudC0+cG11LCAmZmFrZV9od19ldmVudHMsDQo+IGxlYWRlcikpDQo+ID4gKyAgICAgICAg ICAgICByZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsgICAgIGZvcl9lYWNoX3NpYmxpbmdfZXZl bnQoc2libGluZywgbGVhZGVyKSB7DQo+ID4gKyAgICAgICAgICAgICBpZiAoIWFybV9jc3BtdV92 YWxpZGF0ZV9ldmVudChldmVudC0+cG11LCAmZmFrZV9od19ldmVudHMsDQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZykpDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCj4gPiArICAgICB9DQo+ID4gKw0KPiA+ ICsgICAgIHJldHVybiBhcm1fY3NwbXVfdmFsaWRhdGVfZXZlbnQoZXZlbnQtPnBtdSwgJmZha2Vf aHdfZXZlbnRzLA0KPiBldmVudCk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgYXJt X2NzcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ID4g KyAgICAgc3RydWN0IGFybV9jc3BtdSAqY3NwbXU7DQo+ID4gKyAgICAgc3RydWN0IGh3X3BlcmZf ZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7DQo+ID4gKw0KPiA+ICsgICAgIGNzcG11ID0gdG9fYXJt X2NzcG11KGV2ZW50LT5wbXUpOw0KPiA+ICsNCj4gPiArICAgICAvKg0KPiA+ICsgICAgICAqIEZv bGxvd2luZyBvdGhlciAidW5jb3JlIiBQTVVzLCB3ZSBkbyBub3Qgc3VwcG9ydCBzYW1wbGluZyBt b2RlDQo+IG9yDQo+ID4gKyAgICAgICogYXR0YWNoIHRvIGEgdGFzayAocGVyLXByb2Nlc3MgbW9k ZSkuDQo+ID4gKyAgICAgICovDQo+ID4gKyAgICAgaWYgKGlzX3NhbXBsaW5nX2V2ZW50KGV2ZW50 KSkgew0KPiA+ICsgICAgICAgICAgICAgZGV2X2RiZyhjc3BtdS0+cG11LmRldiwNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgIkNhbid0IHN1cHBvcnQgc2FtcGxpbmcgZXZlbnRzXG4iKTsNCj4g PiArICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsNCj4gPiArICAgICB9DQo+ID4gKw0K PiA+ICsgICAgIGlmIChldmVudC0+Y3B1IDwgMCB8fCBldmVudC0+YXR0YWNoX3N0YXRlICYgUEVS Rl9BVFRBQ0hfVEFTSykgew0KPiA+ICsgICAgICAgICAgICAgZGV2X2RiZyhjc3BtdS0+cG11LmRl diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHN1cHBvcnQgcGVyLXRhc2sgY291 bnRlcnNcbiIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+ID4gKyAgICAg fQ0KPiA+ICsNCj4gPiArICAgICAvKg0KPiA+ICsgICAgICAqIE1ha2Ugc3VyZSB0aGUgQ1BVIGFz c2lnbm1lbnQgaXMgb24gb25lIG9mIHRoZSBDUFVzIGFzc29jaWF0ZWQgd2l0aA0KPiA+ICsgICAg ICAqIHRoaXMgUE1VLg0KPiA+ICsgICAgICAqLw0KPiA+ICsgICAgIGlmICghY3B1bWFza190ZXN0 X2NwdShldmVudC0+Y3B1LCAmY3NwbXUtPmFzc29jaWF0ZWRfY3B1cykpIHsNCj4gPiArICAgICAg ICAgICAgIGRldl9kYmcoY3NwbXUtPnBtdS5kZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICJSZXF1ZXN0ZWQgY3B1IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIFBNVVxuIik7DQo+ID4g KyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gPiArICAgICB9DQo+ID4gKw0KPiA+ICsg ICAgIC8qIEVuZm9yY2UgdGhlIGN1cnJlbnQgYWN0aXZlIENQVSB0byBoYW5kbGUgdGhlIGV2ZW50 cyBpbiB0aGlzIFBNVS4gKi8NCj4gPiArICAgICBldmVudC0+Y3B1ID0gY3B1bWFza19maXJzdCgm Y3NwbXUtPmFjdGl2ZV9jcHUpOw0KPiA+ICsgICAgIGlmIChldmVudC0+Y3B1ID49IG5yX2NwdV9p ZHMpDQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKyAgICAg aWYgKCFhcm1fY3NwbXVfdmFsaWRhdGVfZ3JvdXAoZXZlbnQpKQ0KPiA+ICsgICAgICAgICAgICAg cmV0dXJuIC1FSU5WQUw7DQo+ID4gKw0KPiA+ICsgICAgIC8qDQo+ID4gKyAgICAgICogVGhlIGxv Z2ljYWwgY291bnRlciBpZCBpcyB0cmFja2VkIHdpdGggaHdfcGVyZl9ldmVudC5leHRyYV9yZWcu aWR4Lg0KPiA+ICsgICAgICAqIFRoZSBwaHlzaWNhbCBjb3VudGVyIGlkIGlzIHRyYWNrZWQgd2l0 aCBod19wZXJmX2V2ZW50LmlkeC4NCj4gPiArICAgICAgKiBXZSBkb24ndCBhc3NpZ24gYW4gaW5k ZXggdW50aWwgd2UgYWN0dWFsbHkgcGxhY2UgdGhlIGV2ZW50IG9udG8NCj4gPiArICAgICAgKiBo YXJkd2FyZS4gVXNlIC0xIHRvIHNpZ25pZnkgdGhhdCB3ZSBoYXZlbid0IGRlY2lkZWQgd2hlcmUg dG8gcHV0IGl0DQo+ID4gKyAgICAgICogeWV0Lg0KPiA+ICsgICAgICAqLw0KPiA+ICsgICAgIGh3 Yy0+aWR4ID0gLTE7DQo+ID4gKyAgICAgaHdjLT5leHRyYV9yZWcuaWR4ID0gLTE7DQo+ID4gKyAg ICAgaHdjLT5jb25maWcgPSBjc3BtdS0+aW1wbC5vcHMuZXZlbnRfdHlwZShldmVudCk7DQo+ID4g Kw0KPiA+ICsgICAgIHJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5l IHUzMiBjb3VudGVyX29mZnNldCh1MzIgcmVnX3N6LCB1MzIgY3RyX2lkeCkNCj4gPiArew0KPiA+ ICsgICAgIHJldHVybiAoUE1FVkNOVFJfTE8gKyAocmVnX3N6ICogY3RyX2lkeCkpOw0KPiA+ICt9 DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBhcm1fY3NwbXVfd3JpdGVfY291bnRlcihzdHJ1Y3Qg cGVyZl9ldmVudCAqZXZlbnQsIHU2NCB2YWwpDQo+ID4gK3sNCj4gPiArICAgICB1MzIgb2Zmc2V0 Ow0KPiA+ICsgICAgIHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11ID0gdG9fYXJtX2NzcG11KGV2ZW50 LT5wbXUpOw0KPiA+ICsNCj4gPiArICAgICBpZiAodXNlXzY0Yl9jb3VudGVyX3JlZyhjc3BtdSkp IHsNCj4gPiArICAgICAgICAgICAgIG9mZnNldCA9IGNvdW50ZXJfb2Zmc2V0KHNpemVvZih1NjQp LCBldmVudC0+aHcuaWR4KTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICB3cml0ZXEodmFsLCBj c3BtdS0+YmFzZTEgKyBvZmZzZXQpOw0KPiA+ICsgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAg ICAgICBvZmZzZXQgPSBjb3VudGVyX29mZnNldChzaXplb2YodTMyKSwgZXZlbnQtPmh3LmlkeCk7 DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgd3JpdGVsKGxvd2VyXzMyX2JpdHModmFsKSwgY3Nw bXUtPmJhc2UxICsgb2Zmc2V0KTsNCj4gPiArICAgICB9DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0 YXRpYyB1NjQgYXJtX2NzcG11X3JlYWRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQp DQo+ID4gK3sNCj4gPiArICAgICB1MzIgb2Zmc2V0Ow0KPiA+ICsgICAgIGNvbnN0IHZvaWQgX19p b21lbSAqY291bnRlcl9hZGRyOw0KPiA+ICsgICAgIHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11ID0g dG9fYXJtX2NzcG11KGV2ZW50LT5wbXUpOw0KPiA+ICsNCj4gPiArICAgICBpZiAodXNlXzY0Yl9j b3VudGVyX3JlZyhjc3BtdSkpIHsNCj4gPiArICAgICAgICAgICAgIG9mZnNldCA9IGNvdW50ZXJf b2Zmc2V0KHNpemVvZih1NjQpLCBldmVudC0+aHcuaWR4KTsNCj4gPiArICAgICAgICAgICAgIGNv dW50ZXJfYWRkciA9IGNzcG11LT5iYXNlMSArIG9mZnNldDsNCj4gPiArDQo+ID4gKyAgICAgICAg ICAgICByZXR1cm4gc3VwcG9ydHNfNjRiaXRfYXRvbWljcyhjc3BtdSkgPw0KPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVhZHEoY291bnRlcl9hZGRyKSA6DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZWFkX3JlZzY0X2hpbG9oaShjb3VudGVyX2FkZHIpOw0KPiA+ ICsgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgb2Zmc2V0ID0gY291bnRlcl9vZmZzZXQoc2l6ZW9m KHUzMiksIGV2ZW50LT5ody5pZHgpOw0KPiA+ICsgICAgIHJldHVybiByZWFkbChjc3BtdS0+YmFz ZTEgKyBvZmZzZXQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBhcm1fY3NwbXVf c2V0X2V2ZW50X3BlcmlvZDogU2V0IHRoZSBwZXJpb2QgZm9yIHRoZSBjb3VudGVyLg0KPiA+ICsg Kg0KPiA+ICsgKiBUbyBoYW5kbGUgY2FzZXMgb2YgZXh0cmVtZSBpbnRlcnJ1cHQgbGF0ZW5jeSwg d2UgcHJvZ3JhbQ0KPiA+ICsgKiB0aGUgY291bnRlciB3aXRoIGhhbGYgb2YgdGhlIG1heCBjb3Vu dCBmb3IgdGhlIGNvdW50ZXJzLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIHZvaWQgYXJtX2NzcG11 X3NldF9ldmVudF9wZXJpb2Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ID4g KyAgICAgc3RydWN0IGFybV9jc3BtdSAqY3NwbXUgPSB0b19hcm1fY3NwbXUoZXZlbnQtPnBtdSk7 DQo+ID4gKyAgICAgdTY0IHZhbCA9IGNvdW50ZXJfbWFzayhjc3BtdSkgPj4gMVVMTDsNCj4gPiAr DQo+ID4gKyAgICAgbG9jYWw2NF9zZXQoJmV2ZW50LT5ody5wcmV2X2NvdW50LCB2YWwpOw0KPiA+ ICsgICAgIGFybV9jc3BtdV93cml0ZV9jb3VudGVyKGV2ZW50LCB2YWwpOw0KPiA+ICt9DQo+ID4g Kw0KPiA+ICtzdGF0aWMgdm9pZCBhcm1fY3NwbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGFybV9j c3BtdSAqY3NwbXUsIGludA0KPiBpZHgpDQo+ID4gK3sNCj4gPiArICAgICB1MzIgcmVnX2lkLCBy ZWdfYml0LCBpbnRlbl9vZmYsIGNudGVuX29mZjsNCj4gPiArDQo+ID4gKyAgICAgcmVnX2lkID0g Q09VTlRFUl9UT19TRVRfQ0xSX0lEKGlkeCk7DQo+ID4gKyAgICAgcmVnX2JpdCA9IENPVU5URVJf VE9fU0VUX0NMUl9CSVQoaWR4KTsNCj4gPiArDQo+ID4gKyAgICAgaW50ZW5fb2ZmID0gUE1JTlRF TlNFVCArICg0ICogcmVnX2lkKTsNCj4gPiArICAgICBjbnRlbl9vZmYgPSBQTUNOVEVOU0VUICsg KDQgKiByZWdfaWQpOw0KPiA+ICsNCj4gPiArICAgICB3cml0ZWwoQklUKHJlZ19iaXQpLCBjc3Bt dS0+YmFzZTAgKyBpbnRlbl9vZmYpOw0KPiA+ICsgICAgIHdyaXRlbChCSVQocmVnX2JpdCksIGNz cG11LT5iYXNlMCArIGNudGVuX29mZik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lk IGFybV9jc3BtdV9kaXNhYmxlX2NvdW50ZXIoc3RydWN0IGFybV9jc3BtdSAqY3NwbXUsIGludA0K PiBpZHgpDQo+ID4gK3sNCj4gPiArICAgICB1MzIgcmVnX2lkLCByZWdfYml0LCBpbnRlbl9vZmYs IGNudGVuX29mZjsNCj4gPiArDQo+ID4gKyAgICAgcmVnX2lkID0gQ09VTlRFUl9UT19TRVRfQ0xS X0lEKGlkeCk7DQo+ID4gKyAgICAgcmVnX2JpdCA9IENPVU5URVJfVE9fU0VUX0NMUl9CSVQoaWR4 KTsNCj4gPiArDQo+ID4gKyAgICAgaW50ZW5fb2ZmID0gUE1JTlRFTkNMUiArICg0ICogcmVnX2lk KTsNCj4gPiArICAgICBjbnRlbl9vZmYgPSBQTUNOVEVOQ0xSICsgKDQgKiByZWdfaWQpOw0KPiA+ ICsNCj4gPiArICAgICB3cml0ZWwoQklUKHJlZ19iaXQpLCBjc3BtdS0+YmFzZTAgKyBjbnRlbl9v ZmYpOw0KPiA+ICsgICAgIHdyaXRlbChCSVQocmVnX2JpdCksIGNzcG11LT5iYXNlMCArIGludGVu X29mZik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIGFybV9jc3BtdV9ldmVudF91 cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ID4gKyAgICAgc3RydWN0 IGFybV9jc3BtdSAqY3NwbXUgPSB0b19hcm1fY3NwbXUoZXZlbnQtPnBtdSk7DQo+ID4gKyAgICAg c3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7DQo+ID4gKyAgICAgdTY0IGRl bHRhLCBwcmV2LCBub3c7DQo+ID4gKw0KPiA+ICsgICAgIGRvIHsNCj4gPiArICAgICAgICAgICAg IHByZXYgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7DQo+ID4gKyAgICAgICAgICAg ICBub3cgPSBhcm1fY3NwbXVfcmVhZF9jb3VudGVyKGV2ZW50KTsNCj4gPiArICAgICB9IHdoaWxl IChsb2NhbDY0X2NtcHhjaGcoJmh3Yy0+cHJldl9jb3VudCwgcHJldiwgbm93KSAhPSBwcmV2KTsN Cj4gPiArDQo+ID4gKyAgICAgZGVsdGEgPSAobm93IC0gcHJldikgJiBjb3VudGVyX21hc2soY3Nw bXUpOw0KPiA+ICsgICAgIGxvY2FsNjRfYWRkKGRlbHRhLCAmZXZlbnQtPmNvdW50KTsNCj4gPiAr fQ0KPiA+ICsNCj4gPiArc3RhdGljIGlubGluZSB2b2lkIGFybV9jc3BtdV9zZXRfZXZlbnQoc3Ry dWN0IGFybV9jc3BtdSAqY3NwbXUsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjKQ0KPiA+ICt7DQo+ID4gKyAgICAgdTMy IG9mZnNldCA9IFBNRVZUWVBFUiArICg0ICogaHdjLT5pZHgpOw0KPiA+ICsNCj4gPiArICAgICB3 cml0ZWwoaHdjLT5jb25maWcsIGNzcG11LT5iYXNlMCArIG9mZnNldCk7DQo+ID4gK30NCj4gPiAr DQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm1fY3NwbXVfc2V0X2V2X2ZpbHRlcihzdHJ1Y3Qg YXJtX2NzcG11ICpjc3BtdSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsDQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1MzIgZmlsdGVyKQ0KPiA+ICt7DQo+ID4gKyAgICAgdTMy IG9mZnNldCA9IFBNRVZGSUxUUiArICg0ICogaHdjLT5pZHgpOw0KPiA+ICsNCj4gPiArICAgICB3 cml0ZWwoZmlsdGVyLCBjc3BtdS0+YmFzZTAgKyBvZmZzZXQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICtzdGF0aWMgaW5saW5lIHZvaWQgYXJtX2NzcG11X3NldF9jY19maWx0ZXIoc3RydWN0IGFybV9j c3BtdSAqY3NwbXUsIHUzMg0KPiBmaWx0ZXIpDQo+ID4gK3sNCj4gPiArICAgICB1MzIgb2Zmc2V0 ID0gUE1DQ0ZJTFRSOw0KPiA+ICsNCj4gPiArICAgICB3cml0ZWwoZmlsdGVyLCBjc3BtdS0+YmFz ZTAgKyBvZmZzZXQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBhcm1fY3NwbXVf c3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgcG11X2ZsYWdzKQ0KPiA+ICt7DQo+ ID4gKyAgICAgc3RydWN0IGFybV9jc3BtdSAqY3NwbXUgPSB0b19hcm1fY3NwbXUoZXZlbnQtPnBt dSk7DQo+ID4gKyAgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7DQo+ ID4gKyAgICAgdTMyIGZpbHRlcjsNCj4gPiArDQo+ID4gKyAgICAgLyogV2UgYWx3YXlzIHJlcHJv Z3JhbSB0aGUgY291bnRlciAqLw0KPiA+ICsgICAgIGlmIChwbXVfZmxhZ3MgJiBQRVJGX0VGX1JF TE9BRCkNCj4gPiArICAgICAgICAgICAgIFdBUk5fT04oIShod2MtPnN0YXRlICYgUEVSRl9IRVNf VVBUT0RBVEUpKTsNCj4gPiArDQo+ID4gKyAgICAgYXJtX2NzcG11X3NldF9ldmVudF9wZXJpb2Qo ZXZlbnQpOw0KPiA+ICsNCj4gPiArICAgICBmaWx0ZXIgPSBjc3BtdS0+aW1wbC5vcHMuZXZlbnRf ZmlsdGVyKGV2ZW50KTsNCj4gPiArDQo+ID4gKyAgICAgaWYgKGV2ZW50LT5ody5leHRyYV9yZWcu aWR4ID09IGNzcG11LT5jeWNsZV9jb3VudGVyX2xvZ2ljYWxfaWR4KSB7DQo+ID4gKyAgICAgICAg ICAgICBhcm1fY3NwbXVfc2V0X2NjX2ZpbHRlcihjc3BtdSwgZmlsdGVyKTsNCj4gPiArICAgICB9 IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgYXJtX2NzcG11X3NldF9ldmVudChjc3BtdSwgaHdj KTsNCj4gPiArICAgICAgICAgICAgIGFybV9jc3BtdV9zZXRfZXZfZmlsdGVyKGNzcG11LCBod2Ms IGZpbHRlcik7DQo+ID4gKyAgICAgfQ0KPiA+ICsNCj4gPiArICAgICBod2MtPnN0YXRlID0gMDsN Cj4gPiArDQo+ID4gKyAgICAgYXJtX2NzcG11X2VuYWJsZV9jb3VudGVyKGNzcG11LCBod2MtPmlk eCk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIGFybV9jc3BtdV9zdG9wKHN0cnVj dCBwZXJmX2V2ZW50ICpldmVudCwgaW50IHBtdV9mbGFncykNCj4gPiArew0KPiA+ICsgICAgIHN0 cnVjdCBhcm1fY3NwbXUgKmNzcG11ID0gdG9fYXJtX2NzcG11KGV2ZW50LT5wbXUpOw0KPiA+ICsg ICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3Ow0KPiA+ICsNCj4gPiAr ICAgICBpZiAoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpDQo+ID4gKyAgICAgICAgICAg ICByZXR1cm47DQo+ID4gKw0KPiA+ICsgICAgIGFybV9jc3BtdV9kaXNhYmxlX2NvdW50ZXIoY3Nw bXUsIGh3Yy0+aWR4KTsNCj4gPiArICAgICBhcm1fY3NwbXVfZXZlbnRfdXBkYXRlKGV2ZW50KTsN Cj4gPiArDQo+ID4gKyAgICAgaHdjLT5zdGF0ZSB8PSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9I RVNfVVBUT0RBVEU7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdTMyIHRvX3Bo eXNfaWR4KHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11LCB1MzIgaWR4KQ0KPiA+ICt7DQo+ID4gKyAg ICAgcmV0dXJuIChpZHggPT0gY3NwbXUtPmN5Y2xlX2NvdW50ZXJfbG9naWNhbF9pZHgpID8NCj4g PiArICAgICAgICAgICAgIEFSTV9DU1BNVV9DWUNMRV9DTlRSX0lEWCA6IGlkeDsNCj4gPiArfQ0K PiA+ICsNCj4gPiArc3RhdGljIGludCBhcm1fY3NwbXVfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpl dmVudCwgaW50IGZsYWdzKQ0KPiA+ICt7DQo+ID4gKyAgICAgc3RydWN0IGFybV9jc3BtdSAqY3Nw bXUgPSB0b19hcm1fY3NwbXUoZXZlbnQtPnBtdSk7DQo+ID4gKyAgICAgc3RydWN0IGFybV9jc3Bt dV9od19ldmVudHMgKmh3X2V2ZW50cyA9ICZjc3BtdS0+aHdfZXZlbnRzOw0KPiA+ICsgICAgIHN0 cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3Ow0KPiA+ICsgICAgIGludCBpZHg7 DQo+ID4gKw0KPiA+ICsgICAgIGlmIChXQVJOX09OX09OQ0UoIWNwdW1hc2tfdGVzdF9jcHUoc21w X3Byb2Nlc3Nvcl9pZCgpLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJmNzcG11LT5hc3NvY2lhdGVkX2NwdXMpKSkNCj4gPiArICAgICAgICAgICAgIHJldHVy biAtRU5PRU5UOw0KPiA+ICsNCj4gPiArICAgICBpZHggPSBhcm1fY3NwbXVfZ2V0X2V2ZW50X2lk eChod19ldmVudHMsIGV2ZW50KTsNCj4gPiArICAgICBpZiAoaWR4IDwgMCkNCj4gPiArICAgICAg ICAgICAgIHJldHVybiBpZHg7DQo+ID4gKw0KPiA+ICsgICAgIGh3X2V2ZW50cy0+ZXZlbnRzW2lk eF0gPSBldmVudDsNCj4gPiArICAgICBod2MtPmlkeCA9IHRvX3BoeXNfaWR4KGNzcG11LCBpZHgp Ow0KPiA+ICsgICAgIGh3Yy0+ZXh0cmFfcmVnLmlkeCA9IGlkeDsNCj4gPiArICAgICBod2MtPnN0 YXRlID0gUEVSRl9IRVNfU1RPUFBFRCB8IFBFUkZfSEVTX1VQVE9EQVRFOw0KPiA+ICsNCj4gPiAr ICAgICBpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQ0KPiA+ICsgICAgICAgICAgICAgYXJtX2Nz cG11X3N0YXJ0KGV2ZW50LCBQRVJGX0VGX1JFTE9BRCk7DQo+ID4gKw0KPiA+ICsgICAgIC8qIFBy b3BhZ2F0ZSBjaGFuZ2VzIHRvIHRoZSB1c2Vyc3BhY2UgbWFwcGluZy4gKi8NCj4gPiArICAgICBw ZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7DQo+ID4gKw0KPiA+ICsgICAgIHJldHVy biAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBhcm1fY3NwbXVfZGVsKHN0cnVj dCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQ0KPiA+ICt7DQo+ID4gKyAgICAgc3RydWN0 IGFybV9jc3BtdSAqY3NwbXUgPSB0b19hcm1fY3NwbXUoZXZlbnQtPnBtdSk7DQo+ID4gKyAgICAg c3RydWN0IGFybV9jc3BtdV9od19ldmVudHMgKmh3X2V2ZW50cyA9ICZjc3BtdS0+aHdfZXZlbnRz Ow0KPiA+ICsgICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3Ow0KPiA+ ICsgICAgIGludCBpZHggPSBod2MtPmV4dHJhX3JlZy5pZHg7DQo+ID4gKw0KPiA+ICsgICAgIGFy bV9jc3BtdV9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7DQo+ID4gKw0KPiA+ICsgICAgIGh3 X2V2ZW50cy0+ZXZlbnRzW2lkeF0gPSBOVUxMOw0KPiA+ICsNCj4gPiArICAgICBjbGVhcl9iaXQo aWR4LCBod19ldmVudHMtPnVzZWRfY3Rycyk7DQo+ID4gKw0KPiA+ICsgICAgIHBlcmZfZXZlbnRf dXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQg YXJtX2NzcG11X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQ0KPiA+ICt7DQo+ID4gKyAg ICAgYXJtX2NzcG11X2V2ZW50X3VwZGF0ZShldmVudCk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0 YXRpYyBzdHJ1Y3QgYXJtX2NzcG11ICphcm1fY3NwbXVfYWxsb2Moc3RydWN0IHBsYXRmb3JtX2Rl dmljZQ0KPiAqcGRldikNCj4gPiArew0KPiA+ICsgICAgIHN0cnVjdCBhY3BpX2FwbXRfbm9kZSAq YXBtdF9ub2RlOw0KPiA+ICsgICAgIHN0cnVjdCBhcm1fY3NwbXUgKmNzcG11Ow0KPiA+ICsgICAg IHN0cnVjdCBkZXZpY2UgKmRldjsNCj4gPiArDQo+ID4gKyAgICAgZGV2ID0gJnBkZXYtPmRldjsN Cj4gPiArICAgICBhcG10X25vZGUgPSAqKHN0cnVjdCBhY3BpX2FwbXRfbm9kZSAqKilkZXZfZ2V0 X3BsYXRkYXRhKGRldik7DQo+ID4gKyAgICAgaWYgKCFhcG10X25vZGUpIHsNCj4gPiArICAgICAg ICAgICAgIGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBBUE1UIG5vZGVcbiIpOw0KPiA+ICsg ICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQo+ID4gKyAgICAgfQ0KPiA+ICsNCj4gPiArICAgICBj c3BtdSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY3NwbXUpLCBHRlBfS0VSTkVMKTsNCj4g PiArICAgICBpZiAoIWNzcG11KQ0KPiA+ICsgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQo+ID4g Kw0KPiA+ICsgICAgIGNzcG11LT5kZXYgPSBkZXY7DQo+ID4gKyAgICAgY3NwbXUtPmFwbXRfbm9k ZSA9IGFwbXRfbm9kZTsNCj4gPiArDQo+ID4gKyAgICAgcGxhdGZvcm1fc2V0X2RydmRhdGEocGRl diwgY3NwbXUpOw0KPiA+ICsNCj4gPiArICAgICByZXR1cm4gY3NwbXU7DQo+ID4gK30NCj4gPiAr DQo+ID4gK3N0YXRpYyBpbnQgYXJtX2NzcG11X2luaXRfbW1pbyhzdHJ1Y3QgYXJtX2NzcG11ICpj c3BtdSkNCj4gPiArew0KPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldjsNCj4gPiArICAgICBz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Ow0KPiA+ICsgICAgIHN0cnVjdCBhY3BpX2FwbXRf bm9kZSAqYXBtdF9ub2RlOw0KPiA+ICsNCj4gPiArICAgICBkZXYgPSBjc3BtdS0+ZGV2Ow0KPiA+ ICsgICAgIHBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsNCj4gPiArICAgICBhcG10X25v ZGUgPSBjc3BtdS0+YXBtdF9ub2RlOw0KPiA+ICsNCj4gPiArICAgICAvKiBCYXNlIGFkZHJlc3Mg Zm9yIHBhZ2UgMC4gKi8NCj4gPiArICAgICBjc3BtdS0+YmFzZTAgPSBkZXZtX3BsYXRmb3JtX2lv cmVtYXBfcmVzb3VyY2UocGRldiwgMCk7DQo+ID4gKyAgICAgaWYgKElTX0VSUihjc3BtdS0+YmFz ZTApKSB7DQo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKGRldiwgImlvcmVtYXAgZmFpbGVkIGZv ciBwYWdlLTAgcmVzb3VyY2VcbiIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIo Y3NwbXUtPmJhc2UwKTsNCj4gPiArICAgICB9DQo+ID4gKw0KPiA+ICsgICAgIC8qIEJhc2UgYWRk cmVzcyBmb3IgcGFnZSAxIGlmIHN1cHBvcnRlZC4gT3RoZXJ3aXNlIHBvaW50IHRvIHBhZ2UgMC4g Ki8NCj4gPiArICAgICBjc3BtdS0+YmFzZTEgPSBjc3BtdS0+YmFzZTA7DQo+ID4gKyAgICAgaWYg KENIRUNLX0FQTVRfRkxBRyhhcG10X25vZGUtPmZsYWdzLCBEVUFMX1BBR0UsIFNVUFApKSB7DQo+ ID4gKyAgICAgICAgICAgICBjc3BtdS0+YmFzZTEgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVz b3VyY2UocGRldiwgMSk7DQo+ID4gKyAgICAgICAgICAgICBpZiAoSVNfRVJSKGNzcG11LT5iYXNl MSkpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgZGV2X2VycihkZXYsICJpb3JlbWFwIGZh aWxlZCBmb3IgcGFnZS0xIHJlc291cmNlXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIFBUUl9FUlIoY3NwbXUtPmJhc2UxKTsNCj4gPiArICAgICAgICAgICAgIH0NCj4gPiAr ICAgICB9DQo+ID4gKw0KPiA+ICsgICAgIGNzcG11LT5wbWNmZ3IgPSByZWFkbChjc3BtdS0+YmFz ZTAgKyBQTUNGR1IpOw0KPiA+ICsNCj4gPiArICAgICBjc3BtdS0+bnVtX2xvZ2ljYWxfY3RycyA9 IEZJRUxEX0dFVChQTUNGR1JfTiwgY3NwbXUtPnBtY2ZncikgKw0KPiAxOw0KPiA+ICsNCj4gPiAr ICAgICBjc3BtdS0+Y3ljbGVfY291bnRlcl9sb2dpY2FsX2lkeCA9IEFSTV9DU1BNVV9NQVhfSFdf Q05UUlM7DQo+ID4gKw0KPiA+ICsgICAgIGlmIChzdXBwb3J0c19jeWNsZV9jb3VudGVyKGNzcG11 KSkgew0KPiA+ICsgICAgICAgICAgICAgLyoNCj4gPiArICAgICAgICAgICAgICAqIFRoZSBsYXN0 IGxvZ2ljYWwgY291bnRlciBpcyBtYXBwZWQgdG8gY3ljbGUgY291bnRlciBpZg0KPiA+ICsgICAg ICAgICAgICAgICogdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiByZWd1bGFyIGFuZCBjeWNsZSBjb3Vu dGVyLiBPdGhlcndpc2UsDQo+ID4gKyAgICAgICAgICAgICAgKiBsb2dpY2FsIGFuZCBwaHlzaWNh bCBoYXZlIDEtdG8tMSBtYXBwaW5nLg0KPiA+ICsgICAgICAgICAgICAgICovDQo+ID4gKyAgICAg ICAgICAgICBjc3BtdS0+Y3ljbGVfY291bnRlcl9sb2dpY2FsX2lkeCA9DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIChjc3BtdS0+bnVtX2xvZ2ljYWxfY3RycyA8PSBBUk1fQ1NQTVVfQ1lDTEVf Q05UUl9JRFgpDQo+ID8NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3BtdS0+ bnVtX2xvZ2ljYWxfY3RycyAtIDEgOg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEFSTV9DU1BNVV9DWUNMRV9DTlRSX0lEWDsNCj4gPiArICAgICB9DQo+ID4gKw0KPiA+ICsgICAg IGNzcG11LT5udW1fc2V0X2Nscl9yZWcgPQ0KPiA+ICsgICAgICAgICAgICAgRElWX1JPVU5EX1VQ KGNzcG11LT5udW1fbG9naWNhbF9jdHJzLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFSTV9DU1BNVV9TRVRfQ0xSX0NPVU5URVJfTlVNKTsNCj4gPiArDQo+ID4gKyAgICAgY3Nw bXUtPmh3X2V2ZW50cy5ldmVudHMgPQ0KPiA+ICsgICAgICAgICAgICAgZGV2bV9rY2FsbG9jKGRl diwgY3NwbXUtPm51bV9sb2dpY2FsX2N0cnMsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZW9mKCpjc3BtdS0+aHdfZXZlbnRzLmV2ZW50cyksIEdGUF9LRVJORUwpOw0KPiA+ICsN Cj4gPiArICAgICBpZiAoIWNzcG11LT5od19ldmVudHMuZXZlbnRzKQ0KPiA+ICsgICAgICAgICAg ICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKw0KPiA+ICsgICAgIHJldHVybiAwOw0KPiA+ICt9DQo+ ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIGludCBhcm1fY3NwbXVfZ2V0X3Jlc2V0X292ZXJmbG93 KHN0cnVjdCBhcm1fY3NwbXUNCj4gKmNzcG11LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHUzMiAqcG1vdnMpDQo+ID4gK3sNCj4gPiArICAgICBpbnQg aTsNCj4gPiArICAgICB1MzIgcG1vdmNscl9vZmZzZXQgPSBQTU9WU0NMUjsNCj4gPiArICAgICB1 MzIgaGFzX292ZXJmbG93ZWQgPSAwOw0KPiA+ICsNCj4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwg Y3NwbXUtPm51bV9zZXRfY2xyX3JlZzsgKytpKSB7DQo+ID4gKyAgICAgICAgICAgICBwbW92c1tp XSA9IHJlYWRsKGNzcG11LT5iYXNlMSArIHBtb3ZjbHJfb2Zmc2V0KTsNCj4gPiArICAgICAgICAg ICAgIGhhc19vdmVyZmxvd2VkIHw9IHBtb3ZzW2ldOw0KPiA+ICsgICAgICAgICAgICAgd3JpdGVs KHBtb3ZzW2ldLCBjc3BtdS0+YmFzZTEgKyBwbW92Y2xyX29mZnNldCk7DQo+ID4gKyAgICAgICAg ICAgICBwbW92Y2xyX29mZnNldCArPSBzaXplb2YodTMyKTsNCj4gPiArICAgICB9DQo+ID4gKw0K PiA+ICsgICAgIHJldHVybiBoYXNfb3ZlcmZsb3dlZCAhPSAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICtzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX2NzcG11X2hhbmRsZV9pcnEoaW50IGlycV9udW0sIHZv aWQgKmRldikNCj4gPiArew0KPiA+ICsgICAgIGludCBpZHgsIGhhc19vdmVyZmxvd2VkOw0KPiA+ ICsgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsNCj4gPiArICAgICBzdHJ1Y3QgYXJtX2Nz cG11ICpjc3BtdSA9IGRldjsNCj4gPiArICAgICB1MzIgcG1vdnNbQVJNX0NTUE1VX1NFVF9DTFJf TUFYX05VTV0gPSB7IDAgfTsNCj4gDQo+IG5pdDogQ291bGQgd2Ugbm90IHJldXNlIHdoYXQgd2Ug ZG8gZm9yIGh3X2V2ZW50cy51c2VfY3RycyA/DQo+IA0KPiBpLmUsIERFQ0xBUkVfQklUTUFQKHBt b3ZzLCBBUk1fQ1NQTVVfTUFYX0hXX0NOVFJTKQ0KPiANCj4gDQo+IEFuZCByZW1vdmUgQVJNX0NT UE1VX1NFVF9DTFJfTUFYX05VTSBhbHRvZ2V0aGVyIGFuZCB0aGUgY2FzdA0KPiBiZWxvdw0KPiB0 byAodW5zaWduZWQgbG9uZyAqKS4NCj4gDQoNClN1cmUsIEkgd2lsbCB1cGRhdGUgdGhlIHBhdGNo IHdpdGggeW91ciBzdWdnZXN0aW9uLg0KDQo+IFdpdGggdGhhdA0KPiANCj4gUmV2aWV3ZWQtYnk6 IFN1enVraSBLIFBvdWxvc2UgPHN1enVraS5wb3Vsb3NlQGFybS5jb20+DQo+IA0KDQpUaGFua3Mh DQoNCj4gU3V6dWtpDQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 458CBC07E9D for ; Wed, 28 Sep 2022 01:29:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:In-Reply-To:References: Message-ID:Date:Subject:CC:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=sAgmZxWlnJodmj2d48GwgTzDDk2bmDdSd69yhJzKif4=; b=oYXgF0sGa3iRel YoE1/GH2cQd2QCka/8SoOACiNiiFY42Q+kpZV/e8kkSldxWEuyofjY46tXLBeRQPcxZUTCku8VnL4 AE5pZPsshkCpIOx90C4nbC8UsUNUlw4GCZek3EFjldsQmxihoWzMVvs7WCDHZQsznoAwTwGpfD67X 5qLinVFNfeREfh7tdIjpOTbJqBS2i3iM5hN2P3+/SR1dpwEqjhE0g20GcmpoOv/8LGAbUlN1LnqD8 R3cXE5zpDG2uL+s5vDydafvMX6LIaXTATGCBv9OKSXBoXQVAnp1iMIwZ59VEyMhQvhY1u/p00aiZX dkT4nZMOVTKsooqlr0UA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1odLr2-00DR5G-Gz; Wed, 28 Sep 2022 01:27:16 +0000 Received: from mail-mw2nam10on2081.outbound.protection.outlook.com ([40.107.94.81] helo=NAM10-MW2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1odLqv-00DR4o-U0 for linux-arm-kernel@lists.infradead.org; Wed, 28 Sep 2022 01:27:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PjYARG0+NMub8bKXLwF8jZ2r6RSuh1SYBdRjupGt4bOQXBpVTUFDI5H4yKXTtp0g8qa/Zu/SYbEu4QMMa2whNF5MB2Vxw27j1/6OqF4vtNy4F/C42wjcKLADl8/NbEwx6th25BTelis5tX2AvQSM3U4eXiVzPdBFf/lmxC7eJhIDQT7ItV49UFKDpTzuRMDS/uo9QV/LJdGa88AjULCn1pJbu9oeCtd8rCZbEdExjmaMKnhB21OOFflMZqZigt7rhnu1WkARjEOCewp4tYhmqQGTgnRS3RoStCbbo9PdL/szrXCYXoVl1KbmZdedmkGAgvyK/wXvZDEXO7tEzMo31Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1RYCOeO9hFWqrBdzvha751IMmg60pRt14ymdnHbnxFA=; b=XsGkxgUs9OvLVIzTkM9vouLjWrPha80UGRtYftQ5WIv/e6HhZAc9D17BNsx3qZ7HabHMCqPmeufR/6SfoECTXyw07FwPX8nc4tHjRDaX2OX47Z6pkwKuOwko/6HOx5aOOK4yQT2Bswe5bq0xF55WyZs5qgEsJTld/5RLmwA0mh5X0zE0dUwCNrWc0PYFL/LHpIk2oIvlSS8Eme7Ra0eF535GlUVnZAZnabCioDudLvrktfBfx7WUMm+tsgWpbZMljlw+XRqMCfGSgfPBIVpRgi+qAl4YllItEcE8DSg+89NvvPHnuFF+xLmYaVmMyNVZHkNAEe2+LG46caZdA7kuNA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1RYCOeO9hFWqrBdzvha751IMmg60pRt14ymdnHbnxFA=; b=NKq9HAW7M05/8PHZZQz+YFpoadhMW8yVfoEQv9XO4gvVDrkLOXoC8V+7lJxzfg2BRtnHfSnbMLVS3xV17eeLfPwmhTB6QvFYc/rymnJE3T8z/ub0YaEoJ6xuwTOjx3Q14uhYtbaevDlIm99Z9AvMmIhIWBiCUOKhkdCzlYvXBV3Y3fWh4x0Vo2rBQ4VpPtvQWhPiKopFhIEwgd78+3VGHlW4Z+MHkATn0zGfIjh7YPTBmS7PTd46lR6KHMvS3fJ6pdhArUBFSfXJklcDyDlb7DtPrteLpbuDL+cF7Swc00of/algwwiCIhcVbj9eDKAhl+TE79TSeOau01wGnwe5/Q== Received: from SJ0PR12MB5676.namprd12.prod.outlook.com (2603:10b6:a03:42e::8) by SJ0PR12MB7065.namprd12.prod.outlook.com (2603:10b6:a03:4ae::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5654.26; Wed, 28 Sep 2022 01:27:04 +0000 Received: from SJ0PR12MB5676.namprd12.prod.outlook.com ([fe80::3c98:4af6:e849:aa5]) by SJ0PR12MB5676.namprd12.prod.outlook.com ([fe80::3c98:4af6:e849:aa5%5]) with mapi id 15.20.5654.024; Wed, 28 Sep 2022 01:27:04 +0000 From: Besar Wicaksono To: Suzuki K Poulose , "robin.murphy@arm.com" , "catalin.marinas@arm.com" , "will@kernel.org" , "mark.rutland@arm.com" CC: "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-tegra@vger.kernel.org" , "sudeep.holla@arm.com" , "thanu.rangarajan@arm.com" , "Michael.Williams@arm.com" , Thierry Reding , Jonathan Hunter , Vikram Sethi , "mathieu.poirier@linaro.org" , "mike.leach@linaro.org" , "leo.yan@linaro.org" Subject: RE: [PATCH v4 1/2] perf: arm_cspmu: Add support for ARM CoreSight PMU driver Thread-Topic: [PATCH v4 1/2] perf: arm_cspmu: Add support for ARM CoreSight PMU driver Thread-Index: AQHYsAscx+1Do35BjUm/Kr4IwLOFta3za4EAgADmhAA= Date: Wed, 28 Sep 2022 01:27:04 +0000 Message-ID: References: <20220814182351.8861-1-bwicaksono@nvidia.com> <20220814182351.8861-2-bwicaksono@nvidia.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SJ0PR12MB5676:EE_|SJ0PR12MB7065:EE_ x-ms-office365-filtering-correlation-id: abe9cc89-bb8b-4cc0-0ea4-08daa0f08ccd x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: FMWYkbd40lfPxfZFm/GIc/dKCw19GbPE9FZjB0t185qGbAtzx0uFD/zI0kwj8rUAoaG/bkX4SE7S4EvImIkzNyPKAkOBNpyPCWyb1yTmU85LoBvjvWGpRBh2888iE1cTEOr/LGO0peZhJxTNzuGnb37ffWSSTgCg8MMw15/KO0ou7hYOPvXaO0wK/l+yoUEhx2wBPNSYHLDvPCrMfJdGfPlLNDdvZagpcqAt0q2LVz8iO+pFuYk+T1RUH0sR0brz0lI/pr/yHq40Jjd9fcPeq5HmzIx37+ImCU/LTrlNE/+VAZSpQF5/8q2dwsA+PrC8hELqqGKLYbeeBB9p9PnQNNMH6BkH7j9tIyP4+B1YHgQT3zbzecXPCA9O2E5SIgFDevk3U9V96Nt65Ie3kwARZa5oIaBi6iIZncV/nhEKfzImj3XAK7oJm5hqpXePYPuxy8Srlh1BpQyr5rWZEw+5rH8v9gl+gPUur7jN+pjSiH2FCTxVnPg+yRlV5BAMoh6WjOQsqsGFizWA8ogWmZIlvVtrYdHDng6UNF4i67BdMC8CRO3PHKr8y0BKNO+r3FUI/CW4JkK1ecOcPZwhA2StCNArgy/YEfe2O7a5sBaPdX9znMLuG2OE2U0MLfO7SvQ15/UwFCDQhkuhtgzloF3NrfEdGW5OZxR5YpwEl2gHQNdxCXGS9s04uEh0pv8meurM8bVvK1Zc+ZgjsVHlugCmM0u38epzGRQkU9y/mulxr5dnDyZTMlfzFAUBxM6VcdUAi53gFI8VdshuPyfud1xhseyB5PikqCmDnka/lMHzoJqhFwPmf/WGv4ualmv1p6GdHslqnMfAIaET9RTLiDeVMTi4kEd/T8755Uw+nie4/fmxGeFeNR7Dhrs0YpzBGU+mz3gr+3ZHTf1KAfs1FZBGiw== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR12MB5676.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(346002)(366004)(376002)(396003)(39860400002)(136003)(451199015)(7696005)(54906003)(110136005)(122000001)(33656002)(2906002)(7416002)(86362001)(52536014)(4326008)(186003)(41300700001)(64756008)(66946007)(38070700005)(30864003)(5660300002)(76116006)(8676002)(66476007)(66556008)(9686003)(26005)(66446008)(316002)(8936002)(6506007)(53546011)(38100700002)(83380400001)(478600001)(55016003)(966005)(71200400001)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?RWhGMzBuN1lSelZYY2lFdUs2MG9FclBOWVNWS2dOSEc5bGlWSHB0eitqSzJ3?= =?utf-8?B?dCtSNlJ6dUZvUjc3ZkcrNllVWkdVa0hBeEhGY001ME5HUHhuc1VzVXYyMTYz?= =?utf-8?B?Rms0VUlTT2pGdFBrMW5DM0REd2lHMEUycGRheDYrTnJJeGpRQk9VTlN3RGlJ?= =?utf-8?B?M1JXdlN5TU9oZWxHK1o1YWg3U3YyTndkR3VCZnI3ZEdNVWxYdG1pdTJJZ2F0?= =?utf-8?B?U2xZa2FQVUgrWG9yM3JZOTM2dTFOcm9vOXV1VXRjMlRLbk9oSXA0Y0dwQ3VF?= =?utf-8?B?QW14enR3dzV6aDJENWhMcnRFMDM4QmZoSHZCQWxFVUNTc0JLNzMzZmdZQnpn?= =?utf-8?B?dUd3YzBzaEJRQUQ4KzNkMkdTSzBTT0d5V010L2RhY1kvYU00bFduUEI1NnRG?= =?utf-8?B?SWxseVJ1bXBLSzN4dXdCWEUyWnlvWmRwWXhTWWJkSDZkcG9wK3kwTmZFN0FP?= =?utf-8?B?YkdDUytZYTBRdjZyRTZNVjliV1JUWjQxSzFUdG1ZMWZ3NDZhM2UyWDFPSWRh?= =?utf-8?B?N0ZsanpwYS9uSW9INzhrZndlcXpBcDA1Z25ZeTliQTdOOGtrSDQ3eWgrcTc0?= =?utf-8?B?NmorS29ZdFNtUUpPQlpIb3MwS1FKWS9STUxqVmc3dTlrb3kvREZMZ2pKc095?= =?utf-8?B?cXNvV1UwbzR5QmNIdEU3S052cXFZOU9aMzg5eHp2SjZIS2pocWdnbG1STHJ0?= =?utf-8?B?VmxWTkV0aUFjS1JjK1hOZWtpV3BRbjVPZGpCeFQrOGlhYXV4dGFDRGpSRWVP?= =?utf-8?B?RXRNajVlTzJQK285T2R1MWRZN0hyNW5HbVRHc1JPbkJINmpCTFIxbnlWTkRl?= =?utf-8?B?ZGZWWFN0YTE3MXh2bWltd1pQMlNsdkNJRkp5am9sdWZpQzd5RHVES0xZbUNM?= =?utf-8?B?VGE0V2V5di8wNDQ1TTA0UWVoVmtiUnVTb1BxMldIWnlUQ2hscFBPMmtFRis2?= =?utf-8?B?dnE5VUlKY0VwTG5zakFuR2kzeENsTVhubnlRUEEvelFZWTNmMDcvbVpEU01W?= =?utf-8?B?ZTdTMGNxc2hHWWVuaVhOR20yUG9FSURyZDZGSjI5RVppdGszK0V4dEdBRHhB?= =?utf-8?B?MU5ETU1MaXFxOXdDVHRUS0w2OXZxMkRKa0JUQUg5SUtJYzVGbW1UWHdtSElw?= =?utf-8?B?amFnVmNmUUxpM3EzSGlBTVFtckgzSERKR0dxeFRtdzJMSWJRaWlTenFhRHov?= =?utf-8?B?TFZWMWhPcXdtU1UwOGlycmk1WmFjdUdyTEw1NmRyMlpoVWhRQ00zZldjTjFI?= =?utf-8?B?Vk5LSHNrTEJ6aFFRcjk2aTlkSmlVQ0Vyc212STRvcUhMWHZDbGVIb3Vydm5t?= =?utf-8?B?S3JEemRqWVEyQzczdGJvR2YxVUY2bEJlaVh6WkxZa2QzV3pMY0JNTXE3bHE0?= =?utf-8?B?dlp5RWFwMkNzSTV5ekdkcGFyK3VSTXpzcE9pem4zVUJYTXFURWpaS2VSOXRP?= =?utf-8?B?dFRXYVZ3YXVSWlo4S0x5TUNob2JveXFWa1BmRzhlYW1wS0hEV0o1QlJSSFlT?= =?utf-8?B?MWxEaWVoSGRsM253MGc0enYzbU5VVkhzckNEQU5TL0lRanJnVlZTaHRtQUJp?= =?utf-8?B?d25QdTg5UUhMaU42WFV0SlZtY3N4OU45WHlTd0NmVjRXR2hITHgrc3RKT1Jt?= =?utf-8?B?QWRzYjdmTm1seDdlTGo5dmpYbncyVEM0bHVTUEtCZVZMYzJFNVRpNUZTNzBH?= =?utf-8?B?MFRHd2E0UzRZNEJnczZBdW1oY2dEWFAvVzZlT2tqaVFvOXJ6bmNPMTJhQytD?= =?utf-8?B?LzFSTkV6aDFVWXBJODdmOTBkSXJSSXJodTg0TE00TjY0RWVtZW1MS3dTZkQy?= =?utf-8?B?QTBwKytoVkVROUZJOEQyZEZUNVh4SU9zdWVMNGNTcXJMYnBDeUJkWm1DK1BW?= =?utf-8?B?Q0crOERIb3hjUDV2WWFrUUI0cER5TzV0a25FcnFmcCt3OFlJUVRuWGZXTlJK?= =?utf-8?B?YmZjT2lVUXczVzU3S0xOR2hpRlQ0bm5OVG9UV2xKZDJpay9DaUpESHk5NFpv?= =?utf-8?B?OS9TbWV2KytTU2I5cWRlcEpHS1BRcWJtSWVVMExBNkR6NkE1NHJ4aFVUOGpl?= =?utf-8?B?RnplTmJvYkZleG16Sm9xNW1qNXNuaHZEbjVyMkhKTWxTSE1xcE1RQXl6SXpK?= =?utf-8?Q?SYDE4PZeF3XZLTa71T9QmPuHm?= MIME-Version: 1.0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SJ0PR12MB5676.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: abe9cc89-bb8b-4cc0-0ea4-08daa0f08ccd X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Sep 2022 01:27:04.0878 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: gT7HuA2l9barJUD8/le9DEYo7/nHkWztJTBlT/VGCheWDcf5J5T89kiuCEfcvFFMVjKuh/lzy5nbpdV8+tayyg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB7065 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220927_182710_091684_36ADEE80 X-CRM114-Status: GOOD ( 24.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org > -----Original Message----- > From: Suzuki K Poulose > Sent: Tuesday, September 27, 2022 6:39 AM > To: Besar Wicaksono ; robin.murphy@arm.com; > catalin.marinas@arm.com; will@kernel.org; mark.rutland@arm.com > Cc: linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > linux-tegra@vger.kernel.org; sudeep.holla@arm.com; > thanu.rangarajan@arm.com; Michael.Williams@arm.com; Thierry Reding > ; Jonathan Hunter ; Vikram > Sethi ; mathieu.poirier@linaro.org; > mike.leach@linaro.org; leo.yan@linaro.org > Subject: Re: [PATCH v4 1/2] perf: arm_cspmu: Add support for ARM > CoreSight PMU driver > > External email: Use caution opening links or attachments > > > On 14/08/2022 19:23, Besar Wicaksono wrote: > > Add support for ARM CoreSight PMU driver framework and interfaces. > > The driver provides generic implementation to operate uncore PMU based > > on ARM CoreSight PMU architecture. The driver also provides interface > > to get vendor/implementation specific information, for example event > > attributes and formating. > > > > The specification used in this implementation can be found below: > > * ACPI Arm Performance Monitoring Unit table: > > https://developer.arm.com/documentation/den0117/latest > > * ARM Coresight PMU architecture: > > https://developer.arm.com/documentation/ihi0091/latest > > > > Signed-off-by: Besar Wicaksono > > --- > > arch/arm64/configs/defconfig | 1 + > > drivers/perf/Kconfig | 2 + > > drivers/perf/Makefile | 1 + > > drivers/perf/arm_cspmu/Kconfig | 13 + > > drivers/perf/arm_cspmu/Makefile | 6 + > > drivers/perf/arm_cspmu/arm_cspmu.c | 1262 > ++++++++++++++++++++++++++++ > > drivers/perf/arm_cspmu/arm_cspmu.h | 151 ++++ > > 7 files changed, 1436 insertions(+) > > create mode 100644 drivers/perf/arm_cspmu/Kconfig > > create mode 100644 drivers/perf/arm_cspmu/Makefile > > create mode 100644 drivers/perf/arm_cspmu/arm_cspmu.c > > create mode 100644 drivers/perf/arm_cspmu/arm_cspmu.h > > > > diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig > > index 7d1105343bc2..ee31c9159a5b 100644 > > --- a/arch/arm64/configs/defconfig > > +++ b/arch/arm64/configs/defconfig > > @@ -1212,6 +1212,7 @@ CONFIG_PHY_UNIPHIER_USB3=y > > CONFIG_PHY_TEGRA_XUSB=y > > CONFIG_PHY_AM654_SERDES=m > > CONFIG_PHY_J721E_WIZ=m > > +CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU=y > > CONFIG_ARM_SMMU_V3_PMU=m > > CONFIG_FSL_IMX8_DDR_PMU=m > > CONFIG_QCOM_L2_PMU=y > > diff --git a/drivers/perf/Kconfig b/drivers/perf/Kconfig > > index 1e2d69453771..c94d3601eb48 100644 > > --- a/drivers/perf/Kconfig > > +++ b/drivers/perf/Kconfig > > @@ -192,4 +192,6 @@ config MARVELL_CN10K_DDR_PMU > > Enable perf support for Marvell DDR Performance monitoring > > event on CN10K platform. > > > > +source "drivers/perf/arm_cspmu/Kconfig" > > + > > endmenu > > diff --git a/drivers/perf/Makefile b/drivers/perf/Makefile > > index 57a279c61df5..3bc9323f0965 100644 > > --- a/drivers/perf/Makefile > > +++ b/drivers/perf/Makefile > > @@ -20,3 +20,4 @@ obj-$(CONFIG_ARM_DMC620_PMU) += > arm_dmc620_pmu.o > > obj-$(CONFIG_MARVELL_CN10K_TAD_PMU) += > marvell_cn10k_tad_pmu.o > > obj-$(CONFIG_MARVELL_CN10K_DDR_PMU) += > marvell_cn10k_ddr_pmu.o > > obj-$(CONFIG_APPLE_M1_CPU_PMU) += apple_m1_cpu_pmu.o > > +obj-$(CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU) += > arm_cspmu/ > > diff --git a/drivers/perf/arm_cspmu/Kconfig > b/drivers/perf/arm_cspmu/Kconfig > > new file mode 100644 > > index 000000000000..c2c56ecafccb > > --- /dev/null > > +++ b/drivers/perf/arm_cspmu/Kconfig > > @@ -0,0 +1,13 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. > > + > > +config ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU > > + tristate "ARM Coresight Architecture PMU" > > + depends on ACPI > > + depends on ACPI_APMT || COMPILE_TEST > > + help > > + Provides support for performance monitoring unit (PMU) devices > > + based on ARM CoreSight PMU architecture. Note that this PMU > > + architecture does not have relationship with the ARM CoreSight > > + Self-Hosted Tracing. > > diff --git a/drivers/perf/arm_cspmu/Makefile > b/drivers/perf/arm_cspmu/Makefile > > new file mode 100644 > > index 000000000000..cdc3455f74d8 > > --- /dev/null > > +++ b/drivers/perf/arm_cspmu/Makefile > > @@ -0,0 +1,6 @@ > > +# Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. > > +# > > +# SPDX-License-Identifier: GPL-2.0 > > + > > +obj-$(CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU) += \ > > + arm_cspmu.o > > diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c > b/drivers/perf/arm_cspmu/arm_cspmu.c > > new file mode 100644 > > index 000000000000..410876f86eb0 > > --- /dev/null > > +++ b/drivers/perf/arm_cspmu/arm_cspmu.c > > @@ -0,0 +1,1262 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * ARM CoreSight Architecture PMU driver. > > + * > > + * This driver adds support for uncore PMU based on ARM CoreSight > Performance > > + * Monitoring Unit Architecture. The PMU is accessible via MMIO registers > and > > + * like other uncore PMUs, it does not support process specific events and > > + * cannot be used in sampling mode. > > + * > > + * This code is based on other uncore PMUs like ARM DSU PMU. It > provides a > > + * generic implementation to operate the PMU according to CoreSight > PMU > > + * architecture and ACPI ARM PMU table (APMT) documents below: > > + * - ARM CoreSight PMU architecture document number: ARM IHI 0091 > A.a-00bet0. > > + * - APMT document number: ARM DEN0117. > > + * > > + * The user should refer to the vendor technical documentation to get > details > > + * about the supported events. > > + * > > + * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. > > + * > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "arm_cspmu.h" > > + > > +#define PMUNAME "arm_cspmu" > > +#define DRVNAME "arm-cs-arch-pmu" > > + > > +#define ARM_CSPMU_CPUMASK_ATTR(_name, _config) \ > > + ARM_CSPMU_EXT_ATTR(_name, arm_cspmu_cpumask_show, \ > > + (unsigned long)_config) > > + > > +/* > > + * CoreSight PMU Arch register offsets. > > + */ > > +#define PMEVCNTR_LO 0x0 > > +#define PMEVCNTR_HI 0x4 > > +#define PMEVTYPER 0x400 > > +#define PMCCFILTR 0x47C > > +#define PMEVFILTR 0xA00 > > +#define PMCNTENSET 0xC00 > > +#define PMCNTENCLR 0xC20 > > +#define PMINTENSET 0xC40 > > +#define PMINTENCLR 0xC60 > > +#define PMOVSCLR 0xC80 > > +#define PMOVSSET 0xCC0 > > +#define PMCFGR 0xE00 > > +#define PMCR 0xE04 > > +#define PMIIDR 0xE08 > > + > > +/* PMCFGR register field */ > > +#define PMCFGR_NCG GENMASK(31, 28) > > +#define PMCFGR_HDBG BIT(24) > > +#define PMCFGR_TRO BIT(23) > > +#define PMCFGR_SS BIT(22) > > +#define PMCFGR_FZO BIT(21) > > +#define PMCFGR_MSI BIT(20) > > +#define PMCFGR_UEN BIT(19) > > +#define PMCFGR_NA BIT(17) > > +#define PMCFGR_EX BIT(16) > > +#define PMCFGR_CCD BIT(15) > > +#define PMCFGR_CC BIT(14) > > +#define PMCFGR_SIZE GENMASK(13, 8) > > +#define PMCFGR_N GENMASK(7, 0) > > + > > +/* PMCR register field */ > > +#define PMCR_TRO BIT(11) > > +#define PMCR_HDBG BIT(10) > > +#define PMCR_FZO BIT(9) > > +#define PMCR_NA BIT(8) > > +#define PMCR_DP BIT(5) > > +#define PMCR_X BIT(4) > > +#define PMCR_D BIT(3) > > +#define PMCR_C BIT(2) > > +#define PMCR_P BIT(1) > > +#define PMCR_E BIT(0) > > + > > +/* Each SET/CLR register supports up to 32 counters. */ > > +#define ARM_CSPMU_SET_CLR_COUNTER_SHIFT 5 > > +#define ARM_CSPMU_SET_CLR_COUNTER_NUM \ > > + (1 << ARM_CSPMU_SET_CLR_COUNTER_SHIFT) > > + > > +/* The number of 32-bit SET/CLR register that can be supported. */ > > +#define ARM_CSPMU_SET_CLR_MAX_NUM ((PMCNTENCLR - > PMCNTENSET) / sizeof(u32)) > > + > > +static_assert( > > + (ARM_CSPMU_SET_CLR_MAX_NUM * > ARM_CSPMU_SET_CLR_COUNTER_NUM) >= > > + ARM_CSPMU_MAX_HW_CNTRS); > > + > > +/* Convert counter idx into SET/CLR register number. */ > > +#define COUNTER_TO_SET_CLR_ID(idx) \ > > + (idx >> ARM_CSPMU_SET_CLR_COUNTER_SHIFT) > > + > > +/* Convert counter idx into SET/CLR register bit. */ > > +#define COUNTER_TO_SET_CLR_BIT(idx) \ > > + (idx & (ARM_CSPMU_SET_CLR_COUNTER_NUM - 1)) > > + > > +#define ARM_CSPMU_ACTIVE_CPU_MASK 0x0 > > +#define ARM_CSPMU_ASSOCIATED_CPU_MASK 0x1 > > + > > +/* Check if field f in flags is set with value v */ > > +#define CHECK_APMT_FLAG(flags, f, v) \ > > + ((flags & (ACPI_APMT_FLAGS_ ## f)) == (ACPI_APMT_FLAGS_ ## f ## > _ ## v)) > > + > > +/* Check and use default if implementer doesn't provide attribute > callback */ > > +#define CHECK_DEFAULT_IMPL_OPS(ops, callback) \ > > + do { \ > > + if (!ops->callback) \ > > + ops->callback = arm_cspmu_ ## callback; \ > > + } while (0) > > + > > +static unsigned long arm_cspmu_cpuhp_state; > > + > > +/* > > + * In CoreSight PMU architecture, all of the MMIO registers are 32-bit > except > > + * counter register. The counter register can be implemented as 32-bit or > 64-bit > > + * register depending on the value of PMCFGR.SIZE field. For 64-bit > access, > > + * single-copy 64-bit atomic support is implementation defined. APMT > node flag > > + * is used to identify if the PMU supports 64-bit single copy atomic. If 64- > bit > > + * single copy atomic is not supported, the driver treats the register as a > pair > > + * of 32-bit register. > > + */ > > + > > +/* > > + * Read 64-bit register as a pair of 32-bit registers using hi-lo-hi sequence. > > + */ > > +static u64 read_reg64_hilohi(const void __iomem *addr) > > +{ > > + u32 val_lo, val_hi; > > + u64 val; > > + > > + /* Use high-low-high sequence to avoid tearing */ > > + do { > > + val_hi = readl(addr + 4); > > + val_lo = readl(addr); > > + } while (val_hi != readl(addr + 4)); > > + > > + val = (((u64)val_hi << 32) | val_lo); > > + > > + return val; > > +} > > + > > +/* Check if PMU supports 64-bit single copy atomic. */ > > +static inline bool supports_64bit_atomics(const struct arm_cspmu > *cspmu) > > +{ > > + return CHECK_APMT_FLAG(cspmu->apmt_node->flags, ATOMIC, > SUPP); > > +} > > + > > +/* Check if cycle counter is supported. */ > > +static inline bool supports_cycle_counter(const struct arm_cspmu > *cspmu) > > +{ > > + return (cspmu->pmcfgr & PMCFGR_CC); > > +} > > + > > +/* Get counter size, which is (PMCFGR_SIZE + 1). */ > > +static inline u32 counter_size(const struct arm_cspmu *cspmu) > > +{ > > + return FIELD_GET(PMCFGR_SIZE, cspmu->pmcfgr) + 1; > > +} > > + > > +/* Get counter mask. */ > > +static inline u64 counter_mask(const struct arm_cspmu *cspmu) > > +{ > > + return GENMASK_ULL(counter_size(cspmu) - 1, 0); > > +} > > + > > +/* Check if counter is implemented as 64-bit register. */ > > +static inline bool use_64b_counter_reg(const struct arm_cspmu *cspmu) > > +{ > > + return (counter_size(cspmu) > 32); > > +} > > + > > +ssize_t arm_cspmu_sysfs_event_show(struct device *dev, > > + struct device_attribute *attr, char *buf) > > +{ > > + struct dev_ext_attribute *eattr = > > + container_of(attr, struct dev_ext_attribute, attr); > > + return sysfs_emit(buf, "event=0x%llx\n", > > + (unsigned long long)eattr->var); > > +} > > +EXPORT_SYMBOL_GPL(arm_cspmu_sysfs_event_show); > > + > > +/* Default event list. */ > > +static struct attribute *arm_cspmu_event_attrs[] = { > > + ARM_CSPMU_EVENT_ATTR(cycles, > ARM_CSPMU_EVT_CYCLES_DEFAULT), > > + NULL, > > +}; > > + > > +static struct attribute ** > > +arm_cspmu_get_event_attrs(const struct arm_cspmu *cspmu) > > +{ > > + return arm_cspmu_event_attrs; > > +} > > + > > +static umode_t > > +arm_cspmu_event_attr_is_visible(struct kobject *kobj, > > + struct attribute *attr, int unused) > > +{ > > + struct device *dev = kobj_to_dev(kobj); > > + struct arm_cspmu *cspmu = to_arm_cspmu(dev_get_drvdata(dev)); > > + struct perf_pmu_events_attr *eattr; > > + > > + eattr = container_of(attr, typeof(*eattr), attr.attr); > > + > > + /* Hide cycle event if not supported */ > > + if (!supports_cycle_counter(cspmu) && > > + eattr->id == ARM_CSPMU_EVT_CYCLES_DEFAULT) > > + return 0; > > + > > + return attr->mode; > > +} > > + > > +ssize_t arm_cspmu_sysfs_format_show(struct device *dev, > > + struct device_attribute *attr, > > + char *buf) > > +{ > > + struct dev_ext_attribute *eattr = > > + container_of(attr, struct dev_ext_attribute, attr); > > + return sysfs_emit(buf, "%s\n", (char *)eattr->var); > > +} > > +EXPORT_SYMBOL_GPL(arm_cspmu_sysfs_format_show); > > + > > +static struct attribute *arm_cspmu_format_attrs[] = { > > + ARM_CSPMU_FORMAT_EVENT_ATTR, > > + ARM_CSPMU_FORMAT_FILTER_ATTR, > > + NULL, > > +}; > > + > > +static struct attribute ** > > +arm_cspmu_get_format_attrs(const struct arm_cspmu *cspmu) > > +{ > > + return arm_cspmu_format_attrs; > > +} > > + > > +static u32 arm_cspmu_event_type(const struct perf_event *event) > > +{ > > + return event->attr.config & ARM_CSPMU_EVENT_MASK; > > +} > > + > > +static bool arm_cspmu_is_cycle_counter_event(const struct perf_event > *event) > > +{ > > + return (event->attr.config == ARM_CSPMU_EVT_CYCLES_DEFAULT); > > +} > > + > > +static u32 arm_cspmu_event_filter(const struct perf_event *event) > > +{ > > + return event->attr.config1 & ARM_CSPMU_FILTER_MASK; > > +} > > + > > +static ssize_t arm_cspmu_identifier_show(struct device *dev, > > + struct device_attribute *attr, > > + char *page) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(dev_get_drvdata(dev)); > > + > > + return sysfs_emit(page, "%s\n", cspmu->identifier); > > +} > > + > > +static struct device_attribute arm_cspmu_identifier_attr = > > + __ATTR(identifier, 0444, arm_cspmu_identifier_show, NULL); > > + > > +static struct attribute *arm_cspmu_identifier_attrs[] = { > > + &arm_cspmu_identifier_attr.attr, > > + NULL, > > +}; > > + > > +static struct attribute_group arm_cspmu_identifier_attr_group = { > > + .attrs = arm_cspmu_identifier_attrs, > > +}; > > + > > +static const char *arm_cspmu_get_identifier(const struct arm_cspmu > *cspmu) > > +{ > > + const char *identifier = > > + devm_kasprintf(cspmu->dev, GFP_KERNEL, "%x", > > + cspmu->impl.pmiidr); > > + return identifier; > > +} > > + > > +static const char > *arm_cspmu_type_str[ACPI_APMT_NODE_TYPE_COUNT] = { > > + "mc", > > + "smmu", > > + "pcie", > > + "acpi", > > + "cache", > > +}; > > + > > +static const char *arm_cspmu_get_name(const struct arm_cspmu > *cspmu) > > +{ > > + struct device *dev; > > + struct acpi_apmt_node *apmt_node; > > + u8 pmu_type; > > + char *name; > > + char acpi_hid_string[ACPI_ID_LEN] = { 0 }; > > + static atomic_t pmu_idx[ACPI_APMT_NODE_TYPE_COUNT] = { 0 }; > > + > > + dev = cspmu->dev; > > + apmt_node = cspmu->apmt_node; > > + pmu_type = apmt_node->type; > > + > > + if (pmu_type >= ACPI_APMT_NODE_TYPE_COUNT) { > > + dev_err(dev, "unsupported PMU type-%u\n", pmu_type); > > + return NULL; > > + } > > + > > + if (pmu_type == ACPI_APMT_NODE_TYPE_ACPI) { > > + memcpy(acpi_hid_string, > > + &apmt_node->inst_primary, > > + sizeof(apmt_node->inst_primary)); > > + name = devm_kasprintf(dev, GFP_KERNEL, "%s_%s_%s_%u", > PMUNAME, > > + arm_cspmu_type_str[pmu_type], > > + acpi_hid_string, > > + apmt_node->inst_secondary); > > + } else { > > + name = devm_kasprintf(dev, GFP_KERNEL, "%s_%s_%d", > PMUNAME, > > + arm_cspmu_type_str[pmu_type], > > + atomic_fetch_inc(&pmu_idx[pmu_type])); > > + } > > + > > + return name; > > +} > > + > > +static ssize_t arm_cspmu_cpumask_show(struct device *dev, > > + struct device_attribute *attr, > > + char *buf) > > +{ > > + struct pmu *pmu = dev_get_drvdata(dev); > > + struct arm_cspmu *cspmu = to_arm_cspmu(pmu); > > + struct dev_ext_attribute *eattr = > > + container_of(attr, struct dev_ext_attribute, attr); > > + unsigned long mask_id = (unsigned long)eattr->var; > > + const cpumask_t *cpumask; > > + > > + switch (mask_id) { > > + case ARM_CSPMU_ACTIVE_CPU_MASK: > > + cpumask = &cspmu->active_cpu; > > + break; > > + case ARM_CSPMU_ASSOCIATED_CPU_MASK: > > + cpumask = &cspmu->associated_cpus; > > + break; > > + default: > > + return 0; > > + } > > + return cpumap_print_to_pagebuf(true, buf, cpumask); > > +} > > + > > +static struct attribute *arm_cspmu_cpumask_attrs[] = { > > + ARM_CSPMU_CPUMASK_ATTR(cpumask, > ARM_CSPMU_ACTIVE_CPU_MASK), > > + ARM_CSPMU_CPUMASK_ATTR(associated_cpus, > ARM_CSPMU_ASSOCIATED_CPU_MASK), > > + NULL, > > +}; > > + > > +static struct attribute_group arm_cspmu_cpumask_attr_group = { > > + .attrs = arm_cspmu_cpumask_attrs, > > +}; > > + > > +struct impl_match { > > + u32 pmiidr; > > + u32 mask; > > + int (*impl_init_ops)(struct arm_cspmu *cspmu); > > +}; > > + > > +static const struct impl_match impl_match[] = { > > + {} > > +}; > > + > > +static int arm_cspmu_init_impl_ops(struct arm_cspmu *cspmu) > > +{ > > + int ret; > > + struct acpi_apmt_node *apmt_node = cspmu->apmt_node; > > + struct arm_cspmu_impl_ops *impl_ops = &cspmu->impl.ops; > > + const struct impl_match *match = impl_match; > > + > > + /* > > + * Get PMU implementer and product id from APMT node. > > + * If APMT node doesn't have implementer/product id, try get it > > + * from PMIIDR. > > + */ > > + cspmu->impl.pmiidr = > > + (apmt_node->impl_id) ? apmt_node->impl_id : > > + readl(cspmu->base0 + PMIIDR); > > + > > + /* Find implementer specific attribute ops. */ > > + for (; match->pmiidr; match++) { > > + const u32 mask = match->mask; > > + > > + if ((match->pmiidr & mask) == (cspmu->impl.pmiidr & mask)) { > > + ret = match->impl_init_ops(cspmu); > > + if (ret) > > + return ret; > > + > > + break; > > + } > > + } > > + > > + /* Use default callbacks if implementer doesn't provide one. */ > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, get_event_attrs); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, get_format_attrs); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, get_identifier); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, get_name); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, is_cycle_counter_event); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, event_type); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, event_filter); > > + CHECK_DEFAULT_IMPL_OPS(impl_ops, event_attr_is_visible); > > + > > + return 0; > > +} > > + > > +static struct attribute_group * > > +arm_cspmu_alloc_event_attr_group(struct arm_cspmu *cspmu) > > +{ > > + struct attribute_group *event_group; > > + struct device *dev = cspmu->dev; > > + const struct arm_cspmu_impl_ops *impl_ops = &cspmu->impl.ops; > > + > > + event_group = > > + devm_kzalloc(dev, sizeof(struct attribute_group), GFP_KERNEL); > > + if (!event_group) > > + return NULL; > > + > > + event_group->name = "events"; > > + event_group->attrs = impl_ops->get_event_attrs(cspmu); > > + event_group->is_visible = impl_ops->event_attr_is_visible; > > + > > + return event_group; > > +} > > + > > +static struct attribute_group * > > +arm_cspmu_alloc_format_attr_group(struct arm_cspmu *cspmu) > > +{ > > + struct attribute_group *format_group; > > + struct device *dev = cspmu->dev; > > + > > + format_group = > > + devm_kzalloc(dev, sizeof(struct attribute_group), GFP_KERNEL); > > + if (!format_group) > > + return NULL; > > + > > + format_group->name = "format"; > > + format_group->attrs = cspmu->impl.ops.get_format_attrs(cspmu); > > + > > + return format_group; > > +} > > + > > +static struct attribute_group ** > > +arm_cspmu_alloc_attr_group(struct arm_cspmu *cspmu) > > +{ > > + struct attribute_group **attr_groups = NULL; > > + struct device *dev = cspmu->dev; > > + const struct arm_cspmu_impl_ops *impl_ops = &cspmu->impl.ops; > > + int ret; > > + > > + ret = arm_cspmu_init_impl_ops(cspmu); > > + if (ret) > > + return NULL; > > + > > + cspmu->identifier = impl_ops->get_identifier(cspmu); > > + cspmu->name = impl_ops->get_name(cspmu); > > + > > + if (!cspmu->identifier || !cspmu->name) > > + return NULL; > > + > > + attr_groups = devm_kcalloc(dev, 5, sizeof(struct attribute_group *), > > + GFP_KERNEL); > > + if (!attr_groups) > > + return NULL; > > + > > + attr_groups[0] = arm_cspmu_alloc_event_attr_group(cspmu); > > + attr_groups[1] = arm_cspmu_alloc_format_attr_group(cspmu); > > + attr_groups[2] = &arm_cspmu_identifier_attr_group; > > + attr_groups[3] = &arm_cspmu_cpumask_attr_group; > > + > > + if (!attr_groups[0] || !attr_groups[1]) > > + return NULL; > > + > > + return attr_groups; > > +} > > + > > +static inline void arm_cspmu_reset_counters(struct arm_cspmu *cspmu) > > +{ > > + u32 pmcr = 0; > > + > > + pmcr |= PMCR_P; > > + pmcr |= PMCR_C; > > + writel(pmcr, cspmu->base0 + PMCR); > > +} > > + > > +static inline void arm_cspmu_start_counters(struct arm_cspmu *cspmu) > > +{ > > + writel(PMCR_E, cspmu->base0 + PMCR); > > +} > > + > > +static inline void arm_cspmu_stop_counters(struct arm_cspmu *cspmu) > > +{ > > + writel(0, cspmu->base0 + PMCR); > > +} > > + > > +static void arm_cspmu_enable(struct pmu *pmu) > > +{ > > + bool disabled; > > + struct arm_cspmu *cspmu = to_arm_cspmu(pmu); > > + > > + disabled = bitmap_empty(cspmu->hw_events.used_ctrs, > > + cspmu->num_logical_ctrs); > > + > > + if (disabled) > > + return; > > + > > + arm_cspmu_start_counters(cspmu); > > +} > > + > > +static void arm_cspmu_disable(struct pmu *pmu) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(pmu); > > + > > + arm_cspmu_stop_counters(cspmu); > > +} > > + > > +static int arm_cspmu_get_event_idx(struct arm_cspmu_hw_events > *hw_events, > > + struct perf_event *event) > > +{ > > + int idx; > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + > > + if (supports_cycle_counter(cspmu)) { > > + if (cspmu->impl.ops.is_cycle_counter_event(event)) { > > + /* Search for available cycle counter. */ > > + if (test_and_set_bit(cspmu->cycle_counter_logical_idx, > > + hw_events->used_ctrs)) > > + return -EAGAIN; > > + > > + return cspmu->cycle_counter_logical_idx; > > + } > > + > > + /* > > + * Search a regular counter from the used counter bitmap. > > + * The cycle counter divides the bitmap into two parts. Search > > + * the first then second half to exclude the cycle counter bit. > > + */ > > + idx = find_first_zero_bit(hw_events->used_ctrs, > > + cspmu->cycle_counter_logical_idx); > > + if (idx >= cspmu->cycle_counter_logical_idx) { > > + idx = find_next_zero_bit( > > + hw_events->used_ctrs, > > + cspmu->num_logical_ctrs, > > + cspmu->cycle_counter_logical_idx + 1); > > + } > > + } else { > > + idx = find_first_zero_bit(hw_events->used_ctrs, > > + cspmu->num_logical_ctrs); > > + } > > + > > + if (idx >= cspmu->num_logical_ctrs) > > + return -EAGAIN; > > + > > + set_bit(idx, hw_events->used_ctrs); > > + > > + return idx; > > +} > > + > > +static bool arm_cspmu_validate_event(struct pmu *pmu, > > + struct arm_cspmu_hw_events *hw_events, > > + struct perf_event *event) > > +{ > > + if (is_software_event(event)) > > + return true; > > + > > + /* Reject groups spanning multiple HW PMUs. */ > > + if (event->pmu != pmu) > > + return false; > > + > > + return (arm_cspmu_get_event_idx(hw_events, event) >= 0); > > +} > > + > > +/* > > + * Make sure the group of events can be scheduled at once > > + * on the PMU. > > + */ > > +static bool arm_cspmu_validate_group(struct perf_event *event) > > +{ > > + struct perf_event *sibling, *leader = event->group_leader; > > + struct arm_cspmu_hw_events fake_hw_events; > > + > > + if (event->group_leader == event) > > + return true; > > + > > + memset(&fake_hw_events, 0, sizeof(fake_hw_events)); > > + > > + if (!arm_cspmu_validate_event(event->pmu, &fake_hw_events, > leader)) > > + return false; > > + > > + for_each_sibling_event(sibling, leader) { > > + if (!arm_cspmu_validate_event(event->pmu, &fake_hw_events, > > + sibling)) > > + return false; > > + } > > + > > + return arm_cspmu_validate_event(event->pmu, &fake_hw_events, > event); > > +} > > + > > +static int arm_cspmu_event_init(struct perf_event *event) > > +{ > > + struct arm_cspmu *cspmu; > > + struct hw_perf_event *hwc = &event->hw; > > + > > + cspmu = to_arm_cspmu(event->pmu); > > + > > + /* > > + * Following other "uncore" PMUs, we do not support sampling mode > or > > + * attach to a task (per-process mode). > > + */ > > + if (is_sampling_event(event)) { > > + dev_dbg(cspmu->pmu.dev, > > + "Can't support sampling events\n"); > > + return -EOPNOTSUPP; > > + } > > + > > + if (event->cpu < 0 || event->attach_state & PERF_ATTACH_TASK) { > > + dev_dbg(cspmu->pmu.dev, > > + "Can't support per-task counters\n"); > > + return -EINVAL; > > + } > > + > > + /* > > + * Make sure the CPU assignment is on one of the CPUs associated with > > + * this PMU. > > + */ > > + if (!cpumask_test_cpu(event->cpu, &cspmu->associated_cpus)) { > > + dev_dbg(cspmu->pmu.dev, > > + "Requested cpu is not associated with the PMU\n"); > > + return -EINVAL; > > + } > > + > > + /* Enforce the current active CPU to handle the events in this PMU. */ > > + event->cpu = cpumask_first(&cspmu->active_cpu); > > + if (event->cpu >= nr_cpu_ids) > > + return -EINVAL; > > + > > + if (!arm_cspmu_validate_group(event)) > > + return -EINVAL; > > + > > + /* > > + * The logical counter id is tracked with hw_perf_event.extra_reg.idx. > > + * The physical counter id is tracked with hw_perf_event.idx. > > + * We don't assign an index until we actually place the event onto > > + * hardware. Use -1 to signify that we haven't decided where to put it > > + * yet. > > + */ > > + hwc->idx = -1; > > + hwc->extra_reg.idx = -1; > > + hwc->config = cspmu->impl.ops.event_type(event); > > + > > + return 0; > > +} > > + > > +static inline u32 counter_offset(u32 reg_sz, u32 ctr_idx) > > +{ > > + return (PMEVCNTR_LO + (reg_sz * ctr_idx)); > > +} > > + > > +static void arm_cspmu_write_counter(struct perf_event *event, u64 val) > > +{ > > + u32 offset; > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + > > + if (use_64b_counter_reg(cspmu)) { > > + offset = counter_offset(sizeof(u64), event->hw.idx); > > + > > + writeq(val, cspmu->base1 + offset); > > + } else { > > + offset = counter_offset(sizeof(u32), event->hw.idx); > > + > > + writel(lower_32_bits(val), cspmu->base1 + offset); > > + } > > +} > > + > > +static u64 arm_cspmu_read_counter(struct perf_event *event) > > +{ > > + u32 offset; > > + const void __iomem *counter_addr; > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + > > + if (use_64b_counter_reg(cspmu)) { > > + offset = counter_offset(sizeof(u64), event->hw.idx); > > + counter_addr = cspmu->base1 + offset; > > + > > + return supports_64bit_atomics(cspmu) ? > > + readq(counter_addr) : > > + read_reg64_hilohi(counter_addr); > > + } > > + > > + offset = counter_offset(sizeof(u32), event->hw.idx); > > + return readl(cspmu->base1 + offset); > > +} > > + > > +/* > > + * arm_cspmu_set_event_period: Set the period for the counter. > > + * > > + * To handle cases of extreme interrupt latency, we program > > + * the counter with half of the max count for the counters. > > + */ > > +static void arm_cspmu_set_event_period(struct perf_event *event) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + u64 val = counter_mask(cspmu) >> 1ULL; > > + > > + local64_set(&event->hw.prev_count, val); > > + arm_cspmu_write_counter(event, val); > > +} > > + > > +static void arm_cspmu_enable_counter(struct arm_cspmu *cspmu, int > idx) > > +{ > > + u32 reg_id, reg_bit, inten_off, cnten_off; > > + > > + reg_id = COUNTER_TO_SET_CLR_ID(idx); > > + reg_bit = COUNTER_TO_SET_CLR_BIT(idx); > > + > > + inten_off = PMINTENSET + (4 * reg_id); > > + cnten_off = PMCNTENSET + (4 * reg_id); > > + > > + writel(BIT(reg_bit), cspmu->base0 + inten_off); > > + writel(BIT(reg_bit), cspmu->base0 + cnten_off); > > +} > > + > > +static void arm_cspmu_disable_counter(struct arm_cspmu *cspmu, int > idx) > > +{ > > + u32 reg_id, reg_bit, inten_off, cnten_off; > > + > > + reg_id = COUNTER_TO_SET_CLR_ID(idx); > > + reg_bit = COUNTER_TO_SET_CLR_BIT(idx); > > + > > + inten_off = PMINTENCLR + (4 * reg_id); > > + cnten_off = PMCNTENCLR + (4 * reg_id); > > + > > + writel(BIT(reg_bit), cspmu->base0 + cnten_off); > > + writel(BIT(reg_bit), cspmu->base0 + inten_off); > > +} > > + > > +static void arm_cspmu_event_update(struct perf_event *event) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + struct hw_perf_event *hwc = &event->hw; > > + u64 delta, prev, now; > > + > > + do { > > + prev = local64_read(&hwc->prev_count); > > + now = arm_cspmu_read_counter(event); > > + } while (local64_cmpxchg(&hwc->prev_count, prev, now) != prev); > > + > > + delta = (now - prev) & counter_mask(cspmu); > > + local64_add(delta, &event->count); > > +} > > + > > +static inline void arm_cspmu_set_event(struct arm_cspmu *cspmu, > > + struct hw_perf_event *hwc) > > +{ > > + u32 offset = PMEVTYPER + (4 * hwc->idx); > > + > > + writel(hwc->config, cspmu->base0 + offset); > > +} > > + > > +static inline void arm_cspmu_set_ev_filter(struct arm_cspmu *cspmu, > > + struct hw_perf_event *hwc, > > + u32 filter) > > +{ > > + u32 offset = PMEVFILTR + (4 * hwc->idx); > > + > > + writel(filter, cspmu->base0 + offset); > > +} > > + > > +static inline void arm_cspmu_set_cc_filter(struct arm_cspmu *cspmu, u32 > filter) > > +{ > > + u32 offset = PMCCFILTR; > > + > > + writel(filter, cspmu->base0 + offset); > > +} > > + > > +static void arm_cspmu_start(struct perf_event *event, int pmu_flags) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + struct hw_perf_event *hwc = &event->hw; > > + u32 filter; > > + > > + /* We always reprogram the counter */ > > + if (pmu_flags & PERF_EF_RELOAD) > > + WARN_ON(!(hwc->state & PERF_HES_UPTODATE)); > > + > > + arm_cspmu_set_event_period(event); > > + > > + filter = cspmu->impl.ops.event_filter(event); > > + > > + if (event->hw.extra_reg.idx == cspmu->cycle_counter_logical_idx) { > > + arm_cspmu_set_cc_filter(cspmu, filter); > > + } else { > > + arm_cspmu_set_event(cspmu, hwc); > > + arm_cspmu_set_ev_filter(cspmu, hwc, filter); > > + } > > + > > + hwc->state = 0; > > + > > + arm_cspmu_enable_counter(cspmu, hwc->idx); > > +} > > + > > +static void arm_cspmu_stop(struct perf_event *event, int pmu_flags) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + struct hw_perf_event *hwc = &event->hw; > > + > > + if (hwc->state & PERF_HES_STOPPED) > > + return; > > + > > + arm_cspmu_disable_counter(cspmu, hwc->idx); > > + arm_cspmu_event_update(event); > > + > > + hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE; > > +} > > + > > +static inline u32 to_phys_idx(struct arm_cspmu *cspmu, u32 idx) > > +{ > > + return (idx == cspmu->cycle_counter_logical_idx) ? > > + ARM_CSPMU_CYCLE_CNTR_IDX : idx; > > +} > > + > > +static int arm_cspmu_add(struct perf_event *event, int flags) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + struct arm_cspmu_hw_events *hw_events = &cspmu->hw_events; > > + struct hw_perf_event *hwc = &event->hw; > > + int idx; > > + > > + if (WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), > > + &cspmu->associated_cpus))) > > + return -ENOENT; > > + > > + idx = arm_cspmu_get_event_idx(hw_events, event); > > + if (idx < 0) > > + return idx; > > + > > + hw_events->events[idx] = event; > > + hwc->idx = to_phys_idx(cspmu, idx); > > + hwc->extra_reg.idx = idx; > > + hwc->state = PERF_HES_STOPPED | PERF_HES_UPTODATE; > > + > > + if (flags & PERF_EF_START) > > + arm_cspmu_start(event, PERF_EF_RELOAD); > > + > > + /* Propagate changes to the userspace mapping. */ > > + perf_event_update_userpage(event); > > + > > + return 0; > > +} > > + > > +static void arm_cspmu_del(struct perf_event *event, int flags) > > +{ > > + struct arm_cspmu *cspmu = to_arm_cspmu(event->pmu); > > + struct arm_cspmu_hw_events *hw_events = &cspmu->hw_events; > > + struct hw_perf_event *hwc = &event->hw; > > + int idx = hwc->extra_reg.idx; > > + > > + arm_cspmu_stop(event, PERF_EF_UPDATE); > > + > > + hw_events->events[idx] = NULL; > > + > > + clear_bit(idx, hw_events->used_ctrs); > > + > > + perf_event_update_userpage(event); > > +} > > + > > +static void arm_cspmu_read(struct perf_event *event) > > +{ > > + arm_cspmu_event_update(event); > > +} > > + > > +static struct arm_cspmu *arm_cspmu_alloc(struct platform_device > *pdev) > > +{ > > + struct acpi_apmt_node *apmt_node; > > + struct arm_cspmu *cspmu; > > + struct device *dev; > > + > > + dev = &pdev->dev; > > + apmt_node = *(struct acpi_apmt_node **)dev_get_platdata(dev); > > + if (!apmt_node) { > > + dev_err(dev, "failed to get APMT node\n"); > > + return NULL; > > + } > > + > > + cspmu = devm_kzalloc(dev, sizeof(*cspmu), GFP_KERNEL); > > + if (!cspmu) > > + return NULL; > > + > > + cspmu->dev = dev; > > + cspmu->apmt_node = apmt_node; > > + > > + platform_set_drvdata(pdev, cspmu); > > + > > + return cspmu; > > +} > > + > > +static int arm_cspmu_init_mmio(struct arm_cspmu *cspmu) > > +{ > > + struct device *dev; > > + struct platform_device *pdev; > > + struct acpi_apmt_node *apmt_node; > > + > > + dev = cspmu->dev; > > + pdev = to_platform_device(dev); > > + apmt_node = cspmu->apmt_node; > > + > > + /* Base address for page 0. */ > > + cspmu->base0 = devm_platform_ioremap_resource(pdev, 0); > > + if (IS_ERR(cspmu->base0)) { > > + dev_err(dev, "ioremap failed for page-0 resource\n"); > > + return PTR_ERR(cspmu->base0); > > + } > > + > > + /* Base address for page 1 if supported. Otherwise point to page 0. */ > > + cspmu->base1 = cspmu->base0; > > + if (CHECK_APMT_FLAG(apmt_node->flags, DUAL_PAGE, SUPP)) { > > + cspmu->base1 = devm_platform_ioremap_resource(pdev, 1); > > + if (IS_ERR(cspmu->base1)) { > > + dev_err(dev, "ioremap failed for page-1 resource\n"); > > + return PTR_ERR(cspmu->base1); > > + } > > + } > > + > > + cspmu->pmcfgr = readl(cspmu->base0 + PMCFGR); > > + > > + cspmu->num_logical_ctrs = FIELD_GET(PMCFGR_N, cspmu->pmcfgr) + > 1; > > + > > + cspmu->cycle_counter_logical_idx = ARM_CSPMU_MAX_HW_CNTRS; > > + > > + if (supports_cycle_counter(cspmu)) { > > + /* > > + * The last logical counter is mapped to cycle counter if > > + * there is a gap between regular and cycle counter. Otherwise, > > + * logical and physical have 1-to-1 mapping. > > + */ > > + cspmu->cycle_counter_logical_idx = > > + (cspmu->num_logical_ctrs <= ARM_CSPMU_CYCLE_CNTR_IDX) > ? > > + cspmu->num_logical_ctrs - 1 : > > + ARM_CSPMU_CYCLE_CNTR_IDX; > > + } > > + > > + cspmu->num_set_clr_reg = > > + DIV_ROUND_UP(cspmu->num_logical_ctrs, > > + ARM_CSPMU_SET_CLR_COUNTER_NUM); > > + > > + cspmu->hw_events.events = > > + devm_kcalloc(dev, cspmu->num_logical_ctrs, > > + sizeof(*cspmu->hw_events.events), GFP_KERNEL); > > + > > + if (!cspmu->hw_events.events) > > + return -ENOMEM; > > + > > + return 0; > > +} > > + > > +static inline int arm_cspmu_get_reset_overflow(struct arm_cspmu > *cspmu, > > + u32 *pmovs) > > +{ > > + int i; > > + u32 pmovclr_offset = PMOVSCLR; > > + u32 has_overflowed = 0; > > + > > + for (i = 0; i < cspmu->num_set_clr_reg; ++i) { > > + pmovs[i] = readl(cspmu->base1 + pmovclr_offset); > > + has_overflowed |= pmovs[i]; > > + writel(pmovs[i], cspmu->base1 + pmovclr_offset); > > + pmovclr_offset += sizeof(u32); > > + } > > + > > + return has_overflowed != 0; > > +} > > + > > +static irqreturn_t arm_cspmu_handle_irq(int irq_num, void *dev) > > +{ > > + int idx, has_overflowed; > > + struct perf_event *event; > > + struct arm_cspmu *cspmu = dev; > > + u32 pmovs[ARM_CSPMU_SET_CLR_MAX_NUM] = { 0 }; > > nit: Could we not reuse what we do for hw_events.use_ctrs ? > > i.e, DECLARE_BITMAP(pmovs, ARM_CSPMU_MAX_HW_CNTRS) > > > And remove ARM_CSPMU_SET_CLR_MAX_NUM altogether and the cast > below > to (unsigned long *). > Sure, I will update the patch with your suggestion. > With that > > Reviewed-by: Suzuki K Poulose > Thanks! > Suzuki _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel