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 0DCD8C27C55 for ; Sun, 9 Jun 2024 23:02:50 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=4gPG41YkymRgANVHwMcquxEW6nz5QEKyQVl+zqkI/KI=; b=sLg5lDH3YZKObu X7TcJFPUeLxZ+VK3YErQPuArb0XmcUVriIwwk+P8XUeSJ+7hrzhSn6rUH1d7q1eSGroVdy9k2vkFO fXpk9kgBJxE96jOk3r9JhWc2eRX5Y7st8Kr6OkG7NcL7r5f442bSxmo7kO4lwUSm119dpEZP278MP 798RrvvuzkhSWIX33JJCJAlp4hdYHPKoM0yzMvmXJvRrOIpAzIl1DZkyHJ8XGLH5E2R3p5DrHgMcM z410ZRon7lZaGlTifOOM9Hcp2UDrTeflRTzYsYvt/QaP7QPgDAfrIf+/Z5FdYpIvGqNzWiW1m9qhc uxdsyCdSD+P57gz9ZCLw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sGRYb-00000003OQi-1w35; Sun, 09 Jun 2024 23:02:37 +0000 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sGRYX-00000003OQ3-01jo for linux-riscv@lists.infradead.org; Sun, 09 Jun 2024 23:02:35 +0000 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-70599522368so153605b3a.2 for ; Sun, 09 Jun 2024 16:02:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1717974149; x=1718578949; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=vPYHtBQnd/xyYKGlXkuxo2Q7Wr4C6Il5aaXzbLwkn54=; b=wxXk4ZZuwKOTVwqz3ZyrciQQOz3vYSS8iJbDuFB7fNzDZSEVwDayV0i9mKJcGsxf/l Lrvr28UWVPmkP2WvH4jPEUt67l6A7xrHkfWolhYkSxvRe/AJsMyrnWcYeXh4RJfD7e1Z eDI7heYaS1+pU7m0v38L5eNnmANXgVgpDZ6+2ZYB4VF8mDdw+RFXbs1TsoPGKmXge7VJ dlcBUVuwxvRJbwTF7SJHS/FQmeoyflqsSPiFhtfRZlhKdpjJUqyBT2mUo9fvGL1DisxH h91d7Nm6v7FpMfoUKEkOhfkeQmVjs0rAcufjnat0JPNvj2cypv25LPRArmeXcIhVArtD zeFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717974149; x=1718578949; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vPYHtBQnd/xyYKGlXkuxo2Q7Wr4C6Il5aaXzbLwkn54=; b=gYqMa+vmqNrnIO8ota2nrz8i1KSPh6zD87VlArDZVcEof/wk1dNyLyzTXt6qRWHHQC 7YgLB3+SbQKzmLc+QtX+Jas4+bDre4j2W0ulvI2PK407MBJ7JoEWgSavN0SnITdcDsTe NIDPH2dby5vx0aRWXpOb5QNS5TeEnJSEriw/iIZrIX2kzufTT2qHHYhkOMwPS+sg8x4+ osq/6CoDx5kAWeNMVY3tKZcRjZ2zot1wYUTYe8R5uLqdwaO0AkEONKeIWSjzl6gFojE9 fPd7UjLH59eu/3Y/f2+AVU6Bt/LIlu5zxXxrvZU5TUaCs7yfoJRYI95UgdkSvnZcElTl PmGg== X-Forwarded-Encrypted: i=1; AJvYcCW7sjDM/fm6UcTO9KRtOGrxElOjzDSvf5hKvA7DkmAUX6GlXPItDmP96RdgrJRSgQtCRiq0p6BdelYKJ3GatxJ/a6ySrbgCjNzFJvS/tdOY X-Gm-Message-State: AOJu0YywveN75t/JYRBOL3BA+dZqoRIdEMdPN9g08hsy2z4105Wd+TYF D4ps47fJ5d6/V+dTwO3V61BlLLqv5NySNO0oiC4DFd0wa2/u6VD8Xn1/pLv8sLQ= X-Google-Smtp-Source: AGHT+IFKAWS/i6LiEZnmcbeDkdNuO1Gx/YustS5XDiosA+DuSuyZiJ4CyNtN6hg5qB9ADlqtKzs/3g== X-Received: by 2002:a05:6a20:430d:b0:1b7:d050:93e5 with SMTP id adf61e73a8af0-1b7d05098fcmr369300637.15.1717974149226; Sun, 09 Jun 2024 16:02:29 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:917b:ada:b5b8:40af]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-704211eadf1sm3032904b3a.4.2024.06.09.16.02.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Jun 2024 16:02:28 -0700 (PDT) Date: Sun, 9 Jun 2024 16:02:26 -0700 From: Charlie Jenkins To: Andy Chiu Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , Conor Dooley , Evan Green , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/4] riscv: Extend cpufeature.c to detect vendor extensions Message-ID: References: <20240515-support_vendor_extensions-v1-0-b05dd5ea7d8d@rivosinc.com> <20240515-support_vendor_extensions-v1-1-b05dd5ea7d8d@rivosinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240609_160233_226986_FFAE535E X-CRM114-Status: GOOD ( 34.18 ) X-BeenThere: linux-riscv@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="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXkgMjksIDIwMjQgYXQgMTE6MjI6MTdQTSArMDgwMCwgQW5keSBDaGl1IHdyb3Rl Ogo+IEhpIENoYXJsaWUsCj4gCj4gT24gVGh1LCBNYXkgMTYsIDIwMjQgYXQgNToyOOKAr0FNIENo YXJsaWUgSmVua2lucyA8Y2hhcmxpZUByaXZvc2luYy5jb20+IHdyb3RlOgo+ID4KPiA+IEluc3Rl YWQgb2YgZ3JvdXBpbmcgYWxsIHZlbmRvciBleHRlbnNpb25zIGludG8gdGhlIHNhbWUgcmlzY3Zf aXNhX2V4dAo+ID4gdGhhdCBzdGFuZGFyZCBpbnN0cnVjdGlvbnMgdXNlLCBjcmVhdGUgYSBzdHJ1 Y3QKPiA+ICJyaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QiIHRoYXQgYWxsb3dzIGVhY2gg dmVuZG9yIHRvIG1haW50YWluCj4gPiB0aGVpciB2ZW5kb3IgZXh0ZW5zaW9ucyBpbmRlcGVuZGVu dGx5IG9mIHRoZSBzdGFuZGFyZCBleHRlbnNpb25zLgo+ID4geGFuZGVzcG11IGlzIGN1cnJlbnRs eSB0aGUgb25seSB2ZW5kb3IgZXh0ZW5zaW9uIHNvIHRoYXQgaXMgdGhlIG9ubHkKPiA+IGV4dGVu c2lvbiB0aGF0IGlzIGFmZmVjdGVkIGJ5IHRoaXMgY2hhbmdlLgo+ID4KPiA+IEFuIGFkZGl0aW9u YWwgYmVuZWZpdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGV4dGVuc2lvbnMgb2YgZWFjaCB2ZW5kb3Ig Y2FuCj4gPiBiZSBjb25kaXRpb25hbGx5IGVuYWJsZWQuIEEgY29uZmlnIFJJU0NWX0lTQV9WRU5E T1JfRVhUX0FOREVTIGhhcyBiZWVuCj4gPiBhZGRlZCB0byBhbGxvdyBmb3IgdGhhdC4KPiA+Cj4g PiBTaWduZWQtb2ZmLWJ5OiBDaGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+ ID4gLS0tCj4gPiAgYXJjaC9yaXNjdi9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyICsKPiA+ICBhcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yICAgICAgICAgICAgICAg ICAgICAgICAgfCAgMTkgKysrKwo+ID4gIGFyY2gvcmlzY3YvZXJyYXRhL2FuZGVzL2VycmF0YS5j ICAgICAgICAgICAgICAgICB8ICAgMyArCj4gPiAgYXJjaC9yaXNjdi9lcnJhdGEvc2lmaXZlL2Vy cmF0YS5jICAgICAgICAgICAgICAgIHwgICAzICsKPiA+ICBhcmNoL3Jpc2N2L2VycmF0YS90aGVh ZC9lcnJhdGEuYyAgICAgICAgICAgICAgICAgfCAgIDMgKwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVk ZS9hc20vY3B1ZmVhdHVyZS5oICAgICAgICAgICAgICB8ICAxOCArKysKPiA+ICBhcmNoL3Jpc2N2 L2luY2x1ZGUvYXNtL2h3Y2FwLmggICAgICAgICAgICAgICAgICAgfCAgIDEgLQo+ID4gIGFyY2gv cmlzY3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMuaCAgICAgICB8ICA0OCArKysrKysr Kwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMvYW5kZXMuaCB8 ICAxOSArKysrCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZpbGUgICAgICAgICAgICAgICAg ICAgICAgIHwgICAyICsKPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMgICAgICAg ICAgICAgICAgICAgfCAxMzUgKysrKysrKysrKysrKysrKystLS0tLS0KPiA+ICBhcmNoL3Jpc2N2 L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy5jICAgICAgICAgICAgfCAgNTYgKysrKysrKysrKwo+ ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL01ha2VmaWxlICAgICB8ICAg MyArCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMvYW5kZXMuYyAgICAg IHwgIDE4ICsrKwo+ID4gIGRyaXZlcnMvcGVyZi9yaXNjdl9wbXVfc2JpLmMgICAgICAgICAgICAg ICAgICAgICB8ICAxMCArLQo+ID4gIDE1IGZpbGVzIGNoYW5nZWQsIDMwMyBpbnNlcnRpb25zKCsp LCAzNyBkZWxldGlvbnMoLSkKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmln IGIvYXJjaC9yaXNjdi9LY29uZmlnCj4gPiBpbmRleCBiZTA5Yzg4MzZkNTYuLmZlYzg2ZmJhM2Fj ZCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3YvS2NvbmZpZwo+ID4gKysrIGIvYXJjaC9yaXNj di9LY29uZmlnCj4gPiBAQCAtNzU5LDYgKzc1OSw4IEBAIGNvbmZpZyBSSVNDVl9FRkZJQ0lFTlRf VU5BTElHTkVEX0FDQ0VTUwo+ID4KPiA+ICBlbmRjaG9pY2UKPiA+Cj4gPiArc291cmNlICJhcmNo L3Jpc2N2L0tjb25maWcudmVuZG9yIgo+ID4gKwo+ID4gIGVuZG1lbnUgIyAiUGxhdGZvcm0gdHlw ZSIKPiA+Cj4gPiAgbWVudSAiS2VybmVsIGZlYXR1cmVzIgo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv cmlzY3YvS2NvbmZpZy52ZW5kb3IgYi9hcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yCj4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi42ZjFjZGQzMmVkMjkKPiA+ IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZy52ZW5kb3IKPiA+IEBA IC0wLDAgKzEsMTkgQEAKPiA+ICttZW51ICJWZW5kb3IgZXh0ZW5zaW9ucyIKPiA+ICsKPiA+ICtj b25maWcgUklTQ1ZfSVNBX1ZFTkRPUl9FWFQKPiA+ICsgICAgICAgYm9vbAo+ID4gKwo+ID4gK21l bnUgIkFuZGVzIgo+ID4gK2NvbmZpZyBSSVNDVl9JU0FfVkVORE9SX0VYVF9BTkRFUwo+ID4gKyAg ICAgICBib29sICJBbmRlcyB2ZW5kb3IgZXh0ZW5zaW9uIHN1cHBvcnQiCj4gPiArICAgICAgIHNl bGVjdCBSSVNDVl9JU0FfVkVORE9SX0VYVAo+ID4gKyAgICAgICBkZWZhdWx0IHkKPiA+ICsgICAg ICAgaGVscAo+ID4gKyAgICAgICAgIFNheSBOIGhlcmUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBh bGwgQW5kZXMgdmVuZG9yIGV4dGVuc2lvbgo+ID4gKyAgICAgICAgIHN1cHBvcnQuIFRoaXMgd2ls bCBjYXVzZSBhbnkgQW5kZXMgdmVuZG9yIGV4dGVuc2lvbnMgdGhhdCBhcmUKPiA+ICsgICAgICAg ICByZXF1ZXN0ZWQgYnkgaGFyZHdhcmUgcHJvYmluZyB0byBiZSBpZ25vcmVkLgo+ID4gKwo+ID4g KyAgICAgICAgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IFkuCj4gPiAr ZW5kbWVudQo+ID4gKwo+ID4gK2VuZG1lbnUKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2Vy cmF0YS9hbmRlcy9lcnJhdGEuYyBiL2FyY2gvcmlzY3YvZXJyYXRhL2FuZGVzL2VycmF0YS5jCj4g PiBpbmRleCBmMjcwOGE5NDk0YTEuLmZjMWEzNGZhYTVmMyAxMDA2NDQKPiA+IC0tLSBhL2FyY2gv cmlzY3YvZXJyYXRhL2FuZGVzL2VycmF0YS5jCj4gPiArKysgYi9hcmNoL3Jpc2N2L2VycmF0YS9h bmRlcy9lcnJhdGEuYwo+ID4gQEAgLTE3LDYgKzE3LDcgQEAKPiA+ICAjaW5jbHVkZSA8YXNtL3By b2Nlc3Nvci5oPgo+ID4gICNpbmNsdWRlIDxhc20vc2JpLmg+Cj4gPiAgI2luY2x1ZGUgPGFzbS92 ZW5kb3JpZF9saXN0Lmg+Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5oPgo+ ID4KPiA+ICAjZGVmaW5lIEFOREVTX0FYNDVNUF9NQVJDSElEICAgICAgICAgICAweDgwMDAwMDAw MDAwMDhhNDVVTAo+ID4gICNkZWZpbmUgQU5ERVNfQVg0NU1QX01JTVBJRCAgICAgICAgICAgIDB4 NTAwVUwKPiA+IEBAIC02NSw2ICs2Niw4IEBAIHZvaWQgX19pbml0X29yX21vZHVsZSBhbmRlc19l cnJhdGFfcGF0Y2hfZnVuYyhzdHJ1Y3QgYWx0X2VudHJ5ICpiZWdpbiwgc3RydWN0IGFsCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBhcmNoaWQsIHVuc2lnbmVkIGxvbmcgaW1waWQsCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YWdlKQo+ID4gIHsKPiA+ICsg ICAgICAgQlVJTERfQlVHX09OKEVSUkFUQV9BTkRFU19OVU1CRVIgPj0gUklTQ1ZfVkVORE9SX0VY VF9BTFRFUk5BVElWRVNfQkFTRSk7Cj4gPiArCj4gPiAgICAgICAgIGlmIChzdGFnZSA9PSBSSVND Vl9BTFRFUk5BVElWRVNfQk9PVCkKPiA+ICAgICAgICAgICAgICAgICBlcnJhdGFfcHJvYmVfaW9j cChzdGFnZSwgYXJjaGlkLCBpbXBpZCk7Cj4gPgo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yv ZXJyYXRhL3NpZml2ZS9lcnJhdGEuYyBiL2FyY2gvcmlzY3YvZXJyYXRhL3NpZml2ZS9lcnJhdGEu Ywo+ID4gaW5kZXggM2Q5YTMyZDc5MWY3Li5iNjhiMDIzMTE1YzIgMTAwNjQ0Cj4gPiAtLS0gYS9h cmNoL3Jpc2N2L2VycmF0YS9zaWZpdmUvZXJyYXRhLmMKPiA+ICsrKyBiL2FyY2gvcmlzY3YvZXJy YXRhL3NpZml2ZS9lcnJhdGEuYwo+ID4gQEAgLTEyLDYgKzEyLDcgQEAKPiA+ICAjaW5jbHVkZSA8 YXNtL2FsdGVybmF0aXZlLmg+Cj4gPiAgI2luY2x1ZGUgPGFzbS92ZW5kb3JpZF9saXN0Lmg+Cj4g PiAgI2luY2x1ZGUgPGFzbS9lcnJhdGFfbGlzdC5oPgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9y X2V4dGVuc2lvbnMuaD4KPiA+Cj4gPiAgc3RydWN0IGVycmF0YV9pbmZvX3Qgewo+ID4gICAgICAg ICBjaGFyIG5hbWVbMzJdOwo+ID4gQEAgLTkxLDYgKzkyLDggQEAgdm9pZCBzaWZpdmVfZXJyYXRh X3BhdGNoX2Z1bmMoc3RydWN0IGFsdF9lbnRyeSAqYmVnaW4sIHN0cnVjdCBhbHRfZW50cnkgKmVu ZCwKPiA+ICAgICAgICAgdTMyIGNwdV9hcHBseV9lcnJhdGEgPSAwOwo+ID4gICAgICAgICB1MzIg dG1wOwo+ID4KPiA+ICsgICAgICAgQlVJTERfQlVHX09OKEVSUkFUQV9TSUZJVkVfTlVNQkVSID49 IFJJU0NWX1ZFTkRPUl9FWFRfQUxURVJOQVRJVkVTX0JBU0UpOwo+ID4gKwo+ID4gICAgICAgICBp ZiAoc3RhZ2UgPT0gUklTQ1ZfQUxURVJOQVRJVkVTX0VBUkxZX0JPT1QpCj4gPiAgICAgICAgICAg ICAgICAgcmV0dXJuOwo+ID4KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2VycmF0YS90aGVh ZC9lcnJhdGEuYyBiL2FyY2gvcmlzY3YvZXJyYXRhL3RoZWFkL2VycmF0YS5jCj4gPiBpbmRleCBi ZjZhMGE2MzE4ZWUuLmY1MTIwZTA3YzMxOCAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3YvZXJy YXRhL3RoZWFkL2VycmF0YS5jCj4gPiArKysgYi9hcmNoL3Jpc2N2L2VycmF0YS90aGVhZC9lcnJh dGEuYwo+ID4gQEAgLTE4LDYgKzE4LDcgQEAKPiA+ICAjaW5jbHVkZSA8YXNtL2lvLmg+Cj4gPiAg I2luY2x1ZGUgPGFzbS9wYXRjaC5oPgo+ID4gICNpbmNsdWRlIDxhc20vdmVuZG9yaWRfbGlzdC5o Pgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMuaD4KPiA+Cj4gPiAgI2RlZmlu ZSBDU1JfVEhfU1hTVEFUVVMgICAgICAgICAgICAgICAgMHg1YzAKPiA+ICAjZGVmaW5lIFNYU1RB VFVTX01BRUUgICAgICAgICAgX0FDKDB4MjAwMDAwLCBVTCkKPiA+IEBAIC0xNjYsNiArMTY3LDgg QEAgdm9pZCB0aGVhZF9lcnJhdGFfcGF0Y2hfZnVuYyhzdHJ1Y3QgYWx0X2VudHJ5ICpiZWdpbiwg c3RydWN0IGFsdF9lbnRyeSAqZW5kLAo+ID4gICAgICAgICB1MzIgdG1wOwo+ID4gICAgICAgICB2 b2lkICpvbGRwdHIsICphbHRwdHI7Cj4gPgo+ID4gKyAgICAgICBCVUlMRF9CVUdfT04oRVJSQVRB X1RIRUFEX05VTUJFUiA+PSBSSVNDVl9WRU5ET1JfRVhUX0FMVEVSTkFUSVZFU19CQVNFKTsKPiA+ ICsKPiA+ICAgICAgICAgZm9yIChhbHQgPSBiZWdpbjsgYWx0IDwgZW5kOyBhbHQrKykgewo+ID4g ICAgICAgICAgICAgICAgIGlmIChhbHQtPnZlbmRvcl9pZCAhPSBUSEVBRF9WRU5ET1JfSUQpCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiA+IGRpZmYgLS1naXQgYS9hcmNo L3Jpc2N2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20v Y3B1ZmVhdHVyZS5oCj4gPiBpbmRleCAzNDc4MDU0NDYxNTEuLjU1MGQ2NjFkYzc4ZCAxMDA2NDQK PiA+IC0tLSBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCj4gPiArKysgYi9h cmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAo+ID4gQEAgLTMzLDYgKzMzLDI0IEBA IGV4dGVybiBzdHJ1Y3QgcmlzY3ZfaXNhaW5mbyBoYXJ0X2lzYVtOUl9DUFVTXTsKPiA+Cj4gPiAg dm9pZCByaXNjdl91c2VyX2lzYV9lbmFibGUodm9pZCk7Cj4gPgo+ID4gKyNkZWZpbmUgX1JJU0NW X0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0X2V4dHMsIF9zdWJzZXRfZXh0c19zaXpl KSB7ICAgICBcCj4gPiArICAgICAgIC5uYW1lID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgLnByb3Bl cnR5ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAo+ID4gKyAgICAgICAuaWQgPSBfaWQsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgIC5zdWJz ZXRfZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKPiA+ICsgICAgICAgLnN1YnNldF9leHRfc2l6ZSA9IF9zdWJzZXRfZXh0c19z aXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ ICsjZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBfaWQpIF9SSVNDVl9JU0FfRVhU X0RBVEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+ICsKPiA+ICsvKiBVc2VkIHRvIGRlY2xhcmUg cHVyZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGluc3RhbmNlKSAqLwo+ID4gKyNkZWZpbmUg X19SSVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1bmRsZWRfZXh0cykgXAo+ID4gKyAgICAg ICBfUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVNDVl9JU0FfRVhUX0lOVkFMSUQsIF9idW5k bGVkX2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0cykpCj4gPiArCj4gPiArLyogVXNlZCB0 byBkZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBzdXBlcnNldCBvZiBvdGhlciBleHRlbnNp b25zIChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+ICsjZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9T VVBFUlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwKPiA+ICsgICAgICAgX1JJU0NWX0lTQV9F WFRfREFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFSUkFZX1NJWkUoX3N1Yl9leHRzKSkKPiA+ ICsKPiA+ICAjaWYgZGVmaW5lZChDT05GSUdfUklTQ1ZfTUlTQUxJR05FRCkKPiA+ICBib29sIGNo ZWNrX3VuYWxpZ25lZF9hY2Nlc3NfZW11bGF0ZWRfYWxsX2NwdXModm9pZCk7Cj4gPiAgdm9pZCB1 bmFsaWduZWRfZW11bGF0aW9uX2ZpbmlzaCh2b2lkKTsKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jp c2N2L2luY2x1ZGUvYXNtL2h3Y2FwLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2h3Y2FwLmgK PiA+IGluZGV4IGUxN2QwMDc4YTY1MS4uMWYyZDI1OTljNjU1IDEwMDY0NAo+ID4gLS0tIGEvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9od2NhcC5oCj4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUv YXNtL2h3Y2FwLmgKPiA+IEBAIC04MCw3ICs4MCw2IEBACj4gPiAgI2RlZmluZSBSSVNDVl9JU0Ff RVhUX1pGQSAgICAgICAgICAgICAgNzEKPiA+ICAjZGVmaW5lIFJJU0NWX0lTQV9FWFRfWlRTTyAg ICAgICAgICAgICA3Mgo+ID4gICNkZWZpbmUgUklTQ1ZfSVNBX0VYVF9aQUNBUyAgICAgICAgICAg IDczCj4gPiAtI2RlZmluZSBSSVNDVl9JU0FfRVhUX1hBTkRFU1BNVSAgICAgICAgICAgICAgICA3 NAo+ID4KPiA+ICAjZGVmaW5lIFJJU0NWX0lTQV9FWFRfWExJTlVYRU5WQ0ZHICAgICAxMjcKPiA+ Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0ZW5zaW9u cy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZW5kb3JfZXh0ZW5zaW9ucy5oCj4gPiBuZXcg ZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi41ODQyZGFjYzA1Y2QKPiA+ IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4 dGVuc2lvbnMuaAo+ID4gQEAgLTAsMCArMSw0OCBAQAo+ID4gKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAyMDI0IFJp dm9zLCBJbmMKPiA+ICsgKi8KPiA+ICsKPiA+ICsjaWZuZGVmIF9BU01fVkVORE9SX0VYVEVOU0lP TlNfSAo+ID4gKyNkZWZpbmUgX0FTTV9WRU5ET1JfRVhURU5TSU9OU19ICj4gPiArCj4gPiArI2lu Y2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Cj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4L2FycmF5 X3NpemUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiA+ICsKPiA+ICsvKgo+ID4g KyAqIFRoZSBleHRlbnNpb24ga2V5cyBvZiBlYWNoIHZlbmRvciBtdXN0IGJlIHN0cmljdGx5IGxl c3MgdGhhbiB0aGlzIHZhbHVlLgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgUklTQ1ZfSVNBX1ZFTkRP Ul9FWFRfTUFYIDMyCj4gPiArCj4gPiArc3RydWN0IHJpc2N2X2lzYXZlbmRvcmluZm8gewo+ID4g KyAgICAgICBERUNMQVJFX0JJVE1BUChpc2EsIFJJU0NWX0lTQV9WRU5ET1JfRVhUX01BWCk7Cj4g PiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0IHsK PiA+ICsgICAgICAgY29uc3Qgc2l6ZV90IGV4dF9kYXRhX2NvdW50Owo+ID4gKyAgICAgICBjb25z dCBzdHJ1Y3QgcmlzY3ZfaXNhX2V4dF9kYXRhICpleHRfZGF0YTsKPiA+ICsgICAgICAgc3RydWN0 IHJpc2N2X2lzYXZlbmRvcmluZm8gcGVyX2hhcnRfaXNhX2JpdG1hcFtOUl9DUFVTXTsKPiA+ICsg ICAgICAgc3RydWN0IHJpc2N2X2lzYXZlbmRvcmluZm8gYWxsX2hhcnRzX2lzYV9iaXRtYXA7Cj4g PiArfTsKPiA+ICsKPiA+ICtleHRlcm4gc3RydWN0IHJpc2N2X2lzYV92ZW5kb3JfZXh0X2RhdGFf bGlzdCAqcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtdOwo+ID4gKwo+ID4gK2V4dGVybiBjb25z dCBzaXplX3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF9zaXplOwo+ID4gKwo+ID4gKy8qCj4g PiArICogVGhlIGFsdGVybmF0aXZlcyBuZWVkIHNvbWUgd2F5IG9mIGRpc3Rpbmd1aXNoaW5nIGJl dHdlZW4gdmVuZG9yIGV4dGVuc2lvbnMKPiA+ICsgKiBhbmQgZXJyYXRhLiBJbmNyZW1lbnRpbmcg YWxsIG9mIHRoZSB2ZW5kb3IgZXh0ZW5zaW9uIGtleXMgc28gdGhleSBhcmUgYXQKPiA+ICsgKiBs ZWFzdCAweDgwMDAgYWNjb21wbGlzaGVzIHRoYXQuCj4gPiArICovCj4gPiArI2RlZmluZSBSSVND Vl9WRU5ET1JfRVhUX0FMVEVSTkFUSVZFU19CQVNFICAgICAweDgwMDAKPiA+ICsKPiA+ICsjZGVm aW5lIFZFTkRPUl9FWFRfQUxMX0NQVVMgICAgICAgICAgICAgICAgICAgIC0xCj4gPiArCj4gPiAr Ym9vbCBfX3Jpc2N2X2lzYV92ZW5kb3JfZXh0ZW5zaW9uX2F2YWlsYWJsZShpbnQgY3B1LCB1bnNp Z25lZCBsb25nIHZlbmRvciwgdW5zaWduZWQgaW50IGJpdCk7Cj4gPiArI2RlZmluZSByaXNjdl9p c2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFpbGFibGUodmVuZG9yLCBleHQpICAgICAgXAo+ID4gKyAg ICAgICBfX3Jpc2N2X2lzYV92ZW5kb3JfZXh0ZW5zaW9uX2F2YWlsYWJsZShWRU5ET1JfRVhUX0FM TF9DUFVTLCB2ZW5kb3IsIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfIyNleHQpCj4gPiArCj4gPiArI2VuZGlm IC8qIF9BU01fVkVORE9SX0VYVEVOU0lPTlNfSCAqLwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlz Y3YvaW5jbHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMvYW5kZXMuaCBiL2FyY2gvcmlzY3YvaW5j bHVkZS9hc20vdmVuZG9yX2V4dGVuc2lvbnMvYW5kZXMuaAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uN2JiMmZjNDM0MzhmCj4gPiAtLS0gL2Rldi9udWxs Cj4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3ZlbmRvcl9leHRlbnNpb25zL2FuZGVz LmgKPiA+IEBAIC0wLDAgKzEsMTkgQEAKPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMCAqLwo+ID4gKyNpZm5kZWYgX0FTTV9SSVNDVl9WRU5ET1JfRVhURU5TSU9OU19BTkRF U19ICj4gPiArI2RlZmluZSBfQVNNX1JJU0NWX1ZFTkRPUl9FWFRFTlNJT05TX0FOREVTX0gKPiA+ ICsKPiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9leHRlbnNpb25zLmg+Cj4gPiArCj4gPiArI2lu Y2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4gPiArCj4gPiArI2RlZmluZSBSSVNDVl9JU0FfVkVORE9S X0VYVF9YQU5ERVNQTVUgICAgICAgICAwCj4gPiArCj4gPiArLyoKPiA+ICsgKiBFeHRlbnNpb24g a2V5cyBzaG91bGQgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIG1heC4KPiA+ICsgKiBJdCBpcyBzYWZl IHRvIGluY3JlbWVudCB0aGlzIHdoZW4gbmVjZXNzYXJ5Lgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUg UklTQ1ZfSVNBX1ZFTkRPUl9FWFRfTUFYX0FOREVTICAgICAgICAgICAgICAgICAzMgo+ID4gKwo+ ID4gK2V4dGVybiBzdHJ1Y3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0IHJpc2N2X2lz YV92ZW5kb3JfZXh0X2xpc3RfYW5kZXM7Cj4gPiArCj4gPiArI2VuZGlmCj4gPiBkaWZmIC0tZ2l0 IGEvYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmls ZQo+ID4gaW5kZXggODFkOTRhOGVlMTBmLi41MzM2MWM1MGZiNDYgMTAwNjQ0Cj4gPiAtLS0gYS9h cmNoL3Jpc2N2L2tlcm5lbC9NYWtlZmlsZQo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvTWFr ZWZpbGUKPiA+IEBAIC01OCw2ICs1OCw4IEBAIG9iai15ICs9IHJpc2N2X2tzeW1zLm8KPiA+ICBv YmoteSAgKz0gc3RhY2t0cmFjZS5vCj4gPiAgb2JqLXkgICs9IGNhY2hlaW5mby5vCj4gPiAgb2Jq LXkgICs9IHBhdGNoLm8KPiA+ICtvYmoteSAgKz0gdmVuZG9yX2V4dGVuc2lvbnMubwo+ID4gK29i ai15ICArPSB2ZW5kb3JfZXh0ZW5zaW9ucy8KPiA+ICBvYmoteSAgKz0gcHJvYmVzLwo+ID4gIG9i ai15ICArPSB0ZXN0cy8KPiA+ICBvYmotJChDT05GSUdfTU1VKSArPSB2ZHNvLm8gdmRzby8KPiA+ IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL3Jpc2N2 L2tlcm5lbC9jcHVmZWF0dXJlLmMKPiA+IGluZGV4IDNlZDIzNTllYWUzNS4uNjIzYjM1NzZhNmE1 IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiArKysg Yi9hcmNoL3Jpc2N2L2tlcm5lbC9jcHVmZWF0dXJlLmMKPiA+IEBAIC0yNCw2ICsyNCw3IEBACj4g PiAgI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL3NiaS5oPgo+ ID4gICNpbmNsdWRlIDxhc20vdmVjdG9yLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0 ZW5zaW9ucy5oPgo+ID4KPiA+ICAjZGVmaW5lIE5VTV9BTFBIQV9FWFRTICgneicgLSAnYScgKyAx KQo+ID4KPiA+IEBAIC0xMDAsMjQgKzEwMSw2IEBAIHN0YXRpYyBib29sIHJpc2N2X2lzYV9leHRl bnNpb25fY2hlY2soaW50IGlkKQo+ID4gICAgICAgICByZXR1cm4gdHJ1ZTsKPiA+ICB9Cj4gPgo+ ID4gLSNkZWZpbmUgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3Vic2V0X2V4dHMs IF9zdWJzZXRfZXh0c19zaXplKSB7ICAgICBcCj4gPiAtICAgICAgIC5uYW1lID0gI19uYW1lLCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK PiA+IC0gICAgICAgLnByb3BlcnR5ID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gLSAgICAgICAuaWQgPSBfaWQsICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc Cj4gPiAtICAgICAgIC5zdWJzZXRfZXh0X2lkcyA9IF9zdWJzZXRfZXh0cywgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+IC0gICAgICAgLnN1YnNldF9leHRfc2l6 ZSA9IF9zdWJzZXRfZXh0c19zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAo+ID4gLX0KPiA+IC0KPiA+IC0jZGVmaW5lIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBf aWQpIF9SSVNDVl9JU0FfRVhUX0RBVEEoX25hbWUsIF9pZCwgTlVMTCwgMCkKPiA+IC0KPiA+IC0v KiBVc2VkIHRvIGRlY2xhcmUgcHVyZSAibGFzc28iIGV4dGVuc2lvbiAoWmsgZm9yIGluc3RhbmNl KSAqLwo+ID4gLSNkZWZpbmUgX19SSVNDVl9JU0FfRVhUX0JVTkRMRShfbmFtZSwgX2J1bmRsZWRf ZXh0cykgXAo+ID4gLSAgICAgICBfUklTQ1ZfSVNBX0VYVF9EQVRBKF9uYW1lLCBSSVNDVl9JU0Ff RVhUX0lOVkFMSUQsIF9idW5kbGVkX2V4dHMsIEFSUkFZX1NJWkUoX2J1bmRsZWRfZXh0cykpCj4g PiAtCj4gPiAtLyogVXNlZCB0byBkZWNsYXJlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYSBzdXBlcnNl dCBvZiBvdGhlciBleHRlbnNpb25zIChadmJiIGZvciBpbnN0YW5jZSkgKi8KPiA+IC0jZGVmaW5l IF9fUklTQ1ZfSVNBX0VYVF9TVVBFUlNFVChfbmFtZSwgX2lkLCBfc3ViX2V4dHMpIFwKPiA+IC0g ICAgICAgX1JJU0NWX0lTQV9FWFRfREFUQShfbmFtZSwgX2lkLCBfc3ViX2V4dHMsIEFSUkFZX1NJ WkUoX3N1Yl9leHRzKSkKPiA+IC0KPiA+ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJpc2N2 X3prX2J1bmRsZWRfZXh0c1tdID0gewo+ID4gICAgICAgICBSSVNDVl9JU0FfRVhUX1pCS0IsCj4g PiAgICAgICAgIFJJU0NWX0lTQV9FWFRfWkJLQywKPiA+IEBAIC0zMDQsNyArMjg3LDYgQEAgY29u c3Qgc3RydWN0IHJpc2N2X2lzYV9leHRfZGF0YSByaXNjdl9pc2FfZXh0W10gPSB7Cj4gPiAgICAg ICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHN2aW52YWwsIFJJU0NWX0lTQV9FWFRfU1ZJTlZBTCks Cj4gPiAgICAgICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHN2bmFwb3QsIFJJU0NWX0lTQV9FWFRf U1ZOQVBPVCksCj4gPiAgICAgICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHN2cGJtdCwgUklTQ1Zf SVNBX0VYVF9TVlBCTVQpLAo+ID4gLSAgICAgICBfX1JJU0NWX0lTQV9FWFRfREFUQSh4YW5kZXNw bXUsIFJJU0NWX0lTQV9FWFRfWEFOREVTUE1VKSwKPiA+ICB9Owo+ID4KPiA+ICBjb25zdCBzaXpl X3QgcmlzY3ZfaXNhX2V4dF9jb3VudCA9IEFSUkFZX1NJWkUocmlzY3ZfaXNhX2V4dCk7Cj4gPiBA QCAtMzUxLDYgKzMzMywyMSBAQCBzdGF0aWMgdm9pZCBfX2luaXQgcmlzY3ZfcGFyc2VfaXNhX3N0 cmluZyh1bnNpZ25lZCBsb25nICp0aGlzX2h3Y2FwLCBzdHJ1Y3QgcmlzYwo+ID4gICAgICAgICAg ICAgICAgIGJvb2wgZXh0X2xvbmcgPSBmYWxzZSwgZXh0X2VyciA9IGZhbHNlOwo+ID4KPiA+ICAg ICAgICAgICAgICAgICBzd2l0Y2ggKCpleHQpIHsKPiA+ICsgICAgICAgICAgICAgICBjYXNlICd4 JzoKPiA+ICsgICAgICAgICAgICAgICBjYXNlICdYJzoKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIGlmIChhY3BpX2Rpc2FibGVkKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwcl93YXJuX29uY2UoIlZlbmRvciBleHRlbnNpb25zIGFyZSBpZ25vcmVkIGluIHJpc2N2LGlz YS4gVXNlIHJpc2N2LGlzYS1leHRlbnNpb25zIGluc3RlYWQuIik7Cj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAvKgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICogVG8gc2tpcCBhbiBl eHRlbnNpb24sIHdlIGZpbmQgaXRzIGVuZC4KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAq IEFzIG11bHRpLWxldHRlciBleHRlbnNpb25zIG11c3QgYmUgc3BsaXQgZnJvbSBvdGhlciBtdWx0 aS1sZXR0ZXIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAqIGV4dGVuc2lvbnMgd2l0aCBh biAiXyIsIHRoZSBlbmQgb2YgYSBtdWx0aS1sZXR0ZXIgZXh0ZW5zaW9uIHdpbGwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAqIGVpdGhlciBiZSB0aGUgbnVsbCBjaGFyYWN0ZXIgb3IgdGhl ICJfIiBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAqIG11bHRpLWxldHRlciBleHRlbnNpb24uCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg Ki8KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAqaXNhICYmICppc2EgIT0gJ18n OyArK2lzYSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgZXh0X2VyciA9IHRydWU7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBicmVhazsKPiA+ICAgICAgICAgICAgICAgICBjYXNlICdzJzoKPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgIC8qCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBXb3JrYXJvdW5k IGZvciBpbnZhbGlkIHNpbmdsZS1sZXR0ZXIgJ3MnICYgJ3UnIChRRU1VKS4KPiA+IEBAIC0zNjYs OCArMzYzLDYgQEAgc3RhdGljIHZvaWQgX19pbml0IHJpc2N2X3BhcnNlX2lzYV9zdHJpbmcodW5z aWduZWQgbG9uZyAqdGhpc19od2NhcCwgc3RydWN0IHJpc2MKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgIH0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGx0aHJvdWdoOwo+ID4gICAg ICAgICAgICAgICAgIGNhc2UgJ1MnOgo+ID4gLSAgICAgICAgICAgICAgIGNhc2UgJ3gnOgo+ID4g LSAgICAgICAgICAgICAgIGNhc2UgJ1gnOgo+ID4gICAgICAgICAgICAgICAgIGNhc2UgJ3onOgo+ ID4gICAgICAgICAgICAgICAgIGNhc2UgJ1onOgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAg LyoKPiA+IEBAIC01NzAsNiArNTY1LDU5IEBAIHN0YXRpYyB2b2lkIF9faW5pdCByaXNjdl9maWxs X2h3Y2FwX2Zyb21faXNhX3N0cmluZyh1bnNpZ25lZCBsb25nICppc2EyaHdjYXApCj4gPiAgICAg ICAgICAgICAgICAgYWNwaV9wdXRfdGFibGUoKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKXJo Y3QpOwo+ID4gIH0KPiA+Cj4gPiArc3RhdGljIHZvaWQgX19pbml0IHJpc2N2X2ZpbGxfY3B1X3Zl bmRvcl9leHQoc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZSwgaW50IGNwdSkKPiA+ICt7Cj4g PiArICAgICAgIGlmICghSVNfRU5BQkxFRChDT05GSUdfUklTQ1ZfSVNBX1ZFTkRPUl9FWFQpKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiA+ICsKPiA+ICsgICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3NpemU7IGkrKykgewo+ID4gKyAgICAg ICAgICAgICAgIHN0cnVjdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgKmV4dF9saXN0 ID0gcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdFtpXTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAg ICBmb3IgKGludCBqID0gMDsgaiA8IGV4dF9saXN0LT5leHRfZGF0YV9jb3VudDsgaisrKSB7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmlzY3ZfaXNhX2V4dF9kYXRh IGV4dCA9IGV4dF9saXN0LT5leHRfZGF0YVtqXTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCByaXNjdl9pc2F2ZW5kb3JpbmZvICppc2F2ZW5kb3JpbmZvID0gJmV4dF9saXN0LT5w ZXJfaGFydF9pc2FfYml0bWFwW2NwdV07Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICBpZiAob2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNwdV9ub2RlLCAicmlzY3YsaXNhLWV4dGVu c2lvbnMiLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBleHQucHJvcGVydHkpIDwgMCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29udGludWU7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAvKgo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICogQXNzdW1lIHRoYXQgc3Vic2V0IGV4dGVuc2lvbnMg YXJlIGFsbCBtZW1iZXJzIG9mIHRoZQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICogc2Ft ZSB2ZW5kb3IuCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgKi8KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGlmIChleHQuc3Vic2V0X2V4dF9zaXplKQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGV4dC5zdWJzZXRfZXh0X3NpemU7 IGsrKykKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYml0 KGV4dC5zdWJzZXRfZXh0X2lkc1trXSwgaXNhdmVuZG9yaW5mby0+aXNhKTsKPiA+ICsKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgIHNldF9iaXQoZXh0LmlkLCBpc2F2ZW5kb3JpbmZvLT5pc2Ep Owo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ICsgICAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBfX2luaXQgcmlzY3ZfZmlsbF92ZW5kb3JfZXh0X2xpc3QoaW50IGNwdSkKPiA+ ICt7Cj4gPiArICAgICAgIHN0YXRpYyBib29sIGZpcnN0ID0gdHJ1ZTsKPiAKPiBTb3JyeSwgSSBo YWQgYSBoYXJkIHRpbWUgdW5kZXJzdGFuZGluZyB0aGlzIHZhcmlhYmxlLgo+IAoKQXBvbG9naWVz IGZvciB0aGUgZGVsYXllZCByZXNwb25zZS4gV2UgY291bGQgYXNzdW1lIHRoYXQgdGhpcyBmdW5j dGlvbgppcyBhbHdheXMgY2FsbGVkIHdpdGggY3B1IDAsIGJ1dCBpbiBvcmRlciB0byBlbGltaW5h dGUgdGhhdCByZXN0cmljdGlvbgpJIG9wdGVkIGZvciBhIHN0YXRpYyB2YXJpYWJsZS4gIEhvd2V2 ZXIsIEkgZGlkIG5vdCBwcm9wZXJseSBpbXBsZW1lbnQKdGhpcywgSSB3aWxsIGdvIGludG8gbW9y ZSBkZXRhaWwgaW4gdGhlIG5leHQgcmVzcG9uc2UuCgo+ID4gKwo+ID4gKyAgICAgICBpZiAoIUlT X0VOQUJMRUQoQ09ORklHX1JJU0NWX0lTQV9WRU5ET1JfRVhUKSkKPiA+ICsgICAgICAgICAgICAg ICByZXR1cm47Cj4gPiArCj4gPiArICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmlzY3ZfaXNh X3ZlbmRvcl9leHRfbGlzdF9zaXplOyBpKyspIHsKPiA+ICsgICAgICAgICAgICAgICBzdHJ1Y3Qg cmlzY3ZfaXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0ICpleHRfbGlzdCA9IHJpc2N2X2lzYV92ZW5k b3JfZXh0X2xpc3RbaV07Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfY29weShleHRfbGlzdC0+YWxsX2hhcnRz X2lzYV9iaXRtYXAuaXNhLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZXh0X2xpc3QtPnBlcl9oYXJ0X2lzYV9iaXRtYXBbY3B1XS5pc2EsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBSSVNDVl9JU0FfVkVORE9SX0VYVF9NQVgpOwo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKPiAKPiBJcyBpdCBpbnRlbmRlZCB0 byBydW4gaW50byB0aGUgZWxzZSBjbGF1c2UgZm9yIGV4dF9saXN0IHN0YXJ0aW5nIGZyb20KPiBp ID0gMT8gSUlVQywgdGhpcyB3b3VsZCBjYXVzZSBhbGwgdmVuZG9yIGV4dGVuc2lvbnMgZm9sbG93 ZWQgYnkgQW5kZXMKPiBvbmUgbm90IGJlaW5nIGRldGVjdGVkIGluIHRoZWlyIHZlbmRvciBleHRf bGlzdCwgYmVjYXVzZSBhbGxfaGFydF9pc2EKPiB3b3VsZCBiZSBhbiBlbXB0eSBiaXRtYXAuCgpU aGFuayB5b3UgZm9yIHBvaW50aW5nIG91dCB0aGlzIGlzc3VlLiBUaGlzIGNvZGUgaXMgc3VwcG9z ZWQgdG8gc2V0IHRoZQphbGxfaGFydHNfaXNhX2JpdG1hcCBmb3IgZWFjaCB2ZW5kb3IgdG8gdGhl IGZpcnN0IGVuY291bnRlcmVkCnBlcl9oYXJ0X2lzYV9iaXRtYXAgZm9yIHRoYXQgdmVuZG9yLiBC dXQgYXMgeW91IHBvaW50IG91dCwgdGhhdCBvbmx5CndvcmtzIGZvciB0aGUgZmlyc3QgdmVuZG9y LiBJIHdpbGwgY2hhbmdlIHRoZSAiZmlyc3QiIHZhcmlhYmxlIHRvIGJlIGFuCmFycmF5IHNvIHRo ZXJlIGNhbiBiZSBhICJmaXJzdCIgdmFyaWFibGUgZm9yIGVhY2ggdmVuZG9yLgoKLSBDaGFybGll Cgo+IAo+ID4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBiaXRtYXBfYW5kKGV4dF9saXN0LT5hbGxfaGFydHNfaXNhX2JpdG1hcC5pc2EsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9saXN0LT5hbGxfaGFydHNfaXNh X2JpdG1hcC5pc2EsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9s aXN0LT5wZXJfaGFydF9pc2FfYml0bWFwW2NwdV0uaXNhLAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBSSVNDVl9JU0FfVkVORE9SX0VYVF9NQVgpOwo+ID4gKyAgICAgICAg ICAgICAgIH0KPiA+ICsgICAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICBzdGF0aWMgaW50IF9faW5p dCByaXNjdl9maWxsX2h3Y2FwX2Zyb21fZXh0X2xpc3QodW5zaWduZWQgbG9uZyAqaXNhMmh3Y2Fw KQo+ID4gIHsKPiA+ICAgICAgICAgdW5zaWduZWQgaW50IGNwdTsKPiA+IEBAIC02MTMsNiArNjYx LDggQEAgc3RhdGljIGludCBfX2luaXQgcmlzY3ZfZmlsbF9od2NhcF9mcm9tX2V4dF9saXN0KHVu c2lnbmVkIGxvbmcgKmlzYTJod2NhcCkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIH0KPiA+ ICAgICAgICAgICAgICAgICB9Cj4gPgo+ID4gKyAgICAgICAgICAgICAgIHJpc2N2X2ZpbGxfY3B1 X3ZlbmRvcl9leHQoY3B1X25vZGUsIGNwdSk7Cj4gPiArCj4gPiAgICAgICAgICAgICAgICAgb2Zf bm9kZV9wdXQoY3B1X25vZGUpOwo+ID4KPiA+ICAgICAgICAgICAgICAgICAvKgo+ID4gQEAgLTYy OCw2ICs2NzgsOCBAQCBzdGF0aWMgaW50IF9faW5pdCByaXNjdl9maWxsX2h3Y2FwX2Zyb21fZXh0 X2xpc3QodW5zaWduZWQgbG9uZyAqaXNhMmh3Y2FwKQo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgYml0bWFwX2NvcHkocmlzY3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9FWFRfTUFY KTsKPiA+ICAgICAgICAgICAgICAgICBlbHNlCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBi aXRtYXBfYW5kKHJpc2N2X2lzYSwgcmlzY3ZfaXNhLCBpc2FpbmZvLT5pc2EsIFJJU0NWX0lTQV9F WFRfTUFYKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICByaXNjdl9maWxsX3ZlbmRvcl9leHRf bGlzdChjcHUpOwo+ID4gICAgICAgICB9Cj4gPgo+ID4gICAgICAgICBpZiAoYml0bWFwX2VtcHR5 KHJpc2N2X2lzYSwgUklTQ1ZfSVNBX0VYVF9NQVgpKQo+ID4gQEAgLTc2NCwyOCArODE2LDQ1IEBA IHZvaWQgX19pbml0X29yX21vZHVsZSByaXNjdl9jcHVmZWF0dXJlX3BhdGNoX2Z1bmMoc3RydWN0 IGFsdF9lbnRyeSAqYmVnaW4sCj4gPiAgewo+ID4gICAgICAgICBzdHJ1Y3QgYWx0X2VudHJ5ICph bHQ7Cj4gPiAgICAgICAgIHZvaWQgKm9sZHB0ciwgKmFsdHB0cjsKPiA+IC0gICAgICAgdTE2IGlk LCB2YWx1ZTsKPiA+ICsgICAgICAgdTE2IGlkLCB2YWx1ZSwgdmVuZG9yOwo+ID4KPiA+ICAgICAg ICAgaWYgKHN0YWdlID09IFJJU0NWX0FMVEVSTkFUSVZFU19FQVJMWV9CT09UKQo+ID4gICAgICAg ICAgICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIGZvciAoYWx0ID0gYmVnaW47IGFsdCA8 IGVuZDsgYWx0KyspIHsKPiA+IC0gICAgICAgICAgICAgICBpZiAoYWx0LT52ZW5kb3JfaWQgIT0g MCkKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gLQo+ID4gICAgICAg ICAgICAgICAgIGlkID0gUEFUQ0hfSURfQ1BVRkVBVFVSRV9JRChhbHQtPnBhdGNoX2lkKTsKPiA+ ICsgICAgICAgICAgICAgICB2ZW5kb3IgPSBQQVRDSF9JRF9DUFVGRUFUVVJFX0lEKGFsdC0+dmVu ZG9yX2lkKTsKPiA+Cj4gPiAtICAgICAgICAgICAgICAgaWYgKGlkID49IFJJU0NWX0lTQV9FWFRf TUFYKSB7Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBXQVJOKDEsICJUaGlzIGV4dGVuc2lv biBpZDolZCBpcyBub3QgaW4gSVNBIGV4dGVuc2lvbiBsaXN0IiwgaWQpOwo+ID4gLSAgICAgICAg ICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiAtICAgICAgICAgICAgICAgfQo+ID4gKyAgICAg ICAgICAgICAgIC8qCj4gPiArICAgICAgICAgICAgICAgICogQW55IGFsdGVybmF0aXZlIHdpdGgg YSBwYXRjaF9pZCB0aGF0IGlzIGxlc3MgdGhhbgo+ID4gKyAgICAgICAgICAgICAgICAqIFJJU0NW X0lTQV9FWFRfTUFYIGlzIGludGVycHJldGVkIGFzIGEgc3RhbmRhcmQgZXh0ZW5zaW9uLgo+ID4g KyAgICAgICAgICAgICAgICAqCj4gPiArICAgICAgICAgICAgICAgICogQW55IGFsdGVybmF0aXZl IHdpdGggcGF0Y2hfaWQgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKPiA+ICsgICAgICAg ICAgICAgICAgKiB0byBSSVNDVl9WRU5ET1JfRVhUX0FMVEVSTkFUSVZFU19CQVNFIGlzIGludGVy cHJldGVkIGFzIGEKPiA+ICsgICAgICAgICAgICAgICAgKiB2ZW5kb3IgZXh0ZW5zaW9uLgo+ID4g KyAgICAgICAgICAgICAgICAqLwo+ID4gKyAgICAgICAgICAgICAgIGlmIChpZCA8IFJJU0NWX0lT QV9FWFRfTUFYKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAvKgo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICogVGhpcyBwYXRjaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBlcnJhdGEg c28gc2tpcAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICogcHJvY2Vzc2luZyBoZXJlLgo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICovCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICBpZiAoYWx0LT52ZW5kb3JfaWQgIT0gMCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29udGludWU7Cj4gPgo+ID4gLSAgICAgICAgICAgICAgIGlmICghX19yaXNjdl9pc2Ff ZXh0ZW5zaW9uX2F2YWlsYWJsZShOVUxMLCBpZCkpCj4gPiAtICAgICAgICAgICAgICAgICAgICAg ICBjb250aW51ZTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICghX19yaXNjdl9pc2Ff ZXh0ZW5zaW9uX2F2YWlsYWJsZShOVUxMLCBpZCkpCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnRpbnVlOwo+ID4KPiA+IC0gICAgICAgICAgICAgICB2YWx1ZSA9IFBBVENI X0lEX0NQVUZFQVRVUkVfVkFMVUUoYWx0LT5wYXRjaF9pZCk7Cj4gPiAtICAgICAgICAgICAgICAg aWYgKCFyaXNjdl9jcHVmZWF0dXJlX3BhdGNoX2NoZWNrKGlkLCB2YWx1ZSkpCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBBVENIX0lEX0NQVUZFQVRVUkVfVkFMVUUoYWx0LT5w YXRjaF9pZCk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJpc2N2X2NwdWZlYXR1 cmVfcGF0Y2hfY2hlY2soaWQsIHZhbHVlKSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29udGludWU7Cj4gPiArICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA+PSBSSVND Vl9WRU5ET1JfRVhUX0FMVEVSTkFUSVZFU19CQVNFKSB7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBpZiAoIV9fcmlzY3ZfaXNhX3ZlbmRvcl9leHRlbnNpb25fYXZhaWxhYmxlKFZFTkRPUl9F WFRfQUxMX0NQVVMsIHZlbmRvciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgLSBSSVNDVl9WRU5ET1JfRVhU X0FMVEVSTkFUSVZFU19CQVNFKSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y29udGludWU7Cj4gPiArICAgICAgICAgICAgICAgfSBlbHNlIHsKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIFdBUk4oMSwgIlRoaXMgZXh0ZW5zaW9uIGlkOiVkIGlzIG5vdCBpbiBJU0EgZXh0 ZW5zaW9uIGxpc3QiLCBpZCk7Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK PiA+ICsgICAgICAgICAgICAgICB9Cj4gPgo+ID4gICAgICAgICAgICAgICAgIG9sZHB0ciA9IEFM VF9PTERfUFRSKGFsdCk7Cj4gPiAgICAgICAgICAgICAgICAgYWx0cHRyID0gQUxUX0FMVF9QVFIo YWx0KTsKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9u cy5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMuYwo+ID4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uYjZjMWU3YjVkMzRiCj4gPiAtLS0g L2Rldi9udWxsCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy5j Cj4gPiBAQCAtMCwwICsxLDU2IEBACj4gPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAtb25seQo+ID4gKy8qCj4gPiArICogQ29weXJpZ2h0IDIwMjQgUml2b3MsIEluYwo+ID4g KyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yaWRfbGlzdC5oPgo+ID4gKyNpbmNs dWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9l eHRlbnNpb25zL2FuZGVzLmg+Cj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4L2FycmF5X3NpemUu aD4KPiA+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiA+ICsKPiA+ICtzdHJ1Y3QgcmlzY3Zf aXNhX3ZlbmRvcl9leHRfZGF0YV9saXN0ICpyaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0W10gPSB7 Cj4gPiArI2lmZGVmIENPTkZJR19SSVNDVl9JU0FfVkVORE9SX0VYVF9BTkRFUwo+ID4gKyAgICAg ICAmcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF9hbmRlcywKPiA+ICsjZW5kaWYKPiA+ICt9Owo+ ID4gKwo+ID4gK2NvbnN0IHNpemVfdCByaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X3NpemUgPSBB UlJBWV9TSVpFKHJpc2N2X2lzYV92ZW5kb3JfZXh0X2xpc3QpOwo+ID4gKwo+ID4gKy8qKgo+ID4g KyAqIF9fcmlzY3ZfaXNhX3ZlbmRvcl9leHRlbnNpb25fYXZhaWxhYmxlKCkgLSBDaGVjayB3aGV0 aGVyIGdpdmVuIHZlbmRvcgo+ID4gKyAqIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUgb3Igbm90Lgo+ ID4gKyAqCj4gPiArICogQGNwdTogY2hlY2sgaWYgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBvbiB0 aGlzIGNwdQo+ID4gKyAqIEB2ZW5kb3I6IHZlbmRvciB0aGF0IHRoZSBleHRlbnNpb24gaXMgYSBt ZW1iZXIgb2YKPiA+ICsgKiBAYml0OiBiaXQgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZXh0ZW5z aW9uCj4gPiArICogUmV0dXJuOiB0cnVlIG9yIGZhbHNlCj4gPiArICoKPiA+ICsgKiBOT1RFOiBX aGVuIGNwdSBpcyAtMSwgd2lsbCBjaGVjayBpZiBleHRlbnNpb24gaXMgYXZhaWxhYmxlIG9uIGFs bCBjcHVzCj4gPiArICovCj4gPiArYm9vbCBfX3Jpc2N2X2lzYV92ZW5kb3JfZXh0ZW5zaW9uX2F2 YWlsYWJsZShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHZlbmRvciwgdW5zaWduZWQgaW50IGJpdCkK PiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCByaXNjdl9pc2F2ZW5kb3JpbmZvICpibWFwOwo+ID4g KyAgICAgICBzdHJ1Y3QgcmlzY3ZfaXNhdmVuZG9yaW5mbyAqY3B1X2JtYXA7Cj4gPiArCj4gPiAr ICAgICAgIHN3aXRjaCAodmVuZG9yKSB7Cj4gPiArICAgICAgICNpZmRlZiBDT05GSUdfUklTQ1Zf SVNBX1ZFTkRPUl9FWFRfQU5ERVMKPiA+ICsgICAgICAgY2FzZSBBTkRFU19WRU5ET1JfSUQ6Cj4g PiArICAgICAgICAgICAgICAgYm1hcCA9ICZyaXNjdl9pc2FfdmVuZG9yX2V4dF9saXN0X2FuZGVz LmFsbF9oYXJ0c19pc2FfYml0bWFwOwo+ID4gKyAgICAgICAgICAgICAgIGNwdV9ibWFwID0gJnJp c2N2X2lzYV92ZW5kb3JfZXh0X2xpc3RfYW5kZXMucGVyX2hhcnRfaXNhX2JpdG1hcFtjcHVdOwo+ ID4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICAjZW5kaWYKPiA+ICsgICAgICAg ZGVmYXVsdDoKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArICAgICAgIH0K PiA+ICsKPiA+ICsgICAgICAgaWYgKGNwdSAhPSAtMSkKPiA+ICsgICAgICAgICAgICAgICBibWFw ID0gJmNwdV9ibWFwW2NwdV07Cj4gPiArCj4gPiArICAgICAgIGlmIChiaXQgPj0gUklTQ1ZfSVNB X1ZFTkRPUl9FWFRfTUFYKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPiA+ICsK PiA+ICsgICAgICAgcmV0dXJuIHRlc3RfYml0KGJpdCwgYm1hcC0+aXNhKSA/IHRydWUgOiBmYWxz ZTsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTF9HUEwoX19yaXNjdl9pc2FfdmVuZG9yX2V4dGVu c2lvbl9hdmFpbGFibGUpOwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRv cl9leHRlbnNpb25zL01ha2VmaWxlIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVuZG9yX2V4dGVuc2lv bnMvTWFrZWZpbGUKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAw MDAuLjZhNjFhZWQ5NDRmMQo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJjaC9yaXNjdi9r ZXJuZWwvdmVuZG9yX2V4dGVuc2lvbnMvTWFrZWZpbGUKPiA+IEBAIC0wLDAgKzEsMyBAQAo+ID4g KyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ID4gKwo+ID4gK29iai0k KENPTkZJR19SSVNDVl9JU0FfVkVORE9SX0VYVF9BTkRFUykgICAgICAgKz0gYW5kZXMubwo+ID4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25zL2FuZGVzLmMg Yi9hcmNoL3Jpc2N2L2tlcm5lbC92ZW5kb3JfZXh0ZW5zaW9ucy9hbmRlcy5jCj4gPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi5lYzY4OGM4ODQ1NmEKPiA+IC0t LSAvZGV2L251bGwKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZlbmRvcl9leHRlbnNpb25z L2FuZGVzLmMKPiA+IEBAIC0wLDAgKzEsMTggQEAKPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Cj4gPiArCj4gPiArI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+ Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5kb3JfZXh0ZW5zaW9ucy5oPgo+ID4gKyNpbmNsdWRlIDxh c20vdmVuZG9yX2V4dGVuc2lvbnMvYW5kZXMuaD4KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgv YXJyYXlfc2l6ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4gKwo+ID4gKy8q IEFsbCBBbmRlcyB2ZW5kb3IgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgaW4gTGludXggKi8KPiA+ICtj b25zdCBzdHJ1Y3QgcmlzY3ZfaXNhX2V4dF9kYXRhIHJpc2N2X2lzYV92ZW5kb3JfZXh0X2FuZGVz W10gPSB7Cj4gPiArICAgICAgIF9fUklTQ1ZfSVNBX0VYVF9EQVRBKHhhbmRlc3BtdSwgUklTQ1Zf SVNBX1ZFTkRPUl9FWFRfWEFOREVTUE1VKSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCByaXNj dl9pc2FfdmVuZG9yX2V4dF9kYXRhX2xpc3QgcmlzY3ZfaXNhX3ZlbmRvcl9leHRfbGlzdF9hbmRl cyA9IHsKPiA+ICsgICAgICAgLmV4dF9kYXRhX2NvdW50ID0gQVJSQVlfU0laRShyaXNjdl9pc2Ff dmVuZG9yX2V4dF9hbmRlcyksCj4gPiArICAgICAgIC5leHRfZGF0YSA9IHJpc2N2X2lzYV92ZW5k b3JfZXh0X2FuZGVzLAo+ID4gK307Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wZXJmL3Jpc2N2 X3BtdV9zYmkuYyBiL2RyaXZlcnMvcGVyZi9yaXNjdl9wbXVfc2JpLmMKPiA+IGluZGV4IDhjYmU2 ZTVmOWMzOS4uNmE1MzY0OTEwY2I3IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9wZXJmL3Jpc2N2 X3BtdV9zYmkuYwo+ID4gKysrIGIvZHJpdmVycy9wZXJmL3Jpc2N2X3BtdV9zYmkuYwo+ID4gQEAg LTI0LDYgKzI0LDggQEAKPiA+ICAjaW5jbHVkZSA8YXNtL2VycmF0YV9saXN0Lmg+Cj4gPiAgI2lu Y2x1ZGUgPGFzbS9zYmkuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KPiA+ICsj aW5jbHVkZSA8YXNtL3ZlbmRvcl9leHRlbnNpb25zLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS92ZW5k b3JfZXh0ZW5zaW9ucy9hbmRlcy5oPgo+ID4KPiA+ICAjZGVmaW5lIEFMVF9TQklfUE1VX09WRVJG TE9XKF9fb3ZsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICBhc20g dm9sYXRpbGUoQUxURVJOQVRJVkVfMiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKPiA+IEBAIC0zMiw3ICszNCw4IEBAIGFzbSB2b2xhdGlsZShBTFRFUk5BVElW RV8yKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAgICAg ICAgICAgICAgICAgVEhFQURfVkVORE9SX0lELCBFUlJBVEFfVEhFQURfUE1VLCAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiAgICAgICAgICAgICAgICAgQ09ORklHX0VSUkFUQV9USEVBRF9QTVUs ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAgICAgICAgICJjc3JyICUwLCAi IF9fc3RyaW5naWZ5KEFOREVTX0NTUl9TQ09VTlRFUk9GKSwgICAgICAgICAgICAgICAgICBcCj4g PiAtICAgICAgICAgICAgICAgMCwgUklTQ1ZfSVNBX0VYVF9YQU5ERVNQTVUsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAgICAgQU5ERVNfVkVORE9SX0lELCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAg ICAgUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfWEFOREVTUE1VICsgUklTQ1ZfVkVORE9SX0VYVF9BTFRF Uk5BVElWRVNfQkFTRSwgXAo+ID4gICAgICAgICAgICAgICAgIENPTkZJR19BTkRFU19DVVNUT01f UE1VKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gICAgICAgICA6ICI9ciIg KF9fb3ZsKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAo+ID4gICAgICAgICA6ICJtZW1vcnkiKQo+ID4gQEAgLTQxLDcgKzQ0LDggQEAgYXNtIHZvbGF0 aWxlKEFMVEVSTkFUSVZFXzIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKPiA+ICBhc20gdm9sYXRpbGUoQUxURVJOQVRJVkUoICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICAgICAgICAgImNzcmMgIiBfX3N0cmluZ2lm eShDU1JfSVApICIsICUwXG5cdCIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICAgICAg ICAgImNzcmMgIiBfX3N0cmluZ2lmeShBTkRFU19DU1JfU0xJUCkgIiwgJTBcblx0IiwgICAgICAg ICAgICAgICAgIFwKPiA+IC0gICAgICAgICAgICAgICAwLCBSSVNDVl9JU0FfRVhUX1hBTkRFU1BN VSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICBBTkRF U19WRU5ET1JfSUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgICAgICAgICAgICBSSVNDVl9JU0FfVkVORE9SX0VYVF9YQU5ERVNQTVUgKyBSSVNDVl9W RU5ET1JfRVhUX0FMVEVSTkFUSVZFU19CQVNFLCBcCj4gPiAgICAgICAgICAgICAgICAgQ09ORklH X0FOREVTX0NVU1RPTV9QTVUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAg ICAgICAgIDogOiAiciIoX19pcnFfbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCj4gPiAgICAgICAgIDogIm1lbW9yeSIpCj4gPiBAQCAtODM3LDcgKzg0 MSw3IEBAIHN0YXRpYyBpbnQgcG11X3NiaV9zZXR1cF9pcnFzKHN0cnVjdCByaXNjdl9wbXUgKnBt dSwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRlCj4gPiAgICAgICAgICAgICAgICAgICAgcmlz Y3ZfY2FjaGVkX21pbXBpZCgwKSA9PSAwKSB7Cj4gPiAgICAgICAgICAgICAgICAgcmlzY3ZfcG11 X2lycV9udW0gPSBUSEVBRF9DOVhYX1JWX0lSUV9QTVU7Cj4gPiAgICAgICAgICAgICAgICAgcmlz Y3ZfcG11X3VzZV9pcnEgPSB0cnVlOwo+ID4gLSAgICAgICB9IGVsc2UgaWYgKHJpc2N2X2lzYV9l eHRlbnNpb25fYXZhaWxhYmxlKE5VTEwsIFhBTkRFU1BNVSkgJiYKPiA+ICsgICAgICAgfSBlbHNl IGlmIChyaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFpbGFibGUoQU5ERVNfVkVORE9SX0lE LCBYQU5ERVNQTVUpICYmCj4gPiAgICAgICAgICAgICAgICAgICAgSVNfRU5BQkxFRChDT05GSUdf QU5ERVNfQ1VTVE9NX1BNVSkpIHsKPiA+ICAgICAgICAgICAgICAgICByaXNjdl9wbXVfaXJxX251 bSA9IEFOREVTX1NMSV9DQVVTRV9CQVNFICsgQU5ERVNfUlZfSVJRX1BNT1ZJOwo+ID4gICAgICAg ICAgICAgICAgIHJpc2N2X3BtdV91c2VfaXJxID0gdHJ1ZTsKPiA+Cj4gPiAtLQo+ID4gMi40NC4w Cj4gPgo+ID4KPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCj4gPiBsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKPiA+IGxpbnV4LXJpc2N2QGxpc3RzLmlu ZnJhZGVhZC5vcmcKPiA+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtcmlzY3YKPiAKPiBDaGVlcnMsCj4gQW5keQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4 LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 88543208AD for ; Sun, 9 Jun 2024 23:02:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717974153; cv=none; b=WHrTxfUg72du4bUIUaOk0bpHOQNbYhVg9nZORajNk0CwZvyagJG9eOjofDhQm3s9oi5SadYqzPUWJrZPcZYh+XxVYnXuWcUR2ClmB/jLXXxLWYgUck6WUsF3r7tzpm7zxSumGArKpt9+nkFzmWVipYC+x/A5uYs0GneC2D9tGJ0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717974153; c=relaxed/simple; bh=RQg2jiS1sqVCGvX4Yv6jz2mmKygnJ7Knlm4aXdrE1UI=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=DwoFjOhttMXEj+rO7s8hacvoXgDNVVFnHr+2nKXoRttxRLywSH7cW/1qy239d600PYkiYwSVT9bRYr3AmRN+aZiQ6DUUSmxoug4baLDjH4zqjCZ7rnn3TqvR590PmhMVCS5hVmzvzB1XrkOklEpXyRwfxlZA900+TuoqE0l/o44= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=wjYzcmQf; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="wjYzcmQf" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-704261a1f67so965188b3a.3 for ; Sun, 09 Jun 2024 16:02:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1717974150; x=1718578950; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=vPYHtBQnd/xyYKGlXkuxo2Q7Wr4C6Il5aaXzbLwkn54=; b=wjYzcmQf/HMyG8eVxsYhfx/WQ+S/EzHU57RAiLjz+FkrYemU0oIbdVqmEsf7pX9wal 3/xmUqygDk9SpW+RAuodGoi2h+MB6K5+5v6EAgWAkjlXpZG2gkcmnYvNP7sapzm4Ijq+ 1m/wSbRAPHe8CJz1g9lJ+576sbGOiG7PwtbNfWiZiP0M8qCqFW5smg1lwJSxoYVaWz0n ITPeDw+rcxoTVpFYCHNm30Fm0ovCyXrUwe0/NCPkUBEZVRy0IBPv5pqYDcwS40arr4aJ yY5f76IJtOtuTXUoMo0yewU857+9wcqCw2jjm8YrrWXMVVFA+SK5tp0XY+cx1kpqJO59 r3vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717974150; x=1718578950; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vPYHtBQnd/xyYKGlXkuxo2Q7Wr4C6Il5aaXzbLwkn54=; b=rzDF864VJoYC8qvNKOP98HhRNL0miazqQTd7h6XkhRqHeLF/z33CMRqBOwN3XxTdri w1XRTMOo5R0xn+CVE+y81QxUcUfcnY3a3gGCdQZJiYs8oUw2BXVh1Tr7SXFDLiv99wKd YIhLKm9DwJmLOvGTh556aGaweR2C48kU4omEVIOkCr2B4fJJneqtvZFoD4FwK8Yt4XIV FwfSQNITptquO8WX/R7lTxqRYwN+Ojdw3/KeV2PbaXxl8T7D7BRhBZeYywp8BNFHYTxX o3knbKjJje3TNxaQvnUjsSrijnZj94PSyTZpf49IkMiSiBJX25TyNKnbgLtQN/UYlL8f Qndw== X-Forwarded-Encrypted: i=1; AJvYcCWRCDVmhDXZx2Mq91A6IlMxt7pwyBIVB2uurapS1EVg31SUfR39i6vTMQxkjjQLTLLTXoMS7ehk0fQ5D+SKH9XF3iRp6rGcbj/Kf9O6 X-Gm-Message-State: AOJu0YwPWeFqEgl43SUYJxE09S8sjkksVLs/7tR7pXiukaFJPr+gyxIb m91nqqdX3UjJglrmchRc3rOEQjvu00qJ8Fi+A8vJXZVKG50+u8k+b5vk0f8HFIs= X-Google-Smtp-Source: AGHT+IFKAWS/i6LiEZnmcbeDkdNuO1Gx/YustS5XDiosA+DuSuyZiJ4CyNtN6hg5qB9ADlqtKzs/3g== X-Received: by 2002:a05:6a20:430d:b0:1b7:d050:93e5 with SMTP id adf61e73a8af0-1b7d05098fcmr369300637.15.1717974149226; Sun, 09 Jun 2024 16:02:29 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:917b:ada:b5b8:40af]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-704211eadf1sm3032904b3a.4.2024.06.09.16.02.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Jun 2024 16:02:28 -0700 (PDT) Date: Sun, 9 Jun 2024 16:02:26 -0700 From: Charlie Jenkins To: Andy Chiu Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , Conor Dooley , Evan Green , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/4] riscv: Extend cpufeature.c to detect vendor extensions Message-ID: References: <20240515-support_vendor_extensions-v1-0-b05dd5ea7d8d@rivosinc.com> <20240515-support_vendor_extensions-v1-1-b05dd5ea7d8d@rivosinc.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Wed, May 29, 2024 at 11:22:17PM +0800, Andy Chiu wrote: > Hi Charlie, > > On Thu, May 16, 2024 at 5:28 AM Charlie Jenkins wrote: > > > > Instead of grouping all vendor extensions into the same riscv_isa_ext > > that standard instructions use, create a struct > > "riscv_isa_vendor_ext_data_list" that allows each vendor to maintain > > their vendor extensions independently of the standard extensions. > > xandespmu is currently the only vendor extension so that is the only > > extension that is affected by this change. > > > > An additional benefit of this is that the extensions of each vendor can > > be conditionally enabled. A config RISCV_ISA_VENDOR_EXT_ANDES has been > > added to allow for that. > > > > Signed-off-by: Charlie Jenkins > > --- > > arch/riscv/Kconfig | 2 + > > arch/riscv/Kconfig.vendor | 19 ++++ > > arch/riscv/errata/andes/errata.c | 3 + > > arch/riscv/errata/sifive/errata.c | 3 + > > arch/riscv/errata/thead/errata.c | 3 + > > arch/riscv/include/asm/cpufeature.h | 18 +++ > > arch/riscv/include/asm/hwcap.h | 1 - > > arch/riscv/include/asm/vendor_extensions.h | 48 ++++++++ > > arch/riscv/include/asm/vendor_extensions/andes.h | 19 ++++ > > arch/riscv/kernel/Makefile | 2 + > > arch/riscv/kernel/cpufeature.c | 135 +++++++++++++++++------ > > arch/riscv/kernel/vendor_extensions.c | 56 ++++++++++ > > arch/riscv/kernel/vendor_extensions/Makefile | 3 + > > arch/riscv/kernel/vendor_extensions/andes.c | 18 +++ > > drivers/perf/riscv_pmu_sbi.c | 10 +- > > 15 files changed, 303 insertions(+), 37 deletions(-) > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > index be09c8836d56..fec86fba3acd 100644 > > --- a/arch/riscv/Kconfig > > +++ b/arch/riscv/Kconfig > > @@ -759,6 +759,8 @@ config RISCV_EFFICIENT_UNALIGNED_ACCESS > > > > endchoice > > > > +source "arch/riscv/Kconfig.vendor" > > + > > endmenu # "Platform type" > > > > menu "Kernel features" > > diff --git a/arch/riscv/Kconfig.vendor b/arch/riscv/Kconfig.vendor > > new file mode 100644 > > index 000000000000..6f1cdd32ed29 > > --- /dev/null > > +++ b/arch/riscv/Kconfig.vendor > > @@ -0,0 +1,19 @@ > > +menu "Vendor extensions" > > + > > +config RISCV_ISA_VENDOR_EXT > > + bool > > + > > +menu "Andes" > > +config RISCV_ISA_VENDOR_EXT_ANDES > > + bool "Andes vendor extension support" > > + select RISCV_ISA_VENDOR_EXT > > + default y > > + help > > + Say N here if you want to disable all Andes vendor extension > > + support. This will cause any Andes vendor extensions that are > > + requested by hardware probing to be ignored. > > + > > + If you don't know what to do here, say Y. > > +endmenu > > + > > +endmenu > > diff --git a/arch/riscv/errata/andes/errata.c b/arch/riscv/errata/andes/errata.c > > index f2708a9494a1..fc1a34faa5f3 100644 > > --- a/arch/riscv/errata/andes/errata.c > > +++ b/arch/riscv/errata/andes/errata.c > > @@ -17,6 +17,7 @@ > > #include > > #include > > #include > > +#include > > > > #define ANDES_AX45MP_MARCHID 0x8000000000008a45UL > > #define ANDES_AX45MP_MIMPID 0x500UL > > @@ -65,6 +66,8 @@ void __init_or_module andes_errata_patch_func(struct alt_entry *begin, struct al > > unsigned long archid, unsigned long impid, > > unsigned int stage) > > { > > + BUILD_BUG_ON(ERRATA_ANDES_NUMBER >= RISCV_VENDOR_EXT_ALTERNATIVES_BASE); > > + > > if (stage == RISCV_ALTERNATIVES_BOOT) > > errata_probe_iocp(stage, archid, impid); > > > > diff --git a/arch/riscv/errata/sifive/errata.c b/arch/riscv/errata/sifive/errata.c > > index 3d9a32d791f7..b68b023115c2 100644 > > --- a/arch/riscv/errata/sifive/errata.c > > +++ b/arch/riscv/errata/sifive/errata.c > > @@ -12,6 +12,7 @@ > > #include > > #include > > #include > > +#include > > > > struct errata_info_t { > > char name[32]; > > @@ -91,6 +92,8 @@ void sifive_errata_patch_func(struct alt_entry *begin, struct alt_entry *end, > > u32 cpu_apply_errata = 0; > > u32 tmp; > > > > + BUILD_BUG_ON(ERRATA_SIFIVE_NUMBER >= RISCV_VENDOR_EXT_ALTERNATIVES_BASE); > > + > > if (stage == RISCV_ALTERNATIVES_EARLY_BOOT) > > return; > > > > diff --git a/arch/riscv/errata/thead/errata.c b/arch/riscv/errata/thead/errata.c > > index bf6a0a6318ee..f5120e07c318 100644 > > --- a/arch/riscv/errata/thead/errata.c > > +++ b/arch/riscv/errata/thead/errata.c > > @@ -18,6 +18,7 @@ > > #include > > #include > > #include > > +#include > > > > #define CSR_TH_SXSTATUS 0x5c0 > > #define SXSTATUS_MAEE _AC(0x200000, UL) > > @@ -166,6 +167,8 @@ void thead_errata_patch_func(struct alt_entry *begin, struct alt_entry *end, > > u32 tmp; > > void *oldptr, *altptr; > > > > + BUILD_BUG_ON(ERRATA_THEAD_NUMBER >= RISCV_VENDOR_EXT_ALTERNATIVES_BASE); > > + > > for (alt = begin; alt < end; alt++) { > > if (alt->vendor_id != THEAD_VENDOR_ID) > > continue; > > diff --git a/arch/riscv/include/asm/cpufeature.h b/arch/riscv/include/asm/cpufeature.h > > index 347805446151..550d661dc78d 100644 > > --- a/arch/riscv/include/asm/cpufeature.h > > +++ b/arch/riscv/include/asm/cpufeature.h > > @@ -33,6 +33,24 @@ extern struct riscv_isainfo hart_isa[NR_CPUS]; > > > > void riscv_user_isa_enable(void); > > > > +#define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size) { \ > > + .name = #_name, \ > > + .property = #_name, \ > > + .id = _id, \ > > + .subset_ext_ids = _subset_exts, \ > > + .subset_ext_size = _subset_exts_size \ > > +} > > + > > +#define __RISCV_ISA_EXT_DATA(_name, _id) _RISCV_ISA_EXT_DATA(_name, _id, NULL, 0) > > + > > +/* Used to declare pure "lasso" extension (Zk for instance) */ > > +#define __RISCV_ISA_EXT_BUNDLE(_name, _bundled_exts) \ > > + _RISCV_ISA_EXT_DATA(_name, RISCV_ISA_EXT_INVALID, _bundled_exts, ARRAY_SIZE(_bundled_exts)) > > + > > +/* Used to declare extensions that are a superset of other extensions (Zvbb for instance) */ > > +#define __RISCV_ISA_EXT_SUPERSET(_name, _id, _sub_exts) \ > > + _RISCV_ISA_EXT_DATA(_name, _id, _sub_exts, ARRAY_SIZE(_sub_exts)) > > + > > #if defined(CONFIG_RISCV_MISALIGNED) > > bool check_unaligned_access_emulated_all_cpus(void); > > void unaligned_emulation_finish(void); > > diff --git a/arch/riscv/include/asm/hwcap.h b/arch/riscv/include/asm/hwcap.h > > index e17d0078a651..1f2d2599c655 100644 > > --- a/arch/riscv/include/asm/hwcap.h > > +++ b/arch/riscv/include/asm/hwcap.h > > @@ -80,7 +80,6 @@ > > #define RISCV_ISA_EXT_ZFA 71 > > #define RISCV_ISA_EXT_ZTSO 72 > > #define RISCV_ISA_EXT_ZACAS 73 > > -#define RISCV_ISA_EXT_XANDESPMU 74 > > > > #define RISCV_ISA_EXT_XLINUXENVCFG 127 > > > > diff --git a/arch/riscv/include/asm/vendor_extensions.h b/arch/riscv/include/asm/vendor_extensions.h > > new file mode 100644 > > index 000000000000..5842dacc05cd > > --- /dev/null > > +++ b/arch/riscv/include/asm/vendor_extensions.h > > @@ -0,0 +1,48 @@ > > +/* SPDX-License-Identifier: GPL-2.0-only */ > > +/* > > + * Copyright 2024 Rivos, Inc > > + */ > > + > > +#ifndef _ASM_VENDOR_EXTENSIONS_H > > +#define _ASM_VENDOR_EXTENSIONS_H > > + > > +#include > > + > > +#include > > +#include > > + > > +/* > > + * The extension keys of each vendor must be strictly less than this value. > > + */ > > +#define RISCV_ISA_VENDOR_EXT_MAX 32 > > + > > +struct riscv_isavendorinfo { > > + DECLARE_BITMAP(isa, RISCV_ISA_VENDOR_EXT_MAX); > > +}; > > + > > +struct riscv_isa_vendor_ext_data_list { > > + const size_t ext_data_count; > > + const struct riscv_isa_ext_data *ext_data; > > + struct riscv_isavendorinfo per_hart_isa_bitmap[NR_CPUS]; > > + struct riscv_isavendorinfo all_harts_isa_bitmap; > > +}; > > + > > +extern struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[]; > > + > > +extern const size_t riscv_isa_vendor_ext_list_size; > > + > > +/* > > + * The alternatives need some way of distinguishing between vendor extensions > > + * and errata. Incrementing all of the vendor extension keys so they are at > > + * least 0x8000 accomplishes that. > > + */ > > +#define RISCV_VENDOR_EXT_ALTERNATIVES_BASE 0x8000 > > + > > +#define VENDOR_EXT_ALL_CPUS -1 > > + > > +bool __riscv_isa_vendor_extension_available(int cpu, unsigned long vendor, unsigned int bit); > > +#define riscv_isa_vendor_extension_available(vendor, ext) \ > > + __riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, \ > > + RISCV_ISA_VENDOR_EXT_##ext) > > + > > +#endif /* _ASM_VENDOR_EXTENSIONS_H */ > > diff --git a/arch/riscv/include/asm/vendor_extensions/andes.h b/arch/riscv/include/asm/vendor_extensions/andes.h > > new file mode 100644 > > index 000000000000..7bb2fc43438f > > --- /dev/null > > +++ b/arch/riscv/include/asm/vendor_extensions/andes.h > > @@ -0,0 +1,19 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +#ifndef _ASM_RISCV_VENDOR_EXTENSIONS_ANDES_H > > +#define _ASM_RISCV_VENDOR_EXTENSIONS_ANDES_H > > + > > +#include > > + > > +#include > > + > > +#define RISCV_ISA_VENDOR_EXT_XANDESPMU 0 > > + > > +/* > > + * Extension keys should be strictly less than max. > > + * It is safe to increment this when necessary. > > + */ > > +#define RISCV_ISA_VENDOR_EXT_MAX_ANDES 32 > > + > > +extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_andes; > > + > > +#endif > > diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile > > index 81d94a8ee10f..53361c50fb46 100644 > > --- a/arch/riscv/kernel/Makefile > > +++ b/arch/riscv/kernel/Makefile > > @@ -58,6 +58,8 @@ obj-y += riscv_ksyms.o > > obj-y += stacktrace.o > > obj-y += cacheinfo.o > > obj-y += patch.o > > +obj-y += vendor_extensions.o > > +obj-y += vendor_extensions/ > > obj-y += probes/ > > obj-y += tests/ > > obj-$(CONFIG_MMU) += vdso.o vdso/ > > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > > index 3ed2359eae35..623b3576a6a5 100644 > > --- a/arch/riscv/kernel/cpufeature.c > > +++ b/arch/riscv/kernel/cpufeature.c > > @@ -24,6 +24,7 @@ > > #include > > #include > > #include > > +#include > > > > #define NUM_ALPHA_EXTS ('z' - 'a' + 1) > > > > @@ -100,24 +101,6 @@ static bool riscv_isa_extension_check(int id) > > return true; > > } > > > > -#define _RISCV_ISA_EXT_DATA(_name, _id, _subset_exts, _subset_exts_size) { \ > > - .name = #_name, \ > > - .property = #_name, \ > > - .id = _id, \ > > - .subset_ext_ids = _subset_exts, \ > > - .subset_ext_size = _subset_exts_size \ > > -} > > - > > -#define __RISCV_ISA_EXT_DATA(_name, _id) _RISCV_ISA_EXT_DATA(_name, _id, NULL, 0) > > - > > -/* Used to declare pure "lasso" extension (Zk for instance) */ > > -#define __RISCV_ISA_EXT_BUNDLE(_name, _bundled_exts) \ > > - _RISCV_ISA_EXT_DATA(_name, RISCV_ISA_EXT_INVALID, _bundled_exts, ARRAY_SIZE(_bundled_exts)) > > - > > -/* Used to declare extensions that are a superset of other extensions (Zvbb for instance) */ > > -#define __RISCV_ISA_EXT_SUPERSET(_name, _id, _sub_exts) \ > > - _RISCV_ISA_EXT_DATA(_name, _id, _sub_exts, ARRAY_SIZE(_sub_exts)) > > - > > static const unsigned int riscv_zk_bundled_exts[] = { > > RISCV_ISA_EXT_ZBKB, > > RISCV_ISA_EXT_ZBKC, > > @@ -304,7 +287,6 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = { > > __RISCV_ISA_EXT_DATA(svinval, RISCV_ISA_EXT_SVINVAL), > > __RISCV_ISA_EXT_DATA(svnapot, RISCV_ISA_EXT_SVNAPOT), > > __RISCV_ISA_EXT_DATA(svpbmt, RISCV_ISA_EXT_SVPBMT), > > - __RISCV_ISA_EXT_DATA(xandespmu, RISCV_ISA_EXT_XANDESPMU), > > }; > > > > const size_t riscv_isa_ext_count = ARRAY_SIZE(riscv_isa_ext); > > @@ -351,6 +333,21 @@ static void __init riscv_parse_isa_string(unsigned long *this_hwcap, struct risc > > bool ext_long = false, ext_err = false; > > > > switch (*ext) { > > + case 'x': > > + case 'X': > > + if (acpi_disabled) > > + pr_warn_once("Vendor extensions are ignored in riscv,isa. Use riscv,isa-extensions instead."); > > + /* > > + * To skip an extension, we find its end. > > + * As multi-letter extensions must be split from other multi-letter > > + * extensions with an "_", the end of a multi-letter extension will > > + * either be the null character or the "_" at the start of the next > > + * multi-letter extension. > > + */ > > + for (; *isa && *isa != '_'; ++isa) > > + ; > > + ext_err = true; > > + break; > > case 's': > > /* > > * Workaround for invalid single-letter 's' & 'u' (QEMU). > > @@ -366,8 +363,6 @@ static void __init riscv_parse_isa_string(unsigned long *this_hwcap, struct risc > > } > > fallthrough; > > case 'S': > > - case 'x': > > - case 'X': > > case 'z': > > case 'Z': > > /* > > @@ -570,6 +565,59 @@ static void __init riscv_fill_hwcap_from_isa_string(unsigned long *isa2hwcap) > > acpi_put_table((struct acpi_table_header *)rhct); > > } > > > > +static void __init riscv_fill_cpu_vendor_ext(struct device_node *cpu_node, int cpu) > > +{ > > + if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT)) > > + return; > > + > > + for (int i = 0; i < riscv_isa_vendor_ext_list_size; i++) { > > + struct riscv_isa_vendor_ext_data_list *ext_list = riscv_isa_vendor_ext_list[i]; > > + > > + for (int j = 0; j < ext_list->ext_data_count; j++) { > > + const struct riscv_isa_ext_data ext = ext_list->ext_data[j]; > > + struct riscv_isavendorinfo *isavendorinfo = &ext_list->per_hart_isa_bitmap[cpu]; > > + > > + if (of_property_match_string(cpu_node, "riscv,isa-extensions", > > + ext.property) < 0) > > + continue; > > + > > + /* > > + * Assume that subset extensions are all members of the > > + * same vendor. > > + */ > > + if (ext.subset_ext_size) > > + for (int k = 0; k < ext.subset_ext_size; k++) > > + set_bit(ext.subset_ext_ids[k], isavendorinfo->isa); > > + > > + set_bit(ext.id, isavendorinfo->isa); > > + } > > + } > > +} > > + > > +static void __init riscv_fill_vendor_ext_list(int cpu) > > +{ > > + static bool first = true; > > Sorry, I had a hard time understanding this variable. > Apologies for the delayed response. We could assume that this function is always called with cpu 0, but in order to eliminate that restriction I opted for a static variable. However, I did not properly implement this, I will go into more detail in the next response. > > + > > + if (!IS_ENABLED(CONFIG_RISCV_ISA_VENDOR_EXT)) > > + return; > > + > > + for (int i = 0; i < riscv_isa_vendor_ext_list_size; i++) { > > + struct riscv_isa_vendor_ext_data_list *ext_list = riscv_isa_vendor_ext_list[i]; > > + > > + if (first) { > > + bitmap_copy(ext_list->all_harts_isa_bitmap.isa, > > + ext_list->per_hart_isa_bitmap[cpu].isa, > > + RISCV_ISA_VENDOR_EXT_MAX); > > + first = false; > > Is it intended to run into the else clause for ext_list starting from > i = 1? IIUC, this would cause all vendor extensions followed by Andes > one not being detected in their vendor ext_list, because all_hart_isa > would be an empty bitmap. Thank you for pointing out this issue. This code is supposed to set the all_harts_isa_bitmap for each vendor to the first encountered per_hart_isa_bitmap for that vendor. But as you point out, that only works for the first vendor. I will change the "first" variable to be an array so there can be a "first" variable for each vendor. - Charlie > > > + } else { > > + bitmap_and(ext_list->all_harts_isa_bitmap.isa, > > + ext_list->all_harts_isa_bitmap.isa, > > + ext_list->per_hart_isa_bitmap[cpu].isa, > > + RISCV_ISA_VENDOR_EXT_MAX); > > + } > > + } > > +} > > + > > static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > { > > unsigned int cpu; > > @@ -613,6 +661,8 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > } > > } > > > > + riscv_fill_cpu_vendor_ext(cpu_node, cpu); > > + > > of_node_put(cpu_node); > > > > /* > > @@ -628,6 +678,8 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap) > > bitmap_copy(riscv_isa, isainfo->isa, RISCV_ISA_EXT_MAX); > > else > > bitmap_and(riscv_isa, riscv_isa, isainfo->isa, RISCV_ISA_EXT_MAX); > > + > > + riscv_fill_vendor_ext_list(cpu); > > } > > > > if (bitmap_empty(riscv_isa, RISCV_ISA_EXT_MAX)) > > @@ -764,28 +816,45 @@ void __init_or_module riscv_cpufeature_patch_func(struct alt_entry *begin, > > { > > struct alt_entry *alt; > > void *oldptr, *altptr; > > - u16 id, value; > > + u16 id, value, vendor; > > > > if (stage == RISCV_ALTERNATIVES_EARLY_BOOT) > > return; > > > > for (alt = begin; alt < end; alt++) { > > - if (alt->vendor_id != 0) > > - continue; > > - > > id = PATCH_ID_CPUFEATURE_ID(alt->patch_id); > > + vendor = PATCH_ID_CPUFEATURE_ID(alt->vendor_id); > > > > - if (id >= RISCV_ISA_EXT_MAX) { > > - WARN(1, "This extension id:%d is not in ISA extension list", id); > > - continue; > > - } > > + /* > > + * Any alternative with a patch_id that is less than > > + * RISCV_ISA_EXT_MAX is interpreted as a standard extension. > > + * > > + * Any alternative with patch_id that is greater than or equal > > + * to RISCV_VENDOR_EXT_ALTERNATIVES_BASE is interpreted as a > > + * vendor extension. > > + */ > > + if (id < RISCV_ISA_EXT_MAX) { > > + /* > > + * This patch should be treated as errata so skip > > + * processing here. > > + */ > > + if (alt->vendor_id != 0) > > + continue; > > > > - if (!__riscv_isa_extension_available(NULL, id)) > > - continue; > > + if (!__riscv_isa_extension_available(NULL, id)) > > + continue; > > > > - value = PATCH_ID_CPUFEATURE_VALUE(alt->patch_id); > > - if (!riscv_cpufeature_patch_check(id, value)) > > + value = PATCH_ID_CPUFEATURE_VALUE(alt->patch_id); > > + if (!riscv_cpufeature_patch_check(id, value)) > > + continue; > > + } else if (id >= RISCV_VENDOR_EXT_ALTERNATIVES_BASE) { > > + if (!__riscv_isa_vendor_extension_available(VENDOR_EXT_ALL_CPUS, vendor, > > + id - RISCV_VENDOR_EXT_ALTERNATIVES_BASE)) > > + continue; > > + } else { > > + WARN(1, "This extension id:%d is not in ISA extension list", id); > > continue; > > + } > > > > oldptr = ALT_OLD_PTR(alt); > > altptr = ALT_ALT_PTR(alt); > > diff --git a/arch/riscv/kernel/vendor_extensions.c b/arch/riscv/kernel/vendor_extensions.c > > new file mode 100644 > > index 000000000000..b6c1e7b5d34b > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions.c > > @@ -0,0 +1,56 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright 2024 Rivos, Inc > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > + > > +struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[] = { > > +#ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES > > + &riscv_isa_vendor_ext_list_andes, > > +#endif > > +}; > > + > > +const size_t riscv_isa_vendor_ext_list_size = ARRAY_SIZE(riscv_isa_vendor_ext_list); > > + > > +/** > > + * __riscv_isa_vendor_extension_available() - Check whether given vendor > > + * extension is available or not. > > + * > > + * @cpu: check if extension is available on this cpu > > + * @vendor: vendor that the extension is a member of > > + * @bit: bit position of the desired extension > > + * Return: true or false > > + * > > + * NOTE: When cpu is -1, will check if extension is available on all cpus > > + */ > > +bool __riscv_isa_vendor_extension_available(int cpu, unsigned long vendor, unsigned int bit) > > +{ > > + struct riscv_isavendorinfo *bmap; > > + struct riscv_isavendorinfo *cpu_bmap; > > + > > + switch (vendor) { > > + #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES > > + case ANDES_VENDOR_ID: > > + bmap = &riscv_isa_vendor_ext_list_andes.all_harts_isa_bitmap; > > + cpu_bmap = &riscv_isa_vendor_ext_list_andes.per_hart_isa_bitmap[cpu]; > > + break; > > + #endif > > + default: > > + return false; > > + } > > + > > + if (cpu != -1) > > + bmap = &cpu_bmap[cpu]; > > + > > + if (bit >= RISCV_ISA_VENDOR_EXT_MAX) > > + return false; > > + > > + return test_bit(bit, bmap->isa) ? true : false; > > +} > > +EXPORT_SYMBOL_GPL(__riscv_isa_vendor_extension_available); > > diff --git a/arch/riscv/kernel/vendor_extensions/Makefile b/arch/riscv/kernel/vendor_extensions/Makefile > > new file mode 100644 > > index 000000000000..6a61aed944f1 > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions/Makefile > > @@ -0,0 +1,3 @@ > > +# SPDX-License-Identifier: GPL-2.0-only > > + > > +obj-$(CONFIG_RISCV_ISA_VENDOR_EXT_ANDES) += andes.o > > diff --git a/arch/riscv/kernel/vendor_extensions/andes.c b/arch/riscv/kernel/vendor_extensions/andes.c > > new file mode 100644 > > index 000000000000..ec688c88456a > > --- /dev/null > > +++ b/arch/riscv/kernel/vendor_extensions/andes.c > > @@ -0,0 +1,18 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > + > > +#include > > +#include > > +#include > > + > > +#include > > +#include > > + > > +/* All Andes vendor extensions supported in Linux */ > > +const struct riscv_isa_ext_data riscv_isa_vendor_ext_andes[] = { > > + __RISCV_ISA_EXT_DATA(xandespmu, RISCV_ISA_VENDOR_EXT_XANDESPMU), > > +}; > > + > > +struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_andes = { > > + .ext_data_count = ARRAY_SIZE(riscv_isa_vendor_ext_andes), > > + .ext_data = riscv_isa_vendor_ext_andes, > > +}; > > diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c > > index 8cbe6e5f9c39..6a5364910cb7 100644 > > --- a/drivers/perf/riscv_pmu_sbi.c > > +++ b/drivers/perf/riscv_pmu_sbi.c > > @@ -24,6 +24,8 @@ > > #include > > #include > > #include > > +#include > > +#include > > > > #define ALT_SBI_PMU_OVERFLOW(__ovl) \ > > asm volatile(ALTERNATIVE_2( \ > > @@ -32,7 +34,8 @@ asm volatile(ALTERNATIVE_2( \ > > THEAD_VENDOR_ID, ERRATA_THEAD_PMU, \ > > CONFIG_ERRATA_THEAD_PMU, \ > > "csrr %0, " __stringify(ANDES_CSR_SCOUNTEROF), \ > > - 0, RISCV_ISA_EXT_XANDESPMU, \ > > + ANDES_VENDOR_ID, \ > > + RISCV_ISA_VENDOR_EXT_XANDESPMU + RISCV_VENDOR_EXT_ALTERNATIVES_BASE, \ > > CONFIG_ANDES_CUSTOM_PMU) \ > > : "=r" (__ovl) : \ > > : "memory") > > @@ -41,7 +44,8 @@ asm volatile(ALTERNATIVE_2( \ > > asm volatile(ALTERNATIVE( \ > > "csrc " __stringify(CSR_IP) ", %0\n\t", \ > > "csrc " __stringify(ANDES_CSR_SLIP) ", %0\n\t", \ > > - 0, RISCV_ISA_EXT_XANDESPMU, \ > > + ANDES_VENDOR_ID, \ > > + RISCV_ISA_VENDOR_EXT_XANDESPMU + RISCV_VENDOR_EXT_ALTERNATIVES_BASE, \ > > CONFIG_ANDES_CUSTOM_PMU) \ > > : : "r"(__irq_mask) \ > > : "memory") > > @@ -837,7 +841,7 @@ static int pmu_sbi_setup_irqs(struct riscv_pmu *pmu, struct platform_device *pde > > riscv_cached_mimpid(0) == 0) { > > riscv_pmu_irq_num = THEAD_C9XX_RV_IRQ_PMU; > > riscv_pmu_use_irq = true; > > - } else if (riscv_isa_extension_available(NULL, XANDESPMU) && > > + } else if (riscv_isa_vendor_extension_available(ANDES_VENDOR_ID, XANDESPMU) && > > IS_ENABLED(CONFIG_ANDES_CUSTOM_PMU)) { > > riscv_pmu_irq_num = ANDES_SLI_CAUSE_BASE + ANDES_RV_IRQ_PMOVI; > > riscv_pmu_use_irq = true; > > > > -- > > 2.44.0 > > > > > > _______________________________________________ > > linux-riscv mailing list > > linux-riscv@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-riscv > > Cheers, > Andy