Re: [PATCH v4 35/48] KVM: arm64: gic-v5: Implement save/restore mechanisms for ISTs

Sascha Bischoff <[email protected]> Fri, 31 Jul 2026 16:43:43 +0000
Newsgroups dev.linux.lists.sashiko-reviews,dev.linux.lists.kvmarm,org.kernel.vger.kvm
Message-ID <[email protected]>
T24gRnJpLCAyMDI2LTA3LTI0IGF0IDEyOjAyICswMDAwLCBzYXNoaWtvLWJvdEBrZXJuZWwub3Jn
IHdyb3RlOg0KPiBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9uISBTYXNoaWtvIEFJIHJl
dmlldyBmb3VuZCA4IHBvdGVudGlhbA0KPiBpc3N1ZShzKSB0byBjb25zaWRlcjoNCj4gLSBbQ3Jp
dGljYWxdIFJldHJpZXZpbmcgYHZjcHUwYCB3aXRob3V0IHZlcmlmeWluZyBpdCBleGlzdHMgbGVh
ZHMgdG8NCj4gYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuDQo+IC0gW0NyaXRpY2FsXSBJbnZl
cnRlZCBsb2NrIGNoZWNrIHdpdGggYGt2bV90cnlsb2NrX2FsbF92Y3B1c2AgbGVha3MNCj4gdkNQ
VSBsb2NrcyBhbmQgcnVucyBsb2NrbGVzcy4NCj4gLSBbSGlnaF0gSW5jb21wbGV0ZSBjbGVhbnVw
IG9uIElTVCByZXN0b3JlIGZhaWx1cmUgbGVhdmVzIGEgZGFuZ2xpbmcNCj4gcG9pbnRlciBpbiBg
dm1pLT5oX2xwaV9pc3RgLCBsZWFkaW5nIHRvIGEgZG91YmxlIGZyZWUuDQo+IC0gW0hpZ2hdIE1p
c3NpbmcgdmFsaWRhdGlvbiBvZiBMUEkgSU5USURzIGR1cmluZyBJU1QgcmVzdG9yZSBhbGxvd3MN
Cj4gdXNlcnNwYWNlIHRvIGluamVjdCBpbnZhbGlkIElOVElEcy4NCj4gLSBbSGlnaF0gU1BJIElT
VCByZXN0b3JlIGluY29ycmVjdGx5IHVzZXMgdGhlIGFycmF5IGluZGV4IGRpcmVjdGx5IGFzDQo+
IHRoZSBhYnNvbHV0ZSBJTlRJRCwgY2F1c2luZyB3cm9uZyBpbnRlcnJ1cHRzIHRvIGJlIGluamVj
dGVkLg0KPiAtIFtIaWdoXSBRdWllc2NlbmNlIGNoZWNrIG1hc2tzIGxvc3QgcXVpZXNjZW5jZSBz
dGF0ZSBhbmQgY2F1c2VzDQo+IHNpbGVudCBkYXRhIGNvcnJ1cHRpb24uDQo+IC0gW01lZGl1bV0g
S1ZNX0RFVl9BUk1fVkdJQ19HUlBfSVNUIHVuY29uZGl0aW9uYWxseSBmYWlscyBmb3IgVk1zDQo+
IGNvbmZpZ3VyZWQgd2l0aCAwIFNQSXMsIGJyZWFraW5nIGxpdmUgbWlncmF0aW9uLg0KPiAtIFtN
ZWRpdW1dIFRoZSBmYWlsdXJlIHBhdGggaW4gYHZnaWNfdjVfaXJzX3Jlc3RvcmVfaXN0c2AgaW5j
b3JyZWN0bHkNCj4gaXNzdWVzIGEgcmVkdW5kYW50IGBWTVRFX01BS0VfSU5WQUxJRGAgY29tbWFu
ZCwgcmlza2luZyBhIG1lbW9yeQ0KPiBsZWFrLg0KPiAtLQ0KPiANCj4gLS0tIFBhdGNoIFszNV06
IFtQQVRDSCB2NCAzNS80OF0gS1ZNOiBhcm02NDogZ2ljLXY1OiBJbXBsZW1lbnQNCj4gc2F2ZS9y
ZXN0b3JlIG1lY2hhbmlzbXMgZm9yIElTVHMgLS0tDQo+IGNvbW1pdCA1YzQ3NDUzZjE4ODRjNzRk
MTQ3ODAyOTAzOTE4OWVlNGJhNjg0MjFhDQo+IEF1dGhvcjogU2FzY2hhIEJpc2Nob2ZmIDxTYXNj
aGEuQmlzY2hvZmZAYXJtLmNvbT4NCj4gU3ViamVjdDogS1ZNOiBhcm02NDogZ2ljLXY1OiBJbXBs
ZW1lbnQgc2F2ZS9yZXN0b3JlIG1lY2hhbmlzbXMgZm9yDQo+IElTVHMNCj4gDQo+IFRoaXMgcGF0
Y2ggaW50cm9kdWNlcyBzYXZlIGFuZCByZXN0b3JlIG1lY2hhbmlzbXMgZm9yIEdJQ3Y1IEludGVy
cnVwdA0KPiBTdGF0ZQ0KPiBUYWJsZXMgKElTVHMpLiBJdCBwcm92aWRlcyB1c2Vyc3BhY2UgbWln
cmF0aW9uIHN0b3JhZ2UgZm9yIFNQSSBhbmQNCj4gTFBJDQo+IGJ1ZmZlcnMgdmlhIEtWTV9ERVZf
QVJNX1ZHSUNfR1JQX0lTVCBhbmQgZW5zdXJlcyB0aGUgVk0gaXMgcXVpZXNjZWQNCj4gYW5kDQo+
IHZhbGlkYXRlZCBkdXJpbmcgb3BlcmF0aW9ucy4NCj4gDQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv
YXJtNjQva3ZtL3ZnaWMvdmdpYy12NS10YWJsZXMuYw0KPiA+IGIvYXJjaC9hcm02NC9rdm0vdmdp
Yy92Z2ljLXY1LXRhYmxlcy5jDQo+ID4gaW5kZXggNzE4NDEwZThjOWYzYi4uZjIyMDI2NzI2NmMy
OSAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtdjUtdGFibGVzLmMN
Cj4gPiArKysgYi9hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtdjUtdGFibGVzLmMNCj4gDQo+IFsg
Li4uIF0NCj4gDQo+ID4gQEAgLTE2MzAsNiArMTYzMCwyOCBAQCBzdGF0aWMgaW50IHZnaWNfdjVf
cmVzdG9yZV9saW5lYXJfaXN0KHN0cnVjdA0KPiA+IGt2bSAqa3ZtLA0KPiA+IMKgCQkJCcKgwqDC
oMKgwqAgY29uc3Qgc3RydWN0DQo+ID4gdmdpY192NV9pc3RfZGVzYyAqaXN0LA0KPiA+IMKgCQkJ
CcKgwqDCoMKgwqAgdTMyIF9fdXNlciAqdWFkZHIsIHNpemVfdA0KPiA+IG5yX2VudHJpZXMsDQo+
ID4gwqAJCQkJwqDCoMKgwqDCoCB1MzIgaW50aWRfdHlwZSkNCj4gPiDCoHsNCj4gPiDCoAlfX2xl
MzIgaF9pc3RlOw0KPiA+IMKgCXNpemVfdCBpbmRleDsNCj4gPiDCoAlpbnQgcmV0Ow0KPiA+IMKg
DQo+ID4gwqAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnJfZW50cmllczsgaW5kZXgrKykgew0K
PiA+IMKgCQl2b2lkICpoX2lzdGVfYWRkciA9IGlzdC0+YmFzZSArIGluZGV4ICogaXN0LQ0KPiA+
ID5pc3RlX3NpemU7DQo+ID4gwqANCj4gPiDCoAkJcmV0ID0gZ2V0X3VzZXIoaF9pc3RlLCB1YWRk
cik7DQo+ID4gwqAJCWlmIChyZXQpDQo+ID4gwqAJCQlyZXR1cm4gcmV0Ow0KPiA+IMKgDQo+ID4g
wqAJCXJldCA9IHZnaWNfdjVfcmVzdG9yZV9pc3RfZW50cnkoa3ZtLCBpc3QsDQo+ID4gaF9pc3Rl
X2FkZHIsDQo+ID4gwqAJCQkJCWhfaXN0ZSwgaW5kZXgsDQo+ID4gaW50aWRfdHlwZSk7DQo+IA0K
PiBbU2V2ZXJpdHk6IEhpZ2hdDQo+IFNob3VsZCB0aGUgU1BJIGJhc2Ugb2Zmc2V0IGJlIGFkZGVk
IHRvIHRoZSBpbmRleCBoZXJlPw0KDQpOby4gRGVmaW5pdGVseSBub3QuIFRoYXQncyBhIEdJQ3Yz
IHRoaW5nLCBidXQgbm90IGEgR0lDdjUgdGhpbmcuDQoNCj4gDQo+IFdoZW4gcmVzdG9yaW5nIFNQ
SXMsIHBhc3NpbmcgdGhlIHJhdyBhcnJheSBpbmRleCBhcyB0aGUgaW50aWQgd2lsbA0KPiB0cmFj
ayBhbmQNCj4gaW5qZWN0IGludGVycnVwdHMgc3RhcnRpbmcgYXQgMC4gU2luY2UgaGFyZHdhcmUg
U1BJcyBzdGFydCBhdCBJTlRJRA0KPiAzMiwgZG9lcw0KPiB0aGlzIGluY29ycmVjdGx5IGluamVj
dCBTR0lzIGFuZCBQUElzIGluc3RlYWQgb2YgdGhlIGludGVuZGVkIFNQSXM/DQoNCkV4Y2VwdCB0
aGV5IGRvbid0IHdpdGggR0lDdjUuDQoNCj4gDQo+ID4gwqAJCWlmIChyZXQpDQo+ID4gwqAJCQly
ZXR1cm4gcmV0Ow0KPiA+IMKgDQo+ID4gwqAJCXVhZGRyKys7DQo+ID4gwqAJfQ0KPiA+IMKgDQo+
ID4gwqAJcmV0dXJuIDA7DQo+ID4gwqB9DQo+IA0KPiBbIC4uLiBdDQo+IA0KPiA+IEBAIC0xNjYy
LDYgKzE2ODQsNDEgQEAgc3RhdGljIGludA0KPiA+IHZnaWNfdjVfcmVzdG9yZV90d29fbGV2ZWxf
aXN0KHN0cnVjdCBrdm0gKmt2bSwNCj4gPiDCoAkJCQkJIGNvbnN0IHN0cnVjdA0KPiA+IHZnaWNf
djVfaXN0X2Rlc2MgKmlzdCwNCj4gPiDCoAkJCQkJIHUzMiBfX3VzZXIgKnVhZGRyLCB1MzINCj4g
PiBpbnRpZF90eXBlKQ0KPiA+IMKgew0KPiANCj4gWyAuLi4gXQ0KPiANCj4gPiDCoAkJZm9yICho
X2wyX2luZGV4ID0gMDsgaF9sMl9pbmRleCA8DQo+ID4gc2hhcGUubDJfZW50cmllczsgaF9sMl9p
bmRleCsrKSB7DQo+ID4gwqAJCQl2b2lkICpoX2lzdGVfYWRkciA9IGhfbDJfaXN0X2Jhc2UgKw0K
PiA+IMKgCQkJCQnCoMKgwqAgaF9sMl9pbmRleCAqIGlzdC0NCj4gPiA+aXN0ZV9zaXplOw0KPiA+
IMKgCQkJdTMyIGludGlkID0gaF9sMV9pbmRleCAqIHNoYXBlLmwyX2VudHJpZXMNCj4gPiArIGhf
bDJfaW5kZXg7DQo+ID4gwqANCj4gPiDCoAkJCXJldCA9IGdldF91c2VyKGhfaXN0ZSwgdWFkZHIp
Ow0KPiA+IMKgCQkJaWYgKHJldCkNCj4gPiDCoAkJCQlyZXR1cm4gcmV0Ow0KPiA+IMKgDQo+ID4g
wqAJCQlyZXQgPSB2Z2ljX3Y1X3Jlc3RvcmVfaXN0X2VudHJ5KGt2bSwgaXN0LA0KPiA+IGhfaXN0
ZV9hZGRyLA0KPiA+IMKgCQkJCQkJCWhfaXN0ZSwNCj4gPiBpbnRpZCwNCj4gPiDCoAkJCQkJCQlp
bnRpZF90eXBlDQo+ID4gKTsNCj4gDQo+IFtTZXZlcml0eTogSGlnaF0NCj4gSXMgdGhlcmUgYW55
IHZhbGlkYXRpb24gbWlzc2luZyBmb3IgdGhlIGdlbmVyYXRlZCBMUEkgSU5USURzPw0KDQpObz8g
V2h5IHdvdWxkIHRoZXJlIGJlPyBPbmx5IExQSXMgaW4gdGhlIHRhYmxlIGFyZSB2YWxpZC4gTFBJ
cyBvdXRzaWRlDQpvZiB0aGUgdGFibGUgYXJlIG5vdCB2YWxpZC4NCg0KPiANCj4gVGhlIGl0ZXJh
dGlvbiBjYWxjdWxhdGVzIGludGlkIHN0YXJ0aW5nIGZyb20gMC4gSWYgdXNlcnNwYWNlIHNldHMN
Cj4gcGVuZGluZw0KPiBiaXRzIGZvciB0aGVzZSBsb3dlciBpbmRpY2VzLCBLVk0gd291bGQgdHJh
Y2sgdGhlbSBhbmQgaW5qZWN0IHRoZW0NCj4gdmlhIHRoZQ0KPiBWRFBFTkQgaW5zdHJ1Y3Rpb24g
YXQgRUwyLg0KDQpZZXM/IEFuZD8NCg0KPiANCj4gU2luY2UgdmFsaWQgTFBJIElOVElEcyBtdXN0
IGJlID49IDgxOTIsIGNvdWxkIGluamVjdGluZyBsb3dlciBJRHMNCj4gcmVzdWx0IGluDQo+IGFy
Y2hpdGVjdHVyYWxseSB1bnByZWRpY3RhYmxlIGhhcmR3YXJlIGJlaGF2aW9yPw0KDQpObywgdGhh
dCdzIEdJQ3YzIGFnYWluIQ0KDQo+IA0KPiA+IMKgCQkJaWYgKHJldCkNCj4gPiDCoAkJCQlyZXR1
cm4gcmV0Ow0KPiA+IMKgDQo+ID4gwqAJCQl1YWRkcisrOw0KPiA+IMKgCQl9DQo+ID4gwqAJfQ0K
PiA+IMKgDQo+ID4gwqAJcmV0dXJuIDA7DQo+ID4gwqB9DQo+IA0KPiA+IGRpZmYgLS1naXQgYS9h
cmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtdjUuYw0KPiA+IGIvYXJjaC9hcm02NC9rdm0vdmdpYy92
Z2ljLXY1LmMNCj4gPiBpbmRleCA2YWYxMjY0ZWQyMzcxLi4xNTNhOGZjZDRkYjdjIDEwMDY0NA0K
PiA+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy12NS5jDQo+ID4gKysrIGIvYXJjaC9h
cm02NC9rdm0vdmdpYy92Z2ljLXY1LmMNCj4gDQo+IFsgLi4uIF0NCj4gDQo+ID4gQEAgLTEzMDEs
NiArMTMwMSwyOTIgQEAgdm9pZCB2Z2ljX3Y1X3NhdmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1DQo+
ID4gKnZjcHUpDQo+ID4gwqAJX192Z2ljX3Y1X3NhdmVfcHBpX3N0YXRlKGNwdV9pZik7DQo+ID4g
wqAJZHNiKHN5KTsNCj4gPiDCoH0NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgdmdpY192NV9pcnNf
c3RhdHVzX2lzX3F1aWVzY2VkKHUzMiBzdGF0dXNyKQ0KPiA+ICt7DQo+ID4gKwlpZiAoc3RhdHVz
ciAmIEdJQ1Y1X0lSU19TQVZFX1ZNX1NUQVRVU1JfUSkNCj4gPiArCQlyZXR1cm4gMDsNCj4gPiAr
DQo+ID4gKwlyZXR1cm4gLUVCVVNZOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IHZn
aWNfdjVfaXJzX2lzX3F1aWVzY2VkKHUxNiB2bV9pZCkNCj4gPiArew0KPiA+ICsJdTMyIHN0YXR1
c3I7DQo+ID4gKwlpbnQgcmV0Ow0KPiA+ICsNCj4gPiArCXJldCA9IHZnaWNfdjVfaXJzX3NhdmVf
dm1fb3Aodm1faWQsIGZhbHNlLCAmc3RhdHVzcik7DQo+IA0KPiBbU2V2ZXJpdHk6IEhpZ2hdDQo+
IERvZXMgdGhpcyBxdWllc2NlbmNlIGNoZWNrIHBvdGVudGlhbGx5IGxvc2UgaGFyZHdhcmUgc3Rh
dGU/DQo+IA0KPiBCeSBjYWxsaW5nIHZnaWNfdjVfaXJzX3NhdmVfdm1fb3AoKSB3aXRoIHNhdmU9
ZmFsc2UsIGl0IGlzc3VlcyBhDQo+IFNBVkVfVk1SDQo+IGNvbW1hbmQgd2l0aCBRPTEgYW5kIFM9
MCAoUXVpZXNjZSBidXQgZG9uJ3Qgc2F2ZSkuDQoNClRoYXQncyBub3Qgd2hhdCB0aGlzIGlzIGRv
aW5nLiBUaGUgUSBiaXQgaXMgdG8gcXVlcnkgaWYgdGhlIFZNIGJlY29tZQ0Kbm9uLXF1aWVzY2Vu
dC4gSXQgaXNuJ3Qgc3RvcHBpbmcgdGhlIHNhdmUuIFdlIGFyZSB0cmFja2luZyBpZiBpdCBoYXMN
CmJlY29tZSBub24tcXVpZXNjZW50IHNpbmNlIHdlIHN0YXJ0ZWQgdGhlIHNhdmUgb3AgKHRoZSBs
YXN0IHRpbWUgd2UNCndyb3RlIFM9MSkuDQoNCj4gDQo+IElmIHRoZSBWTSBoYWQgdW5leHBlY3Rl
ZGx5IHVucXVpZXNjZWQgKGUuZy4sIGludGVycnVwdGVkIGJ5DQo+IGhhcmR3YXJlKSwNCj4gZm9y
Y2luZyBpdCB0byBxdWllc2NlIHdpdGhvdXQgc2F2aW5nIHdvdWxkIGRlc3Ryb3kgaXRzIG1vZGlm
aWVkDQo+IGludGVybmFsDQo+IHN0YXRlIGJlZm9yZSBpdCBjYW4gYmUgZXhwb3J0ZWQgdG8gdXNl
cnNwYWNlLg0KDQpOb3BlLg0KDQo+IA0KPiA+ICsJaWYgKHJldCkNCj4gPiArCQlyZXR1cm4gcmV0
Ow0KPiA+ICsNCj4gPiArCXJldHVybiB2Z2ljX3Y1X2lyc19zdGF0dXNfaXNfcXVpZXNjZWQoc3Rh
dHVzcik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgdmdpY192NV9jb3B5X2lzdF9h
dHRyKHN0cnVjdCBrdm1fZGV2aWNlX2F0dHIgKmF0dHIsDQo+ID4gKwkJCQkgc3RydWN0IGt2bV92
Z2ljX3Y1X2lzdCAqaXN0X2F0dHIpDQo+ID4gK3sNCj4gPiArCXZvaWQgX191c2VyICp1YWRkciA9
ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWF0dHItDQo+ID4gPmFkZHI7DQo+ID4gKw0K
PiA+ICsJaWYgKCF1YWRkcikNCj4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKwlp
ZiAoY29weV9mcm9tX3VzZXIoaXN0X2F0dHIsIHVhZGRyLCBzaXplb2YoKmlzdF9hdHRyKSkpDQo+
ID4gKwkJcmV0dXJuIC1FRkFVTFQ7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4g
PiArDQo+ID4gK3N0YXRpYyBpbnQgdmdpY192NV92YWxpZGF0ZV9pc3RfdXNlcl9idWZmZXIoX191
NjQgYWRkciwgX191NjQNCj4gPiBzaXplLA0KPiA+ICsJCQkJCcKgwqDCoCBzaXplX3QgZXhwZWN0
ZWQpDQo+ID4gK3sNCj4gPiArCWlmICghYWRkciB8fCBzaXplICE9IGV4cGVjdGVkKQ0KPiA+ICsJ
CXJldHVybiAtRUlOVkFMOw0KPiANCj4gW1NldmVyaXR5OiBNZWRpdW1dDQo+IElzIHRoZXJlIGFu
IGlzc3VlIGhlcmUgd2hlbiByZXN0b3JpbmcgYSBWTSBjb25maWd1cmVkIHdpdGggMCBTUElzPw0K
DQpUaGF0J3Mgbm90IGRvYWJsZS4gV2UgaGF2ZSBhIG1pbmltdW0gb2YgMzIuDQoNCj4gDQo+IElm
IHVzZXJzcGFjZSBwYXNzZXMgYSBzaXplIG9mIDAgYW5kIGFuIGFkZHJlc3Mgb2YgMCwgdGhlIGNo
ZWNrIGlmDQo+ICghYWRkcikNCj4gd2lsbCByZWplY3QgaXQgd2l0aCAtRUlOVkFMLg0KPiANCj4g
SWYgdXNlcnNwYWNlIHBhc3NlcyBhIGR1bW15IG5vbi16ZXJvIGFkZHJlc3MgdG8gYnlwYXNzIHRo
aXMsIGl0IGZhaWxzDQo+IGxhdGVyDQo+IGluIHZnaWNfdjVfZ2V0X3NwaV9pc3RfZGVzYygpOg0K
PiANCj4gYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLXY1LXRhYmxlcy5jOnZnaWNfdjVfZ2V0X3Nw
aV9pc3RfZGVzYygpIHsNCj4gwqDCoMKgIC4uLg0KPiDCoMKgwqAgaWYgKCFpc3QtPmJhc2UgJiYg
dXNlcnNwYWNlX2J1ZikNCj4gwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9FTlQ7DQo+IMKgwqDC
oCAuLi4NCj4gfQ0KPiANCj4gRG9lcyB0aGlzIGNhdGNoLTIyIHByZXZlbnQgbGl2ZSBtaWdyYXRp
b24gZm9yIFZNcyB3aXRob3V0IFNQSXM/DQoNCk5vLCBiZWNhdXNlIHRoYXQncyBub3QgYSB0aGlu
ZyB3ZSBzdXBwb3J0Lg0KDQo+IA0KPiA+ICsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+IA0K
PiBbIC4uLiBdDQo+IA0KPiA+ICtpbnQgdmdpY192NV9pcnNfc2F2ZV9pc3RzKHN0cnVjdCBrdm0g
Kmt2bSwgc3RydWN0IGt2bV9kZXZpY2VfYXR0cg0KPiA+ICphdHRyKQ0KPiA+ICt7DQo+ID4gKwlz
dHJ1Y3Qga3ZtX3ZnaWNfdjVfaXN0IGlzdF9hdHRyOw0KPiA+ICsJdTE2IHZtX2lkID0gdmdpY192
NV92bV9pZChrdm0pOw0KPiA+ICsJdTMyIHN0YXR1c3I7DQo+ID4gKwlpbnQgcmV0ID0gMDsNCj4g
PiArDQo+ID4gKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOw0KPiA+ICsNCj4gPiArCWlmIChrdm1f
dHJ5bG9ja19hbGxfdmNwdXMoa3ZtKSkgew0KPiA+ICsJCW11dGV4X3VubG9jaygma3ZtLT5sb2Nr
KTsNCj4gPiArCQlyZXR1cm4gLUVCVVNZOw0KPiA+ICsJfQ0KPiANCj4gW1NldmVyaXR5OiBDcml0
aWNhbF0NCj4gSXMgdGhlIHJldHVybiB2YWx1ZSBvZiBrdm1fdHJ5bG9ja19hbGxfdmNwdXMoKSBo
YW5kbGVkIGNvcnJlY3RseQ0KPiBoZXJlPw0KPiANCj4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1
ZSBvbiBzdWNjZXNzZnVsIGxvY2sgYWNxdWlzaXRpb24gYW5kIGZhbHNlIG9uDQo+IGZhaWx1cmUu
DQoNCldoZXJlIG9uIGVhcnRoIGRpZCB5b3UgcHVsbCB0aGF0IGZyb20/IEl0IHJldHVybnMgMCBv
biBzdWNjZXNzIGFuZCAtDQpFSU5UUiBvbiBmYWlsdXJlLg0KDQo+IFJldHVybmluZyAtRUJVU1kg
d2hlbiBpdCBpcyB0cnVlIG1lYW5zIHdlIGxlYWsgdGhlIHZDUFUgbG9ja3MNCj4gYW5kIGhhbmcg
dGhlIFZNLg0KPiANCj4gQ29udmVyc2VseSwgZmFpbGluZyB0byBhY3F1aXJlIHRoZSBsb2NrcyBs
ZXRzIHVzIHByb2NlZWQgbG9ja2xlc3MsDQo+IGFuZCB0aGVuDQo+IHVubG9ja2luZyB1bm93bmVk
IG11dGV4ZXMgaW4gdGhlIG91dF91bmxvY2sgcGF0aCB3b3VsZCBjYXVzZSBpc3N1ZXMuDQoNClRo
aXMgaXNuJ3QgYW4gaXNzdWUuDQoNCj4gDQo+ID4gKw0KPiA+ICsJbXV0ZXhfbG9jaygma3ZtLT5h
cmNoLmNvbmZpZ19sb2NrKTsNCj4gDQo+IFsgLi4uIF0NCj4gDQo+ID4gK3N0YXRpYyB2b2lkIHZn
aWNfdjVfcmVzdG9yZV9jbGVhbnVwKHN0cnVjdCBrdm0gKmt2bSwNCj4gPiArCQkJCcKgwqDCoCBz
dHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsDQo+ID4gKwkJCQnCoMKgwqAgYm9vbCBscGlfaXN0X2FsbG9j
YXRlZCkNCj4gPiArew0KPiA+ICsJLyoNCj4gPiArCSAqIFdlIGFyZSBvbiB0aGUgcmVzdG9yZSBm
YWlsdXJlIHBhdGgsIHNvIHdlIGRvIGEgYmVzdC0NCj4gPiBlZmZvcnQNCj4gPiArCSAqIGNsZWFu
dXAuIFRoZXNlIGNvbW1hbmRzIG1pZ2h0IGZhaWwsIGJ1dCBhdCB0aGlzIHN0YWdlDQo+ID4gdGhp
cyBpcyB0aGUNCj4gPiArCSAqIGJlc3Qgd2UgY2FuIHJlYWxpc3RpY2FsbHkgZG8uDQo+ID4gKwkg
Ki8NCj4gPiArCWlmIChscGlfaXN0X2FsbG9jYXRlZCkgew0KPiA+ICsJCWlmICghdmdpY192NV9z
ZW5kX2NvbW1hbmQodmNwdSwNCj4gPiBWTVRFX01BS0VfSU5WQUxJRCkpDQo+ID4gKwkJCXZnaWNf
djVfbHBpX2lzdF9mcmVlKGt2bSk7DQo+ID4gKwl9DQo+IA0KPiBbU2V2ZXJpdHk6IEhpZ2hdDQo+
IENvdWxkIHRoaXMgbGVhdmUgYSBkYW5nbGluZyBwb2ludGVyIGJlaGluZD8NCj4gDQo+IFdoZW4g
dmdpY192NV9scGlfaXN0X2ZyZWUoKSBpcyBjYWxsZWQgb24gYSBmYWlsdXJlIHBhdGgsIGl0IGZy
ZWVzIHRoZQ0KPiBtZW1vcnkNCj4gYnV0IGRvZXMgbm90IHNldCB2bWktPmhfbHBpX2lzdCB0byBO
VUxMLiBJZiBhIHN1YnNlcXVlbnQgdGVhcmRvd24NCj4gaGFwcGVucyBpbg0KPiB2Z2ljX3Y1X3Zt
dGVfcmVsZWFzZSgpLCBpdCBtaWdodCBvYnNlcnZlIHRoZSBwb3B1bGF0ZWQgcG9pbnRlciBhbmQN
Cj4gYXR0ZW1wdA0KPiB0byBmcmVlIGl0IGFnYWluLCBjYXVzaW5nIGEgZG91YmxlLWZyZWUuDQoN
Ck5vLiB2Z2ljX3Y1X2xwaV9pc3RfZnJlZSgpIHVsdGltYXRlbHkgY2FsbHMNCnZnaWNfdjVfZnJl
ZV9hbGxvY2F0ZWRfbHBpX2lzdCgpLCB3aGljaCBjbGVhcnMgdm1pLT5oX2xwaV9pc3QgYWZ0ZXIN
CmZyZWVpbmcgaXQgKGFuZCBjbGVhcnMgdGhlIEwyIHBvaW50ZXIgZm9yIHR3by1sZXZlbCBJU1Rz
KS4NCkNvbnNlcXVlbnRseSwgYSBzdWJzZXF1ZW50IFZNVEUgdGVhcmRvd24gd2lsbCBub3QgYXR0
ZW1wdCBhIHNlY29uZA0KZnJlZS4NCg0KPiANCj4gW1NldmVyaXR5OiBNZWRpdW1dDQo+IEFyZSB3
ZSByaXNraW5nIGEgbWVtb3J5IGxlYWsgYnkgaXNzdWluZyBhIHJlZHVuZGFudCBpbnZhbGlkYXRl
DQo+IGNvbW1hbmQ/DQo+IA0KPiBJZiB3ZSByZWFjaCB0aGUgZmFpbHVyZSBwYXRoIGZyb20gYSBw
b2ludCB3aGVyZSB0aGUgVk1URSBpcyBhbHJlYWR5DQo+IGludmFsaWQsDQo+IHRoaXMgZnVuY3Rp
b24gd2lsbCBpc3N1ZSBWTVRFX01BS0VfSU5WQUxJRCBhZ2FpbiBiZWNhdXNlIHRoZQ0KPiB2bXRl
X2ludmFsaWQNCj4gc3RhdGUgaXMgbm90IHBhc3NlZCBpbi4gSWYgdGhlIGhhcmR3YXJlIGRyaXZl
ciByZXR1cm5zIGFuIGVycm9yIHdoZW4NCj4gYXNrZWQNCj4gdG8gaW52YWxpZGF0ZSBhbiBhbHJl
YWR5LWludmFsaWQgVk1URSwgdmdpY192NV9zZW5kX2NvbW1hbmQoKSB3aWxsDQo+IGZhaWwuDQoN
ClRoZSBoYXJkd2FyZSBoYXMgbm8gd2F5IHRvIGluZGljYXRlIHRoaXMgZXJyb3IuIEl0IHdpbGwg
anVzdCBiZSBhIE5PUC4NCg0KPiANCj4gVGhpcyB3b3VsZCBza2lwIHRoZSB2Z2ljX3Y1X2xwaV9p
c3RfZnJlZSgpIGNhbGwgYW5kIHBlcm1hbmVudGx5IGxlYWsNCj4gdGhlIExQSQ0KPiBJU1QgbWVt
b3J5Lg0KDQpFeGNlcHQgaXQgd291bGRuJ3QuIFRoaXMgaXMgZmluZS4NCg0KPiANCj4gPiArDQo+
ID4gKwl2Z2ljX3Y1X3NlbmRfY29tbWFuZCh2Y3B1LCBWTVRFX01BS0VfVkFMSUQpOw0KPiA+ICt9
DQo+ID4gKw0KPiA+ICtpbnQgdmdpY192NV9pcnNfcmVzdG9yZV9pc3RzKHN0cnVjdCBrdm0gKmt2
bSwgc3RydWN0DQo+ID4ga3ZtX2RldmljZV9hdHRyICphdHRyKQ0KPiA+ICt7DQo+ID4gKwlib29s
IGxwaV9pc3RfYWxsb2NhdGVkID0gZmFsc2UsIHZtdGVfaW52YWxpZCA9IGZhbHNlOw0KPiA+ICsJ
c3RydWN0IGt2bV92Y3B1ICp2Y3B1MCA9IGt2bV9nZXRfdmNwdShrdm0sIDApOw0KPiANCj4gW1Nl
dmVyaXR5OiBDcml0aWNhbF0NCj4gV2hhdCBoYXBwZW5zIGlmIHVzZXJzcGFjZSBpbnZva2VzIHRo
aXMgaW9jdGwgYmVmb3JlIGNyZWF0aW5nIGFueQ0KPiB2Q1BVcz8NCj4gDQo+IGt2bV9nZXRfdmNw
dShrdm0sIDApIHdvdWxkIHJldHVybiBOVUxMLiBMYXRlciwgdGhpcyBOVUxMIHZjcHUwIGlzDQo+
IHBhc3NlZCB0bw0KPiB2Z2ljX3Y1X3NlbmRfY29tbWFuZCgpLCB3aGljaCBkZXJlZmVyZW5jZXMg
aXQgaW5zaWRlDQo+IHZnaWNfdjVfdnBlX2RiKCkuDQo+IA0KPiBTaG91bGQgd2UgdmVyaWZ5IHZj
cHUwIGV4aXN0cyBiZWZvcmUgdXNpbmcgaXQgdG8gcHJldmVudCBhIHBvdGVudGlhbA0KPiBOVUxM
DQo+IHBvaW50ZXIgZGVyZWZlcmVuY2U/DQoNCldlIHJlamVjdCBhbiB1bmluaXRpYWxpc2VkIHZH
SUMgYmVmb3JlIHdlIHJlYWNoIHRoaXMgcG9pbnQuIFdlIHJlcXVpcmUNCnZjcHUwIGFzIHBhcnQg
b2YgaW5pdGlhbGlzaW5nIHRoZSB2R0lDdjUgc28gd2UgY2FuJ3QgbWFrZSBpdCB0aGlzIGZhcg0K
d2l0aG91dCBhIHZDUFUwLg0KDQo+IA0KPiA+ICsJc3RydWN0IGt2bV92Z2ljX3Y1X2lzdCBpc3Rf
YXR0cjsNCj4gPiArCWludCByZXQgPSAwOw0KPiA+ICsNCj4gPiArCW11dGV4X2xvY2soJmt2bS0+
bG9jayk7DQo+ID4gKw0KPiA+ICsJaWYgKGt2bV90cnlsb2NrX2FsbF92Y3B1cyhrdm0pKSB7DQo+
ID4gKwkJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOw0KPiA+ICsJCXJldHVybiAtRUJVU1k7DQo+
ID4gKwl9DQo+IA0KPiBbU2V2ZXJpdHk6IENyaXRpY2FsXQ0KPiBBcyBub3RlZCBpbiB2Z2ljX3Y1
X2lyc19zYXZlX2lzdHMoKSwgZG9lcyB0aGlzIGNvcnJlY3RseSBoYW5kbGUgdGhlDQo+IGJvb2xl
YW4NCj4gcmV0dXJuIHZhbHVlIG9mIGt2bV90cnlsb2NrX2FsbF92Y3B1cygpPyBJdCBsb29rcyBs
aWtlIHRoaXMgYmVoYXZlcw0KPiBpbiB0aGUNCj4gZXhhY3Qgb3Bwb3NpdGUgd2F5IGFzIGludGVu
ZGVkLCBsZWFraW5nIGxvY2tzIG9uIHN1Y2Nlc3MgYW5kIHJ1bm5pbmcNCj4gbG9ja2xlc3Mgb24g
ZmFpbHVyZS4NCg0KVGhpcyBhZ2Fpbj8gTm8uIE5vdCBhbiBpc3N1ZS4gU2VlIGFib3ZlLg0KDQo+
IA0KPiA+ICsNCj4gPiArCW11dGV4X2xvY2soJmt2bS0+YXJjaC5jb25maWdfbG9jayk7DQo+ID4g
Kw0KPiA+ICsJaWYgKCF2Z2ljX2luaXRpYWxpemVkKGt2bSkpIHsNCj4gDQo+IFsgLi4uIF0NCj4g
DQoNClRoYW5rcywNClNhc2NoYQ0K