From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx2.zhaoxin.com (mx2.zhaoxin.com [203.110.167.99]) by mx.groups.io with SMTP id smtpd.web11.153366.1672121964567441250 for ; Mon, 26 Dec 2022 22:19:25 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: zhaoxin.com, ip: 203.110.167.99, mailfrom: tigerliu@zhaoxin.com) X-ASG-Debug-ID: 1672121957-1eb14e3393315d0001-xsgHyH Received: from ZXSHMBX3.zhaoxin.com (ZXSHMBX3.zhaoxin.com [10.28.252.165]) by mx2.zhaoxin.com with ESMTP id 44AnEdKcq1gyYmop (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Tue, 27 Dec 2022 14:19:17 +0800 (CST) X-Barracuda-Envelope-From: TigerLiu@zhaoxin.com X-Barracuda-RBL-Trusted-Forwarder: 10.28.252.165 Received: from zxbjmbx1.zhaoxin.com (10.29.252.163) by ZXSHMBX3.zhaoxin.com (10.28.252.165) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.12; Tue, 27 Dec 2022 14:19:16 +0800 Received: from ZXBJMBX02.zhaoxin.com (10.29.252.6) by zxbjmbx1.zhaoxin.com (10.29.252.163) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.12; Tue, 27 Dec 2022 14:19:15 +0800 X-Barracuda-RBL-Trusted-Forwarder: 10.28.252.165 Received: from ZXBJMBX02.zhaoxin.com ([fe80::9c1:cc5e:95b0:19af]) by ZXBJMBX02.zhaoxin.com ([fe80::9c1:cc5e:95b0:19af%8]) with mapi id 15.01.2507.012; Tue, 27 Dec 2022 14:19:15 +0800 X-Barracuda-RBL-Trusted-Forwarder: 10.29.252.163 From: "Tiger Liu(BJ-RD)" To: edk2-devel-groups-io , Rebecca Cran Subject: Re: [edk2-devel] [PATCH v2 2/2] MdeModulePkg: Add new Application/MpServicesTest application Thread-Topic: [edk2-devel] [PATCH v2 2/2] MdeModulePkg: Add new Application/MpServicesTest application X-ASG-Orig-Subj: Re: [edk2-devel] [PATCH v2 2/2] MdeModulePkg: Add new Application/MpServicesTest application Thread-Index: AdkZuuXN9KTMG4XFlEO1Br9g0TxAaA== Date: Tue, 27 Dec 2022 06:19:15 +0000 Message-ID: Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.29.32.37] MIME-Version: 1.0 X-Barracuda-Connect: ZXSHMBX3.zhaoxin.com[10.28.252.165] X-Barracuda-Start-Time: 1672121957 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://10.28.252.36:4443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at zhaoxin.com X-Barracuda-Scan-Msg-Size: 142971 X-Barracuda-BRTS-Status: 1 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Spam-Score: -1.79 X-Barracuda-Spam-Status: No, SCORE=-1.79 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=9.0 tests=HTML_MESSAGE, SH_BIG5_05413_BODY_104, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.103123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.21 SH_BIG5_05413_BODY_104 BODY: Body: contain "UNSUBSCRIBE" 0.00 HTML_MESSAGE BODY: HTML included in message Content-Language: zh-CN Content-Type: multipart/alternative; boundary="_000_c17e8e9e81184ce5a91e0086060da864zhaoxincom_" --_000_c17e8e9e81184ce5a91e0086060da864zhaoxincom_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 SGVsbG86DQoNCkRvZXMgdGhpcyBNcFNlcnZpY2VzVGVzdCBhcHAgaGF2ZSBiZWVuIG1lcmdlZCBp bnRvIG1hc3RlciBicmFuY2g/DQoNCkkgY291bGQgbm90IGZpbmQgaXQgaW4gY3VycmVudCBHaXRI dWIgY29kZSBiYXNlLg0KDQoNCg0KVGhhbmtzDQoNCi0tLS0t08q8/tStvP4tLS0tLQ0KDQq3orz+ yMs6IGRldmVsQGVkazIuZ3JvdXBzLmlvPG1haWx0bzpkZXZlbEBlZGsyLmdyb3Vwcy5pbz4gPGRl dmVsQGVkazIuZ3JvdXBzLmlvPG1haWx0bzpkZXZlbEBlZGsyLmdyb3Vwcy5pbz4+ILT6se0gUmVi ZWNjYSBDcmFuDQoNCreiy83KsbzkOiAyMDIyxOo51MI3yNUgMTI6MDMNCg0KytW8/sjLOiBkZXZl bEBlZGsyLmdyb3Vwcy5pbzxtYWlsdG86ZGV2ZWxAZWRrMi5ncm91cHMuaW8+OyBhcmRiQGtlcm5l bC5vcmc8bWFpbHRvOmFyZGJAa2VybmVsLm9yZz47IHF1aWNfbGxpbmRob2xAcXVpY2luYy5jb208 bWFpbHRvOnF1aWNfbGxpbmRob2xAcXVpY2luYy5jb20+OyBTYW1pIE11amF3YXIgPHNhbWkubXVq YXdhckBhcm0uY29tPG1haWx0bzpzYW1pLm11amF3YXJAYXJtLmNvbT4+OyBKaWFuIEogV2FuZyA8 amlhbi5qLndhbmdAaW50ZWwuY29tPG1haWx0bzpqaWFuLmoud2FuZ0BpbnRlbC5jb20+PjsgTGlt aW5nIEdhbyA8Z2FvbGltaW5nQGJ5b3NvZnQuY29tLmNuPG1haWx0bzpnYW9saW1pbmdAYnlvc29m dC5jb20uY24+Pg0KDQqzrcvNOiBSZWJlY2NhIENyYW4gPHJlYmVjY2FAcXVpY2luYy5jb208bWFp bHRvOnJlYmVjY2FAcXVpY2luYy5jb20+Pg0KDQrW98ziOiBbZWRrMi1kZXZlbF0gW1BBVENIIHYy IDIvMl0gTWRlTW9kdWxlUGtnOiBBZGQgbmV3IEFwcGxpY2F0aW9uL01wU2VydmljZXNUZXN0IGFw cGxpY2F0aW9uDQoNCg0KDQpUaGUgTXBTZXJ2aWNlc1Rlc3QgYXBwbGljYXRpb24gZXhlcmNpc2Vz IHRoZSBFRklfTVBfU0VSVklDRVNfUFJPVE9DT0wuDQoNCg0KDQp1c2FnZToNCg0KICBNcFNlcnZp Y2VzVGVzdCAtQSBbLU9dDQoNCiAgTXBTZXJ2aWNlc1Rlc3QgLVQgPFRpbWVvdXQ+DQoNCiAgTXBT ZXJ2aWNlc1Rlc3QgLVMgPFByb2Nlc3NvciAjPg0KDQogIE1wU2VydmljZXNUZXN0IC1QDQoNCiAg TXBTZXJ2aWNlc1Rlc3QgLVUgPFByb2Nlc3NvciAjPg0KDQogIE1wU2VydmljZXNUZXN0IC1XDQoN CiAgTXBTZXJ2aWNlc1Rlc3QgLUUgPFByb2Nlc3NvciAjPg0KDQogIE1wU2VydmljZXNUZXN0IC1E IDxQcm9jZXNzb3IgIz4NCg0KICBNcFNlcnZpY2VzVGVzdCAtaA0KDQoNCg0KUGFyYW1ldGVyOg0K DQogIC1BOiAgUnVuIGFsbCBBUHMuDQoNCiAgLU86ICBSdW4gQVBzIHNlcXVlbnRpYWxseSAodXNl IHdpdGggLUEpLg0KDQogIC1UOiAgU3BlY2lmeSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVm YXVsdCBpcyB0byB3YWl0IGZvcmV2ZXIuDQoNCiAgLVM6ICBTcGVjaWZ5IHRoZSBzaW5nbGUgQVAg dG8gcnVuLg0KDQogIC1QOiAgUHJpbnQgcHJvY2Vzc29yIGluZm9ybWF0aW9uLg0KDQogIC1VOiAg U2V0IHRoZSBzcGVjaWZpZWQgQVAgdG8gdGhlIFVuaGVhbHRoeSBzdGF0dXMgKHVzZSB3aXRoIC1F Ly1EKS4NCg0KICAtVzogIFJ1biBXaG9BbUkgYW5kIHByaW50IGluZGV4IG9mIEJTUC4NCg0KICAt RTogIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEFQLg0KDQogIC1EOiAgRGlzYWJsZSB0aGUgc3BlY2lm aWVkIEFQLg0KDQogIC1oOiAgUHJpbnQgdGhpcyBoZWxwIHBhZ2UuDQoNCg0KDQpTaWduZWQtb2Zm LWJ5OiBSZWJlY2NhIENyYW4gPHJlYmVjY2FAcXVpY2luYy5jb208bWFpbHRvOnJlYmVjY2FAcXVp Y2luYy5jb20+Pg0KDQpSZXZpZXdlZC1ieTogQXJkIEJpZXNoZXV2ZWwgPGFyZGJAa2VybmVsLm9y ZzxtYWlsdG86YXJkYkBrZXJuZWwub3JnPj4NCg0KLS0tDQoNCk1kZU1vZHVsZVBrZy9NZGVNb2R1 bGVQa2cuZHNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKw0KDQpNZGVNb2R1 bGVQa2cvQXBwbGljYXRpb24vTXBTZXJ2aWNlc1Rlc3QvTXBTZXJ2aWNlc1Rlc3QuaW5mIHwgIDQw ICsrDQoNCk1kZU1vZHVsZVBrZy9BcHBsaWNhdGlvbi9NcFNlcnZpY2VzVGVzdC9PcHRpb25zLmgg ICAgICAgICAgfCAgMzkgKysNCg0KTWRlTW9kdWxlUGtnL0FwcGxpY2F0aW9uL01wU2VydmljZXNU ZXN0L01wU2VydmljZXNUZXN0LmMgICB8IDU1NSArKysrKysrKysrKysrKysrKysrKw0KDQpNZGVN b2R1bGVQa2cvQXBwbGljYXRpb24vTXBTZXJ2aWNlc1Rlc3QvT3B0aW9ucy5jICAgICAgICAgIHwg MjE1ICsrKysrKysrDQoNCjUgZmlsZXMgY2hhbmdlZCwgODUxIGluc2VydGlvbnMoKykNCg0KDQoN CmRpZmYgLS1naXQgYS9NZGVNb2R1bGVQa2cvTWRlTW9kdWxlUGtnLmRzYyBiL01kZU1vZHVsZVBr Zy9NZGVNb2R1bGVQa2cuZHNjIGluZGV4IDQ1YThlYzg0YWQ2OS4uMjk1ZmY0ZGRmY2Q4IDEwMDY0 NA0KDQotLS0gYS9NZGVNb2R1bGVQa2cvTWRlTW9kdWxlUGtnLmRzYw0KDQorKysgYi9NZGVNb2R1 bGVQa2cvTWRlTW9kdWxlUGtnLmRzYw0KDQpAQCAtMTY2LDYgKzE2Niw3IEBAIFtMaWJyYXJ5Q2xh c3Nlcy5jb21tb24uVUVGSV9BUFBMSUNBVElPTl0NCg0KICAgTWVtb3J5QWxsb2NhdGlvbkxpYnxN ZGVQa2cvTGlicmFyeS9VZWZpTWVtb3J5QWxsb2NhdGlvbkxpYi9VZWZpTWVtb3J5QWxsb2NhdGlv bkxpYi5pbmYNCg0KICAgRGVidWdMaWJ8TWRlUGtnL0xpYnJhcnkvVWVmaURlYnVnTGliU3RkRXJy L1VlZmlEZWJ1Z0xpYlN0ZEVyci5pbmYNCg0KICAgRmlsZUhhbmRsZUxpYnxNZGVQa2cvTGlicmFy eS9VZWZpRmlsZUhhbmRsZUxpYi9VZWZpRmlsZUhhbmRsZUxpYi5pbmYNCg0KKyAgU2hlbGxMaWJ8 U2hlbGxQa2cvTGlicmFyeS9VZWZpU2hlbGxMaWIvVWVmaVNoZWxsTGliLmluZg0KDQogW0xpYnJh cnlDbGFzc2VzLmNvbW1vbi5NTV9TVEFOREFMT05FXQ0KDQogICBIb2JMaWJ8TWRlTW9kdWxlUGtn L0xpYnJhcnkvQmFzZUhvYkxpYk51bGwvQmFzZUhvYkxpYk51bGwuaW5mDQoNCkBAIC00NDUsNiAr NDQ2LDcgQEAgW0NvbXBvbmVudHNdDQoNCiAgIE1kZU1vZHVsZVBrZy9MaWJyYXJ5L0Jhc2VWYXJp YWJsZUZsYXNoSW5mb0xpYi9CYXNlVmFyaWFibGVGbGFzaEluZm9MaWIuaW5mDQoNCiBbQ29tcG9u ZW50cy5JQTMyLCBDb21wb25lbnRzLlg2NCwgQ29tcG9uZW50cy5BQVJDSDY0XQ0KDQorICBNZGVN b2R1bGVQa2cvQXBwbGljYXRpb24vTXBTZXJ2aWNlc1Rlc3QvTXBTZXJ2aWNlc1Rlc3QuaW5mDQoN CiAgIE1kZU1vZHVsZVBrZy9Vbml2ZXJzYWwvRWJjRHhlL0ViY0R4ZS5pbmYNCg0KICAgTWRlTW9k dWxlUGtnL1VuaXZlcnNhbC9FYmNEeGUvRWJjRGVidWdnZXIuaW5mDQoNCiAgIE1kZU1vZHVsZVBr Zy9Vbml2ZXJzYWwvRWJjRHhlL0ViY0RlYnVnZ2VyQ29uZmlnLmluZg0KDQpkaWZmIC0tZ2l0IGEv TWRlTW9kdWxlUGtnL0FwcGxpY2F0aW9uL01wU2VydmljZXNUZXN0L01wU2VydmljZXNUZXN0Lmlu ZiBiL01kZU1vZHVsZVBrZy9BcHBsaWNhdGlvbi9NcFNlcnZpY2VzVGVzdC9NcFNlcnZpY2VzVGVz dC5pbmYNCg0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCg0KaW5kZXggMDAwMDAwMDAwMDAwLi4wN2Vl NGFmZWM4NDUNCg0KLS0tIC9kZXYvbnVsbA0KDQorKysgYi9NZGVNb2R1bGVQa2cvQXBwbGljYXRp b24vTXBTZXJ2aWNlc1Rlc3QvTXBTZXJ2aWNlc1Rlc3QuaW5mDQoNCkBAIC0wLDAgKzEsNDAgQEAN Cg0KKyMjIEBmaWxlDQoNCisjICBVRUZJIEFwcGxpY2F0aW9uIHRvIGV4ZXJjaXNlIEVGSV9NUF9T RVJWSUNFU19QUk9UT0NPTC4NCg0KKyMNCg0KKyMgIENvcHlyaWdodCAoYykgMjAyMiwgUXVhbGNv bW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxsIHJpZ2h0cw0KDQorcmVzZXJ2ZWQuPEJSPiAj ICMgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1DbGF1c2UtUGF0ZW50ICMgIyMNCg0K Kw0KDQorW0RlZmluZXNdDQoNCisgIElORl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICA9IDEu MjkNCg0KKyAgQkFTRV9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gTXBTZXJ2aWNlc1Rlc3QN Cg0KKyAgRklMRV9HVUlEICAgICAgICAgICAgICAgICAgICAgID0gNDNlOWRlZmEtNzIwOS00YjBk LWIxMzYtY2M0Y2EwMmNiNDY5DQoNCisgIE1PRFVMRV9UWVBFICAgICAgICAgICAgICAgICAgICA9 IFVFRklfQVBQTElDQVRJT04NCg0KKyAgVkVSU0lPTl9TVFJJTkcgICAgICAgICAgICAgICAgID0g MC4xDQoNCisgIEVOVFJZX1BPSU5UICAgICAgICAgICAgICAgICAgICA9IFVlZmlNYWluDQoNCisN Cg0KKyMNCg0KKyMgVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyBmb3IgcmVmZXJlbmNlIG9u bHkgYW5kIG5vdCByZXF1aXJlZCBieSB0aGUgYnVpbGQgdG9vbHMuDQoNCisjDQoNCisjICBWQUxJ RF9BUkNISVRFQ1RVUkVTICAgICAgICAgICA9IElBMzIgWDY0IEFBUkNINjQNCg0KKyMNCg0KKw0K DQorW1NvdXJjZXNdDQoNCisgIE1wU2VydmljZXNUZXN0LmMNCg0KKyAgT3B0aW9ucy5jDQoNCisg IE9wdGlvbnMuaA0KDQorDQoNCitbUGFja2FnZXNdDQoNCisgIE1kZVBrZy9NZGVQa2cuZGVjDQoN CisNCg0KK1tMaWJyYXJ5Q2xhc3Nlc10NCg0KKyAgQmFzZUxpYg0KDQorICBTaGVsbExpYg0KDQor ICBVZWZpQXBwbGljYXRpb25FbnRyeVBvaW50DQoNCisgIFVlZmlMaWINCg0KKw0KDQorW1Byb3Rv Y29sc10NCg0KKyAgZ0VmaU1wU2VydmljZVByb3RvY29sR3VpZCAgICAjIyBDT05TVU1FUw0KDQor DQoNCmRpZmYgLS1naXQgYS9NZGVNb2R1bGVQa2cvQXBwbGljYXRpb24vTXBTZXJ2aWNlc1Rlc3Qv T3B0aW9ucy5oIGIvTWRlTW9kdWxlUGtnL0FwcGxpY2F0aW9uL01wU2VydmljZXNUZXN0L09wdGlv bnMuaA0KDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KDQppbmRleCAwMDAwMDAwMDAwMDAuLmNiMjgy MzBhYjA5NQ0KDQotLS0gL2Rldi9udWxsDQoNCisrKyBiL01kZU1vZHVsZVBrZy9BcHBsaWNhdGlv bi9NcFNlcnZpY2VzVGVzdC9PcHRpb25zLmgNCg0KQEAgLTAsMCArMSwzOSBAQA0KDQorLyoqIEBm aWxlDQoNCisgIE9wdGlvbnMgaGFuZGxpbmcgY29kZS4NCg0KKw0KDQorICBDb3B5cmlnaHQgKGMp IDIwMjIsIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIEFsbCByaWdodHMNCg0KK3Jl c2VydmVkLjxCUj4NCg0KKyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZS1Q YXRlbnQgKiovDQoNCisNCg0KKyNpZm5kZWYgTVBTRVJWSUNFU1RFU1RfT1BUSU9OU19IXw0KDQor I2RlZmluZSBNUFNFUlZJQ0VTVEVTVF9PUFRJT05TX0hfDQoNCisNCg0KKyNkZWZpbmUgSU5GSU5J VEVfVElNRU9VVCAgMA0KDQorDQoNCit0eXBlZGVmIHN0cnVjdCB7DQoNCisgIFVJTlROICAgICAg VGltZW91dDsNCg0KKyAgVUlOVE4gICAgICBQcm9jZXNzb3JJbmRleDsNCg0KKyAgQk9PTEVBTiAg ICBSdW5BbGxBUHM7DQoNCisgIEJPT0xFQU4gICAgUnVuU2luZ2xlQVA7DQoNCisgIEJPT0xFQU4g ICAgRGlzYWJsZVByb2Nlc3NvcjsNCg0KKyAgQk9PTEVBTiAgICBFbmFibGVQcm9jZXNzb3I7DQoN CisgIEJPT0xFQU4gICAgU2V0UHJvY2Vzc29ySGVhbHRoeTsNCg0KKyAgQk9PTEVBTiAgICBTZXRQ cm9jZXNzb3JVbmhlYWx0aHk7DQoNCisgIEJPT0xFQU4gICAgUHJpbnRQcm9jZXNzb3JJbmZvcm1h dGlvbjsNCg0KKyAgQk9PTEVBTiAgICBQcmludEJzcFByb2Nlc3NvckluZGV4Ow0KDQorICBCT09M RUFOICAgIFJ1bkFQc1NlcXVlbnRpYWxseTsNCg0KK30gTVBfU0VSVklDRVNfVEVTVF9PUFRJT05T Ow0KDQorDQoNCisvKioNCg0KKyAgUGFyc2VzIGFueSBhcmd1bWVudHMgcHJvdmlkZWQgb24gdGhl IGNvbW1hbmQgbGluZS4NCg0KKw0KDQorICBAcGFyYW0gT3B0aW9ucyAgVGhlIGFyZ3VtZW50cyBz dHJ1Y3R1cmUuDQoNCisNCg0KKyAgQHJldHVybiBFRklfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciBh biBlcnJvciBjb2RlLg0KDQorKiovDQoNCitFRklfU1RBVFVTDQoNCitQYXJzZUFyZ3VtZW50cyAo DQoNCisgIE1QX1NFUlZJQ0VTX1RFU1RfT1BUSU9OUyAgKk9wdGlvbnMNCg0KKyAgKTsNCg0KKw0K DQorI2VuZGlmIC8qIE1QU0VSVklDRVNURVNUX09QVElPTlNfSF8gKi8NCg0KZGlmZiAtLWdpdCBh L01kZU1vZHVsZVBrZy9BcHBsaWNhdGlvbi9NcFNlcnZpY2VzVGVzdC9NcFNlcnZpY2VzVGVzdC5j IGIvTWRlTW9kdWxlUGtnL0FwcGxpY2F0aW9uL01wU2VydmljZXNUZXN0L01wU2VydmljZXNUZXN0 LmMNCg0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCg0KaW5kZXggMDAwMDAwMDAwMDAwLi4xY2VhOGY1 MmYyNWQNCg0KLS0tIC9kZXYvbnVsbA0KDQorKysgYi9NZGVNb2R1bGVQa2cvQXBwbGljYXRpb24v TXBTZXJ2aWNlc1Rlc3QvTXBTZXJ2aWNlc1Rlc3QuYw0KDQpAQCAtMCwwICsxLDU1NSBAQA0KDQor LyoqIEBmaWxlDQoNCisgIFVFRkkgQXBwbGljYXRpb24gdG8gZXhlcmNpc2UgRUZJX01QX1NFUlZJ Q0VTX1BST1RPQ09MLg0KDQorDQoNCisgIENvcHlyaWdodCAoYykgMjAyMiwgUXVhbGNvbW0gSW5u b3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxsIHJpZ2h0cw0KDQorcmVzZXJ2ZWQuPEJSPg0KDQorICBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlLVBhdGVudCAqKi8NCg0KKw0KDQor I2luY2x1ZGUgPFVlZmkuaD4NCg0KKyNpbmNsdWRlIDxMaWJyYXJ5L0Jhc2VNZW1vcnlMaWIuaD4N Cg0KKyNpbmNsdWRlIDxMaWJyYXJ5L0RlYnVnTGliLmg+DQoNCisjaW5jbHVkZSA8TGlicmFyeS9N ZW1vcnlBbGxvY2F0aW9uTGliLmg+ICNpbmNsdWRlIDxMaWJyYXJ5L1ByaW50TGliLmg+DQoNCisj aW5jbHVkZSA8TGlicmFyeS9VZWZpQm9vdFNlcnZpY2VzVGFibGVMaWIuaD4NCg0KKyNpbmNsdWRl IDxMaWJyYXJ5L1VlZmlMaWIuaD4NCg0KKyNpbmNsdWRlIDxQaS9QaU11bHRpUGhhc2UuaD4NCg0K KyNpbmNsdWRlIDxQcm90b2NvbC9NcFNlcnZpY2UuaD4NCg0KKw0KDQorI2luY2x1ZGUgIk9wdGlv bnMuaCINCg0KKw0KDQorI2RlZmluZSBBUEZVTkNfQlVGRkVSX0xFTiAgMjU2DQoNCisNCg0KK3R5 cGVkZWYgc3RydWN0IHsNCg0KKyAgRUZJX01QX1NFUlZJQ0VTX1BST1RPQ09MICAgICpNcDsNCg0K KyAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICoqQnVmZmVyOw0KDQorfSBBUEZVTkNfQVJH Ow0KDQorDQoNCisvKiogVGhlIHByb2NlZHVyZSB0byBydW4gd2l0aCB0aGUgTVAgU2VydmljZXMg aW50ZXJmYWNlLg0KDQorDQoNCisgIEBwYXJhbSBBcmcgVGhlIHByb2NlZHVyZSBhcmd1bWVudC4N Cg0KKw0KDQorKiovDQoNCitTVEFUSUMNCg0KK1ZPSUQNCg0KK0VGSUFQSQ0KDQorQXBGdW5jdGlv biAoDQoNCisgIElOIE9VVCBWT0lEICAqQXJnDQoNCisgICkNCg0KK3sNCg0KKyAgQVBGVU5DX0FS RyAgKlBhcmFtOw0KDQorICBVSU5UTiAgICAgICBQcm9jZXNzb3JJZDsNCg0KKw0KDQorICBpZiAo QXJnICE9IE5VTEwpIHsNCg0KKyAgICBQYXJhbSA9IEFyZzsNCg0KKw0KDQorICAgIFBhcmFtLT5N cC0+V2hvQW1JIChQYXJhbS0+TXAsICZQcm9jZXNzb3JJZCk7DQoNCisgICAgVW5pY29kZVNQcmlu dCAoUGFyYW0tPkJ1ZmZlcltQcm9jZXNzb3JJZF0sIEFQRlVOQ19CVUZGRVJfTEVOLA0KDQorTCJI ZWxsbyBmcm9tIENQVSAlbGRcbiIsIFByb2Nlc3NvcklkKTsNCg0KKyAgfQ0KDQorfQ0KDQorDQoN CisvKioNCg0KKyAgRmV0Y2hlcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYW5kIHdoaWNoIHBy b2Nlc3NvciBpcyB0aGUgQlNQLg0KDQorDQoNCisgIEBwYXJhbSBNcCAgTVAgU2VydmljZXMgUHJv dG9jb2wuDQoNCisgIEBwYXJhbSBOdW1Qcm9jZXNzb3JzIE51bWJlciBvZiBwcm9jZXNzb3JzLg0K DQorICBAcGFyYW0gQnNwSW5kZXggICAgICBUaGUgaW5kZXggb2YgdGhlIEJTUC4NCg0KKyoqLw0K DQorU1RBVElDDQoNCitFRklfU1RBVFVTDQoNCitHZXRQcm9jZXNzb3JJbmZvcm1hdGlvbiAoDQoN CisgIElOICBFRklfTVBfU0VSVklDRVNfUFJPVE9DT0wgICpNcCwNCg0KKyAgT1VUIFVJTlROICAg ICAgICAgICAgICAgICAgICAgKk51bVByb2Nlc3NvcnMsDQoNCisgIE9VVCBVSU5UTiAgICAgICAg ICAgICAgICAgICAgICpCc3BJbmRleA0KDQorICApDQoNCit7DQoNCisgIEVGSV9TVEFUVVMgIFN0 YXR1czsNCg0KKyAgVUlOVE4gICAgICAgTnVtRW5hYmxlZFByb2Nlc3NvcnM7DQoNCisNCg0KKyAg U3RhdHVzID0gTXAtPkdldE51bWJlck9mUHJvY2Vzc29ycyAoTXAsIE51bVByb2Nlc3NvcnMsDQoN CisgJk51bUVuYWJsZWRQcm9jZXNzb3JzKTsgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCg0K KyAgICByZXR1cm4gU3RhdHVzOw0KDQorICB9DQoNCisNCg0KKyAgU3RhdHVzID0gTXAtPldob0Ft SSAoTXAsIEJzcEluZGV4KTsNCg0KKyAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQorICAg IHJldHVybiBTdGF0dXM7DQoNCisgIH0NCg0KKw0KDQorICByZXR1cm4gRUZJX1NVQ0NFU1M7DQoN Cit9DQoNCisNCg0KKy8qKiBEaXNwbGF5cyBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIE1QIFNl cnZpY2VzIFByb3RvY29sLg0KDQorDQoNCisgIEBwYXJhbSBNcCAgICAgICBUaGUgTVAgU2Vydmlj ZXMgUHJvdG9jb2wNCg0KKyAgQHBhcmFtIEJzcEluZGV4IE9uIHJldHVybiwgY29udGFpbnMgdGhl IGluZGV4IG9mIHRoZSBCU1AuDQoNCisNCg0KKyAgQHJldHVybiBUaGUgbnVtYmVyIG9mIENQVXMg aW4gdGhlIHN5c3RlbS4NCg0KKw0KDQorKiovDQoNCitTVEFUSUMNCg0KK1VJTlRODQoNCitQcmlu dFByb2Nlc3NvckluZm9ybWF0aW9uICgNCg0KKyAgSU4gICBFRklfTVBfU0VSVklDRVNfUFJPVE9D T0wgICpNcCwNCg0KKyAgT1VUICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpCc3BJbmRleA0K DQorICApDQoNCit7DQoNCisgIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgIFN0YXR1czsNCg0K KyAgRUZJX1BST0NFU1NPUl9JTkZPUk1BVElPTiAgQ3B1SW5mbzsNCg0KKyAgVUlOVE4gICAgICAg ICAgICAgICAgICAgICAgSW5kZXg7DQoNCisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgIE51 bUNwdTsNCg0KKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgTnVtRW5hYmxlZENwdTsNCg0K Kw0KDQorICBTdGF0dXMgPSBNcC0+R2V0TnVtYmVyT2ZQcm9jZXNzb3JzIChNcCwgJk51bUNwdSwg Jk51bUVuYWJsZWRDcHUpOyAgaWYNCg0KKyAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQoNCisgICAg UHJpbnQgKEwiR2V0TnVtYmVyT2ZQcm9jZXNzb3JzIGZhaWxlZDogJXJcbiIsIFN0YXR1cyk7ICB9 IGVsc2Ugew0KDQorICAgIFByaW50IChMIk51bWJlciBvZiBDUFVzOiAlbGQsIEVuYWJsZWQ6ICVk XG4iLCBOdW1DcHUsDQoNCisgTnVtRW5hYmxlZENwdSk7ICB9DQoNCisNCg0KKyAgZm9yIChJbmRl eCA9IDA7IEluZGV4IDwgTnVtQ3B1OyBJbmRleCsrKSB7DQoNCisgICAgU3RhdHVzID0gTXAtPkdl dFByb2Nlc3NvckluZm8gKE1wLCBDUFVfVjJfRVhURU5ERURfVE9QT0xPR1kgfCBJbmRleCwgJkNw dUluZm8pOw0KDQorICAgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCg0KKyAgICAgIFByaW50 IChMIkdldFByb2Nlc3NvckluZm8gZm9yIFByb2Nlc3NvciAlZCBmYWlsZWQ6ICVyXG4iLCBJbmRl eCwgU3RhdHVzKTsNCg0KKyAgICB9IGVsc2Ugew0KDQorICAgICAgUHJpbnQgKA0KDQorICAgICAg ICBMIlByb2Nlc3NvciAlZDpcbiINCg0KKyAgICAgICAgTCJcdElEOiAlMDE2bHhcbiINCg0KKyAg ICAgICAgTCJcdFN0YXR1czogJXMgfCAiLA0KDQorICAgICAgICBJbmRleCwNCg0KKyAgICAgICAg Q3B1SW5mby5Qcm9jZXNzb3JJZCwNCg0KKyAgICAgICAgKENwdUluZm8uU3RhdHVzRmxhZyAmIFBS T0NFU1NPUl9BU19CU1BfQklUKSA/IEwiQlNQIiA6IEwiQVAiDQoNCisgICAgICAgICk7DQoNCisN Cg0KKyAgICAgIGlmICgoQ3B1SW5mby5TdGF0dXNGbGFnICYgUFJPQ0VTU09SX0FTX0JTUF9CSVQp ICYmIChCc3BJbmRleCAhPSBOVUxMKSkgew0KDQorICAgICAgICAqQnNwSW5kZXggPSBJbmRleDsN Cg0KKyAgICAgIH0NCg0KKw0KDQorICAgICAgUHJpbnQgKEwiJXMgfCAiLCAoQ3B1SW5mby5TdGF0 dXNGbGFnICYgUFJPQ0VTU09SX0VOQUJMRURfQklUKSA/IEwiRW5hYmxlZCIgOiBMIkRpc2FibGVk Iik7DQoNCisgICAgICBQcmludCAoTCIlc1xuIiwgKENwdUluZm8uU3RhdHVzRmxhZyAmDQoNCisg UFJPQ0VTU09SX0hFQUxUSF9TVEFUVVNfQklUKSA/IEwiSGVhbHRoeSIgOiBMIkZhdWx0ZWQiKTsN Cg0KKw0KDQorICAgICAgUHJpbnQgKA0KDQorICAgICAgICBMIlx0TG9jYXRpb246IFBhY2thZ2Ug JWQsIENvcmUgJWQsIFRocmVhZCAlZFxuIg0KDQorICAgICAgICBMIlx0RXh0ZW5kZWQgSW5mb3Jt YXRpb246IFBhY2thZ2UgJWQsIE1vZHVsZSAlZCwgVGlsZSAlZCwgRGllICVkLCBDb3JlICVkLCBU aHJlYWQgJWRcblxuIiwNCg0KKyAgICAgICAgQ3B1SW5mby5Mb2NhdGlvbi5QYWNrYWdlLA0KDQor ICAgICAgICBDcHVJbmZvLkxvY2F0aW9uLkNvcmUsDQoNCisgICAgICAgIENwdUluZm8uTG9jYXRp b24uVGhyZWFkLA0KDQorICAgICAgICBDcHVJbmZvLkV4dGVuZGVkSW5mb3JtYXRpb24uTG9jYXRp b24yLlBhY2thZ2UsDQoNCisgICAgICAgIENwdUluZm8uRXh0ZW5kZWRJbmZvcm1hdGlvbi5Mb2Nh dGlvbjIuTW9kdWxlLA0KDQorICAgICAgICBDcHVJbmZvLkV4dGVuZGVkSW5mb3JtYXRpb24uTG9j YXRpb24yLlRpbGUsDQoNCisgICAgICAgIENwdUluZm8uRXh0ZW5kZWRJbmZvcm1hdGlvbi5Mb2Nh dGlvbjIuRGllLA0KDQorICAgICAgICBDcHVJbmZvLkV4dGVuZGVkSW5mb3JtYXRpb24uTG9jYXRp b24yLkNvcmUsDQoNCisgICAgICAgIENwdUluZm8uRXh0ZW5kZWRJbmZvcm1hdGlvbi5Mb2NhdGlv bjIuVGhyZWFkDQoNCisgICAgICAgICk7DQoNCisgICAgfQ0KDQorICB9DQoNCisNCg0KKyAgcmV0 dXJuIE51bUNwdTsNCg0KK30NCg0KKw0KDQorLyoqIEFsbG9jYXRlcyBtZW1vcnkgaW4gQXBBcmcg Zm9yIHRoZSBzaW5nbGUgQVAgc3BlY2lmaWVkLg0KDQorDQoNCisgIEBwYXJhbSBBcEFyZyAgICAg ICAgICBQb2ludGVyIHRvIHRoZSBBUCBhcmd1bWVudCBzdHJ1Y3R1cmUuDQoNCisgIEBwYXJhbSBN cCAgICAgICAgICAgICBUaGUgTVAgU2VydmljZXMgUHJvdG9jb2wuDQoNCisgIEBwYXJhbSBQcm9j ZXNzb3JJbmRleCBUaGUgaW5kZXggb2YgdGhlIEFQLg0KDQorDQoNCisgIEByZXR2YWwgRUZJX1NV Q0NFU1MgICAgICAgICAgTWVtb3J5IHdhcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLg0KDQorICBA cmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuDQoN CisNCg0KKyoqLw0KDQorU1RBVElDDQoNCitFRklfU1RBVFVTDQoNCitBbGxvY2F0ZUFwRnVuY0J1 ZmZlclNpbmdsZUFQICgNCg0KKyAgSU4gQVBGVU5DX0FSRyAgICAgICAgICAgICAgICAqQXBBcmcs DQoNCisgIElOIEVGSV9NUF9TRVJWSUNFU19QUk9UT0NPTCAgKk1wLA0KDQorICBJTiBVSU5UTiAg ICAgICAgICAgICAgICAgICAgIFByb2Nlc3NvckluZGV4DQoNCisgICkNCg0KK3sNCg0KKyAgQXBB cmctPk1wID0gTXA7DQoNCisNCg0KKyAgQXBBcmctPkJ1ZmZlciA9IEFsbG9jYXRlWmVyb1Bvb2wg KChQcm9jZXNzb3JJbmRleCArIDEpICogc2l6ZW9mIChWT0lEDQoNCisgKikpOyAgaWYgKEFwQXJn LT5CdWZmZXIgPT0gTlVMTCkgew0KDQorICAgIFByaW50IChMIkZhaWxlZCB0byBhbGxvY2F0ZSBi dWZmZXIgZm9yIEFQIGJ1ZmZlclxuIik7DQoNCisgICAgcmV0dXJuIEVGSV9PVVRfT0ZfUkVTT1VS Q0VTOw0KDQorICB9DQoNCisNCg0KKyAgQXBBcmctPkJ1ZmZlcltQcm9jZXNzb3JJbmRleF0gPSBB bGxvY2F0ZVplcm9Qb29sIChBUEZVTkNfQlVGRkVSX0xFTik7DQoNCisgaWYgKEFwQXJnLT5CdWZm ZXJbUHJvY2Vzc29ySW5kZXhdID09IE5VTEwpIHsNCg0KKyAgICBQcmludCAoTCJGYWlsZWQgdG8g YWxsb2NhdGUgYnVmZmVyIGZvciBBUCBidWZmZXJcbiIpOw0KDQorICAgIEZyZWVQb29sIChBcEFy Zy0+QnVmZmVyKTsNCg0KKyAgICByZXR1cm4gRUZJX09VVF9PRl9SRVNPVVJDRVM7DQoNCisgIH0N Cg0KKw0KDQorICByZXR1cm4gRUZJX1NVQ0NFU1M7DQoNCit9DQoNCisNCg0KKy8qKiBBbGxvY2F0 ZXMgbWVtb3J5IGluIEFwQXJnIGZvciBhbGwgQVBzLg0KDQorDQoNCisgIEBwYXJhbSBBcEFyZyAg IFBvaW50ZXIgdG8gdGhlIEFQIGFyZ3VtZW50IHN0cnVjdHVyZS4NCg0KKyAgQHBhcmFtIE1wICAg ICAgVGhlIE1QIFNlcnZpY2VzIFByb3RvY29sLg0KDQorICBAcGFyYW0gTnVtQ3B1cyBUaGUgbnVt YmVyIG9mIENQVXMuDQoNCisNCg0KKyAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICBNZW1v cnkgd2FzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuDQoNCisgIEByZXR2YWwgRUZJX09VVF9PRl9S RVNPVVJDRVMgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS4NCg0KKw0KDQorKiovDQoNCitTVEFU SUMNCg0KK0VGSV9TVEFUVVMNCg0KK0FsbG9jYXRlQXBGdW5jQnVmZmVyQWxsQVBzICgNCg0KKyAg SU4gQVBGVU5DX0FSRyAgICAgICAgICAgICAgICAqQXBBcmcsDQoNCisgIElOIEVGSV9NUF9TRVJW SUNFU19QUk9UT0NPTCAgKk1wLA0KDQorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgIE51 bUNwdXMNCg0KKyAgKQ0KDQorew0KDQorICBJTlQzMiAgSW5kZXg7DQoNCisNCg0KKyAgQXBBcmct Pk1wID0gTXA7DQoNCisNCg0KKyAgQXBBcmctPkJ1ZmZlciA9IEFsbG9jYXRlWmVyb1Bvb2wgKE51 bUNwdXMgKiBzaXplb2YgKFZPSUQgKikpOyAgaWYNCg0KKyAoQXBBcmctPkJ1ZmZlciA9PSBOVUxM KSB7DQoNCisgICAgUHJpbnQgKEwiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgQVAgbWVz c2FnZVxuIik7DQoNCisgICAgcmV0dXJuIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOw0KDQorICB9DQoN CisNCg0KKyAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTnVtQ3B1czsgSW5kZXgrKykgew0KDQor ICAgIEFwQXJnLT5CdWZmZXJbSW5kZXhdID0gQWxsb2NhdGVaZXJvUG9vbCAoQVBGVU5DX0JVRkZF Ul9MRU4pOw0KDQorICAgIGlmIChBcEFyZy0+QnVmZmVyW0luZGV4XSA9PSBOVUxMKSB7DQoNCisg ICAgICBQcmludCAoTCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBBUCBtZXNzYWdlXG4i KTsNCg0KKyAgICAgIGZvciAoLS1JbmRleDsgSW5kZXggPj0gMDsgSW5kZXgrKykgew0KDQorICAg ICAgICBGcmVlUG9vbCAoQXBBcmctPkJ1ZmZlcltJbmRleF0pOw0KDQorICAgICAgfQ0KDQorDQoN CisgICAgICBGcmVlUG9vbCAoQXBBcmctPkJ1ZmZlcik7DQoNCisgICAgICByZXR1cm4gRUZJX09V VF9PRl9SRVNPVVJDRVM7DQoNCisgICAgfQ0KDQorICB9DQoNCisNCg0KKyAgcmV0dXJuIEVGSV9T VUNDRVNTOw0KDQorfQ0KDQorDQoNCisvKiogRnJlZXMgbWVtb3J5IGluIEFwQXJnIGZvciBhbGwg QVBzLg0KDQorDQoNCisgIEBwYXJhbSBBcEFyZyAgIFBvaW50ZXIgdG8gdGhlIEFQIGFyZ3VtZW50 IHN0cnVjdHVyZS4NCg0KKyAgQHBhcmFtIE51bUNwdXMgVGhlIG51bWJlciBvZiBDUFVzLg0KDQor DQoNCisqKi8NCg0KK1NUQVRJQw0KDQorVk9JRA0KDQorRnJlZUFwRnVuY0J1ZmZlciAoDQoNCisg IEFQRlVOQ19BUkcgICpBcEFyZywNCg0KKyAgVUlOVE4gICAgICAgTnVtQ3B1cw0KDQorICApDQoN Cit7DQoNCisgIFVJTlROICBJbmRleDsNCg0KKw0KDQorICBmb3IgKEluZGV4ID0gMDsgSW5kZXgg PCBOdW1DcHVzOyBJbmRleCsrKSB7DQoNCisgICAgaWYgKEFwQXJnLT5CdWZmZXJbSW5kZXhdICE9 IE5VTEwpIHsNCg0KKyAgICAgIEZyZWVQb29sIChBcEFyZy0+QnVmZmVyW0luZGV4XSk7DQoNCisg ICAgfQ0KDQorICB9DQoNCisNCg0KKyAgRnJlZVBvb2wgKEFwQXJnLT5CdWZmZXIpOw0KDQorfQ0K DQorDQoNCisvKiogUnVucyBhIHNwZWNpZmllZCBBUC4NCg0KKw0KDQorICBAcGFyYW0gTXAgICAg ICAgICAgICAgVGhlIE1QIFNlcnZpY2VzIFByb3RvY29sLg0KDQorICBAcGFyYW0gUHJvY2Vzc29y SW5kZXggVGhlIHByb2Nlc3NvciBpbmRleC4NCg0KKyAgQHBhcmFtIFRpbWVvdXQgICAgICAgIFRp bWVvdXQgaW4gbWlsbGlzZWNvbmRzLg0KDQorDQoNCisgIEByZXR1cm4gRUZJX1NVQ0NFU1Mgb24g c3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4NCg0KKw0KDQorKiovDQoNCitTVEFUSUMNCg0KK0VG SV9TVEFUVVMNCg0KK1N0YXJ0dXBUaGlzQVAgKA0KDQorICBJTiBFRklfTVBfU0VSVklDRVNfUFJP VE9DT0wgICpNcCwNCg0KKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICBQcm9jZXNzb3JJ bmRleCwNCg0KKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICBUaW1lb3V0DQoNCisgICkN Cg0KK3sNCg0KKyAgRUZJX1NUQVRVUyAgU3RhdHVzOw0KDQorICBBUEZVTkNfQVJHICBBcEFyZzsN Cg0KKw0KDQorICBTdGF0dXMgPSBBbGxvY2F0ZUFwRnVuY0J1ZmZlclNpbmdsZUFQICgmQXBBcmcs IE1wLCBQcm9jZXNzb3JJbmRleCk7DQoNCisgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQor ICAgIHJldHVybiBTdGF0dXM7DQoNCisgIH0NCg0KKw0KDQorICBTdGF0dXMgPSBBbGxvY2F0ZUFw RnVuY0J1ZmZlclNpbmdsZUFQICgmQXBBcmcsIE1wLCBQcm9jZXNzb3JJbmRleCk7DQoNCisgaWYg KEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQorICAgIHJldHVybiBTdGF0dXM7DQoNCisgIH0NCg0K Kw0KDQorICBQcmludCAoDQoNCisgICAgTCJTdGFydHVwVGhpc0FQIG9uIFByb2Nlc3NvciAlZCB3 aXRoICVkJXMgdGltZW91dC4uLiIsDQoNCisgICAgUHJvY2Vzc29ySW5kZXgsDQoNCisgICAgVGlt ZW91dCwNCg0KKyAgICAoVGltZW91dCA9PSBJTkZJTklURV9USU1FT1VUKSA/IEwiIChpbmZpbml0 ZSkiIDogTCJtcyINCg0KKyAgICApOw0KDQorICBTdGF0dXMgPSBNcC0+U3RhcnR1cFRoaXNBUCAo DQoNCisgICAgICAgICAgICAgICAgIE1wLA0KDQorICAgICAgICAgICAgICAgICBBcEZ1bmN0aW9u LA0KDQorICAgICAgICAgICAgICAgICBQcm9jZXNzb3JJbmRleCwNCg0KKyAgICAgICAgICAgICAg ICAgTlVMTCwNCg0KKyAgICAgICAgICAgICAgICAgVGltZW91dCAqIDEwMDAsDQoNCisgICAgICAg ICAgICAgICAgICZBcEFyZywNCg0KKyAgICAgICAgICAgICAgICAgTlVMTA0KDQorICAgICAgICAg ICAgICAgICApOw0KDQorICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQoNCisgICAgUHJpbnQg KEwiZmFpbGVkOiAlclxuIiwgU3RhdHVzKTsNCg0KKyAgICByZXR1cm4gU3RhdHVzOw0KDQorICB9 IGVsc2Ugew0KDQorICAgIFByaW50IChMImRvbmUuXG4iKTsNCg0KKyAgICBQcmludCAoQXBBcmcu QnVmZmVyW1Byb2Nlc3NvckluZGV4XSk7ICB9DQoNCisNCg0KKyAgRnJlZUFwRnVuY0J1ZmZlciAo JkFwQXJnLCBQcm9jZXNzb3JJbmRleCArIDEpOw0KDQorDQoNCisgIHJldHVybiBFRklfU1VDQ0VT UzsNCg0KK30NCg0KKw0KDQorLyoqIFJ1bnMgYWxsIEFQcy4NCg0KKw0KDQorICBAcGFyYW0gTXAg ICAgICAgICAgICAgICAgIFRoZSBNUCBTZXJ2aWNlcyBQcm90b2NvbC4NCg0KKyAgQHBhcmFtIE51 bUNwdXMgICAgICAgICAgICBUaGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4NCg0KKyAg QHBhcmFtIFRpbWVvdXQgICAgICAgICAgICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4NCg0KKyAg QHBhcmFtIFJ1bkFQc1NlcXVlbnRpYWxseSBSdW4gQVBzIHNlcXVlbnRpYWxseSAoRkFMU0U6IHJ1 bg0KDQorIHNpbXVsdGFuZW91c2x5KQ0KDQorDQoNCisgIEByZXR1cm4gRUZJX1NVQ0NFU1Mgb24g c3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4NCg0KKw0KDQorKiovDQoNCitTVEFUSUMNCg0KK0VG SV9TVEFUVVMNCg0KK1N0YXJ0dXBBbGxBUHMgKA0KDQorICBJTiBFRklfTVBfU0VSVklDRVNfUFJP VE9DT0wgICpNcCwNCg0KKyAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICBOdW1DcHVzLA0K DQorICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsDQoNCisgIElOIEJPT0xF QU4gICAgICAgICAgICAgICAgICAgUnVuQVBzU2VxdWVudGlhbGx5DQoNCisgICkNCg0KK3sNCg0K KyAgRUZJX1NUQVRVUyAgU3RhdHVzOw0KDQorICBVSU5UTiAgICAgICBJbmRleDsNCg0KKyAgQVBG VU5DX0FSRyAgQXBBcmc7DQoNCisNCg0KKyAgU3RhdHVzID0gQWxsb2NhdGVBcEZ1bmNCdWZmZXJB bGxBUHMgKCZBcEFyZywgTXAsIE51bUNwdXMpOyAgaWYNCg0KKyAoRUZJX0VSUk9SIChTdGF0dXMp KSB7DQoNCisgICAgcmV0dXJuIFN0YXR1czsNCg0KKyAgfQ0KDQorDQoNCisgIFByaW50ICgNCg0K KyAgICBMIlJ1bm5pbmcgd2l0aCBTaW5nbGVUaHJlYWQgVFJVRSwgJWQlcyB0aW1lb3V0Li4uIiwN Cg0KKyAgICBUaW1lb3V0LA0KDQorICAgIChUaW1lb3V0ID09IElORklOSVRFX1RJTUVPVVQpID8g TCIgKGluZmluaXRlKSIgOiBMIm1zIg0KDQorICAgICk7DQoNCisgIFN0YXR1cyA9IE1wLT5TdGFy dHVwQWxsQVBzICgNCg0KKyAgICAgICAgICAgICAgICAgTXAsDQoNCisgICAgICAgICAgICAgICAg IEFwRnVuY3Rpb24sDQoNCisgICAgICAgICAgICAgICAgIFJ1bkFQc1NlcXVlbnRpYWxseSwNCg0K KyAgICAgICAgICAgICAgICAgTlVMTCwNCg0KKyAgICAgICAgICAgICAgICAgVGltZW91dCAqIDEw MDAsDQoNCisgICAgICAgICAgICAgICAgICZBcEFyZywNCg0KKyAgICAgICAgICAgICAgICAgTlVM TA0KDQorICAgICAgICAgICAgICAgICApOw0KDQorICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7 DQoNCisgICAgUHJpbnQgKEwiZmFpbGVkOiAlclxuIiwgU3RhdHVzKTsNCg0KKyAgICByZXR1cm4g U3RhdHVzOw0KDQorICB9IGVsc2Ugew0KDQorICAgIFByaW50IChMImRvbmUuXG4iKTsNCg0KKyAg ICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1DcHVzOyBJbmRleCsrKSB7DQoNCisgICAgICBQ cmludCAoQXBBcmcuQnVmZmVyW0luZGV4XSk7DQoNCisgICAgfQ0KDQorICB9DQoNCisNCg0KKyAg RnJlZUFwRnVuY0J1ZmZlciAoJkFwQXJnLCBOdW1DcHVzKTsNCg0KKyAgcmV0dXJuIEVGSV9TVUND RVNTOw0KDQorfQ0KDQorDQoNCisvKioNCg0KKyAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIEFQLg0K DQorDQoNCisgIEBwYXJhbSBNcCAgICAgICAgICAgICAgIFRoZSBNUCBTZXJ2aWNlcyBQcm90b2Nv bC4NCg0KKyAgQHBhcmFtIFByb2Nlc3NvckluZGV4ICAgVGhlIHByb2Nlc3NvciB0byBlbmFibGUu DQoNCisgIEBwYXJhbSBQcm9jZXNzb3JIZWFsdGh5IFRoZSBoZWFsdGggc3RhdHVzIG9mIHRoZSBw cm9jZXNzb3IuDQoNCisNCg0KKyAgQHJldHVybiBFRklfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciBh biBlcnJvciBjb2RlLg0KDQorKiovDQoNCitTVEFUSUMNCg0KK0VGSV9TVEFUVVMNCg0KK0VuYWJs ZUFQICgNCg0KKyAgSU4gRUZJX01QX1NFUlZJQ0VTX1BST1RPQ09MICAqTXAsDQoNCisgIFVJTlRO ICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc29ySW5kZXgsDQoNCisgIEJPT0xFQU4gICAg ICAgICAgICAgICAgICAgICAgUHJvY2Vzc29ySGVhbHRoeQ0KDQorICApDQoNCit7DQoNCisgIEVG SV9TVEFUVVMgIFN0YXR1czsNCg0KKyAgVUlOVDMyICAgICAgSGVhbHRoRmxhZzsNCg0KKw0KDQor ICBpZiAoUHJvY2Vzc29ySGVhbHRoeSkgew0KDQorICAgIFByaW50IChMIkVuYWJsaW5nIFByb2Nl c3NvciAlZCB3aXRoIEhlYWx0aEZsYWcgaGVhbHRoeS4uLiIsIFByb2Nlc3NvckluZGV4KTsNCg0K KyAgICBIZWFsdGhGbGFnID0gUFJPQ0VTU09SX0hFQUxUSF9TVEFUVVNfQklUOyAgfSBlbHNlIHsN Cg0KKyAgICBQcmludCAoTCJFbmFibGluZyBQcm9jZXNzb3IgJWQgd2l0aCBIZWFsdGhGbGFnIGZh dWx0ZWQuLi4iLCBQcm9jZXNzb3JJbmRleCk7DQoNCisgICAgSGVhbHRoRmxhZyA9IDA7DQoNCisg IH0NCg0KKw0KDQorICBTdGF0dXMgPSBNcC0+RW5hYmxlRGlzYWJsZUFQIChNcCwgUHJvY2Vzc29y SW5kZXgsIFRSVUUsICZIZWFsdGhGbGFnKTsNCg0KKyBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7 DQoNCisgICAgUHJpbnQgKEwiZmFpbGVkOiAlclxuIiwgU3RhdHVzKTsNCg0KKyAgICByZXR1cm4g U3RhdHVzOw0KDQorICB9IGVsc2Ugew0KDQorICAgIFByaW50IChMImRvbmUuXG4iKTsNCg0KKyAg fQ0KDQorDQoNCisgIHJldHVybiBTdGF0dXM7DQoNCit9DQoNCisNCg0KKy8qKg0KDQorICBEaXNh YmxlcyB0aGUgc3BlY2lmaWVkIEFQLg0KDQorDQoNCisgIEBwYXJhbSBNcCAgICAgICAgICAgICAg IFRoZSBNUCBTZXJ2aWNlcyBQcm90b2NvbC4NCg0KKyAgQHBhcmFtIFByb2Nlc3NvckluZGV4ICAg VGhlIHByb2Nlc3NvciB0byBkaXNhYmxlLg0KDQorICBAcGFyYW0gUHJvY2Vzc29ySGVhbHRoeSBU aGUgaGVhbHRoIHN0YXR1cyBvZiB0aGUgcHJvY2Vzc29yLg0KDQorDQoNCisgIEByZXR1cm4gRUZJ X1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4NCg0KKyoqLw0KDQorU1RBVElD DQoNCitFRklfU1RBVFVTDQoNCitEaXNhYmxlQVAgKA0KDQorICBJTiBFRklfTVBfU0VSVklDRVNf UFJPVE9DT0wgICpNcCwNCg0KKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNz b3JJbmRleCwNCg0KKyAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzb3JIZWFs dGh5DQoNCisgICkNCg0KK3sNCg0KKyAgRUZJX1NUQVRVUyAgU3RhdHVzOw0KDQorICBVSU5UMzIg ICAgICBIZWFsdGhGbGFnOw0KDQorDQoNCisgIGlmIChQcm9jZXNzb3JIZWFsdGh5KSB7DQoNCisg ICAgUHJpbnQgKEwiRGlzYWJsaW5nIFByb2Nlc3NvciAlZCB3aXRoIEhlYWx0aEZsYWcgaGVhbHRo eS4uLiIsIFByb2Nlc3NvckluZGV4KTsNCg0KKyAgICBIZWFsdGhGbGFnID0gUFJPQ0VTU09SX0hF QUxUSF9TVEFUVVNfQklUOyAgfSBlbHNlIHsNCg0KKyAgICBQcmludCAoTCJEaXNhYmxpbmcgUHJv Y2Vzc29yICVkIHdpdGggSGVhbHRoRmxhZyBmYXVsdGVkLi4uIiwgUHJvY2Vzc29ySW5kZXgpOw0K DQorICAgIEhlYWx0aEZsYWcgPSAwOw0KDQorICB9DQoNCisNCg0KKyAgU3RhdHVzID0gTXAtPkVu YWJsZURpc2FibGVBUCAoTXAsIFByb2Nlc3NvckluZGV4LCBGQUxTRSwNCg0KKyAmSGVhbHRoRmxh Zyk7ICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQoNCisgICAgUHJpbnQgKEwiZmFpbGVkOiAl clxuIiwgU3RhdHVzKTsNCg0KKyAgICByZXR1cm4gU3RhdHVzOw0KDQorICB9IGVsc2Ugew0KDQor ICAgIFByaW50IChMImRvbmUuXG4iKTsNCg0KKyAgfQ0KDQorDQoNCisgIHJldHVybiBTdGF0dXM7 DQoNCit9DQoNCisNCg0KKy8qKg0KDQorICBUaGUgdXNlciBFbnRyeSBQb2ludCBmb3IgQXBwbGlj YXRpb24uIFRoZSB1c2VyIGNvZGUgc3RhcnRzIHdpdGggdGhpcw0KDQorZnVuY3Rpb24NCg0KKyAg YXMgdGhlIHJlYWwgZW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbi4NCg0KKw0KDQorICBA cGFyYW1baW5dIEltYWdlSGFuZGxlICAgIFRoZSBmaXJtd2FyZSBhbGxvY2F0ZWQgaGFuZGxlIGZv ciB0aGUgRUZJIGltYWdlLg0KDQorICBAcGFyYW1baW5dIFN5c3RlbVRhYmxlICAgIEEgcG9pbnRl ciB0byB0aGUgRUZJIFN5c3RlbSBUYWJsZS4NCg0KKw0KDQorICBAcmV0dmFsIEVGSV9TVUNDRVNT ICAgICAgIFRoZSBlbnRyeSBwb2ludCBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuDQoNCisgIEBy ZXR2YWwgb3RoZXIgICAgICAgICAgICAgU29tZSBlcnJvciBvY2N1cnMgd2hlbiBleGVjdXRpbmcg dGhpcyBlbnRyeSBwb2ludC4NCg0KKw0KDQorKiovDQoNCitFRklfU1RBVFVTDQoNCitFRklBUEkN Cg0KK1VlZmlNYWluICgNCg0KKyAgSU4gRUZJX0hBTkRMRSAgICAgICAgSW1hZ2VIYW5kbGUsDQoN CisgIElOIEVGSV9TWVNURU1fVEFCTEUgICpTeXN0ZW1UYWJsZQ0KDQorICApDQoNCit7DQoNCisg IEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgU3RhdHVzOw0KDQorICBFRklfTVBfU0VSVklDRVNf UFJPVE9DT0wgICpNcDsNCg0KKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICBCc3BJbmRleDsN Cg0KKyAgVUlOVE4gICAgICAgICAgICAgICAgICAgICBDcHVJbmRleDsNCg0KKyAgVUlOVE4gICAg ICAgICAgICAgICAgICAgICBOdW1DcHVzOw0KDQorICBCT09MRUFOICAgICAgICAgICAgICAgICAg IFByb2Nlc3NvckhlYWx0aHk7DQoNCisgIE1QX1NFUlZJQ0VTX1RFU1RfT1BUSU9OUyAgT3B0aW9u czsNCg0KKw0KDQorICBCc3BJbmRleCA9IDA7DQoNCisNCg0KKyAgU3RhdHVzID0gZ0JTLT5Mb2Nh dGVQcm90b2NvbCAoDQoNCisgICAgICAgICAgICAgICAgICAmZ0VmaU1wU2VydmljZVByb3RvY29s R3VpZCwNCg0KKyAgICAgICAgICAgICAgICAgIE5VTEwsDQoNCisgICAgICAgICAgICAgICAgICAo Vk9JRCAqKikmTXANCg0KKyAgICAgICAgICAgICAgICAgICk7DQoNCisgIGlmIChFRklfRVJST1Ig KFN0YXR1cykpIHsNCg0KKyAgICBQcmludCAoTCJGYWlsZWQgdG8gbG9jYXRlIEVGSV9NUF9TRVJW SUNFU19QUk9UT0NPTCAoJXIpLiBOb3QgaW5zdGFsbGVkIG9uIHBsYXRmb3JtP1xuIiwgU3RhdHVz KTsNCg0KKyAgICByZXR1cm4gRUZJX05PVF9GT1VORDsNCg0KKyAgfQ0KDQorDQoNCisgIFN0YXR1 cyA9IFBhcnNlQXJndW1lbnRzICgmT3B0aW9ucyk7DQoNCisgIGlmIChFRklfRVJST1IgKFN0YXR1 cykpIHsNCg0KKyAgICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOw0KDQorICB9DQoNCisN Cg0KKyAgU3RhdHVzID0gR2V0UHJvY2Vzc29ySW5mb3JtYXRpb24gKE1wLCAmTnVtQ3B1cywgJkJz cEluZGV4KTsgIGlmDQoNCisgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQorICAgIFByaW50IChM IkVycm9yOiBGYWlsZWQgdG8gZmV0Y2ggcHJvY2Vzc29yIGluZm9ybWF0aW9uLlxuIik7DQoNCisg ICAgcmV0dXJuIFN0YXR1czsNCg0KKyAgfQ0KDQorDQoNCisgIGlmIChPcHRpb25zLlByaW50QnNw UHJvY2Vzc29ySW5kZXgpIHsNCg0KKyAgICBTdGF0dXMgPSBNcC0+V2hvQW1JIChNcCwgJkNwdUlu ZGV4KTsNCg0KKyAgICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQoNCisgICAgICBQcmludCAo TCJXaG9BbUkgZmFpbGVkOiAlclxuIiwgU3RhdHVzKTsNCg0KKyAgICAgIHJldHVybiBTdGF0dXM7 DQoNCisgICAgfSBlbHNlIHsNCg0KKyAgICAgIFByaW50IChMIkJTUDogJTAxNmx4XG4iLCBDcHVJ bmRleCk7DQoNCisgICAgfQ0KDQorICB9DQoNCisNCg0KKyAgaWYgKE9wdGlvbnMuUHJpbnRQcm9j ZXNzb3JJbmZvcm1hdGlvbikgew0KDQorICAgIE51bUNwdXMgPSBQcmludFByb2Nlc3NvckluZm9y bWF0aW9uIChNcCwgJkJzcEluZGV4KTsNCg0KKyAgICBpZiAoTnVtQ3B1cyA8IDIpIHsNCg0KKyAg ICAgIFByaW50IChMIkVycm9yOiBVbmlwcm9jZXNzb3Igc3lzdGVtIGZvdW5kLlxuIik7DQoNCisg ICAgICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOw0KDQorICAgIH0NCg0KKyAgfQ0KDQor DQoNCisgIGlmIChPcHRpb25zLlJ1blNpbmdsZUFQKSB7DQoNCisgICAgU3RhdHVzID0gU3RhcnR1 cFRoaXNBUCAoDQoNCisgICAgICAgICAgICAgICBNcCwNCg0KKyAgICAgICAgICAgICAgIE9wdGlv bnMuUHJvY2Vzc29ySW5kZXgsDQoNCisgICAgICAgICAgICAgICBPcHRpb25zLlRpbWVvdXQNCg0K KyAgICAgICAgICAgICAgICk7DQoNCisgICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQor ICAgICAgcmV0dXJuIFN0YXR1czsNCg0KKyAgICB9DQoNCisgIH0NCg0KKw0KDQorICBpZiAoT3B0 aW9ucy5SdW5BbGxBUHMpIHsNCg0KKyAgICBTdGF0dXMgPSBTdGFydHVwQWxsQVBzIChNcCwgTnVt Q3B1cywgT3B0aW9ucy5UaW1lb3V0LCBPcHRpb25zLlJ1bkFQc1NlcXVlbnRpYWxseSk7DQoNCisg ICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQorICAgICAgcmV0dXJuIFN0YXR1czsNCg0K KyAgICB9DQoNCisgIH0NCg0KKw0KDQorICBpZiAoT3B0aW9ucy5FbmFibGVQcm9jZXNzb3IpIHsN Cg0KKyAgICBQcm9jZXNzb3JIZWFsdGh5ID0gVFJVRTsNCg0KKyAgICBpZiAoT3B0aW9ucy5TZXRQ cm9jZXNzb3JVbmhlYWx0aHkpIHsNCg0KKyAgICAgIFByb2Nlc3NvckhlYWx0aHkgPSBGQUxTRTsN Cg0KKyAgICB9DQoNCisNCg0KKyAgICBTdGF0dXMgPSBFbmFibGVBUCAoTXAsIE9wdGlvbnMuUHJv Y2Vzc29ySW5kZXgsIFByb2Nlc3NvckhlYWx0aHkpOw0KDQorICAgIGlmIChFRklfRVJST1IgKFN0 YXR1cykpIHsNCg0KKyAgICAgIHJldHVybiBTdGF0dXM7DQoNCisgICAgfQ0KDQorICB9DQoNCisN Cg0KKyAgaWYgKE9wdGlvbnMuRGlzYWJsZVByb2Nlc3Nvcikgew0KDQorICAgIFByb2Nlc3Nvckhl YWx0aHkgPSBUUlVFOw0KDQorICAgIGlmIChPcHRpb25zLlNldFByb2Nlc3NvclVuaGVhbHRoeSkg ew0KDQorICAgICAgUHJvY2Vzc29ySGVhbHRoeSA9IEZBTFNFOw0KDQorICAgIH0NCg0KKw0KDQor ICAgIFN0YXR1cyA9IERpc2FibGVBUCAoTXAsIE9wdGlvbnMuUHJvY2Vzc29ySW5kZXgsIFByb2Nl c3NvckhlYWx0aHkpOw0KDQorICAgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCg0KKyAgICAg IHJldHVybiBTdGF0dXM7DQoNCisgICAgfQ0KDQorICB9DQoNCisNCg0KKyAgcmV0dXJuIEVGSV9T VUNDRVNTOw0KDQorfQ0KDQpkaWZmIC0tZ2l0IGEvTWRlTW9kdWxlUGtnL0FwcGxpY2F0aW9uL01w U2VydmljZXNUZXN0L09wdGlvbnMuYyBiL01kZU1vZHVsZVBrZy9BcHBsaWNhdGlvbi9NcFNlcnZp Y2VzVGVzdC9PcHRpb25zLmMNCg0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCg0KaW5kZXggMDAwMDAw MDAwMDAwLi4yZWEyYzk0YjdjNzQNCg0KLS0tIC9kZXYvbnVsbA0KDQorKysgYi9NZGVNb2R1bGVQ a2cvQXBwbGljYXRpb24vTXBTZXJ2aWNlc1Rlc3QvT3B0aW9ucy5jDQoNCkBAIC0wLDAgKzEsMjE1 IEBADQoNCisvKiogQGZpbGUNCg0KKyAgT3B0aW9ucyBoYW5kbGluZyBjb2RlLg0KDQorDQoNCisg IENvcHlyaWdodCAoYykgMjAyMiwgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxs IHJpZ2h0cyByZXNlcnZlZC48QlI+DQoNCisgIENvcHlyaWdodCAoYykgMjAxMC0yMDE5ICBGaW5u YmFyciBQLiBNdXJwaHkuICAgQWxsIHJpZ2h0cyByZXNlcnZlZC48QlI+DQoNCisgIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1DbGF1c2UtUGF0ZW50ICoqLw0KDQorDQoNCisjaW5jbHVk ZSA8VWVmaS5oPg0KDQorI2luY2x1ZGUgPExpYnJhcnkvQmFzZU1lbW9yeUxpYi5oPg0KDQorI2lu Y2x1ZGUgPFByb3RvY29sL1NoZWxsUGFyYW1ldGVycy5oPg0KDQorI2luY2x1ZGUgPExpYnJhcnkv QmFzZUxpYi5oPg0KDQorI2luY2x1ZGUgPExpYnJhcnkvVWVmaUxpYi5oPg0KDQorI2luY2x1ZGUg PExpYnJhcnkvVWVmaUJvb3RTZXJ2aWNlc1RhYmxlTGliLmg+DQoNCisNCg0KKyNpbmNsdWRlICJP cHRpb25zLmgiDQoNCisNCg0KK1NUQVRJQyBVSU5UTiAgIEFyZ2M7DQoNCitTVEFUSUMgQ0hBUjE2 ICAqKkFyZ3Y7DQoNCisNCg0KKy8qKg0KDQorDQoNCisgIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMg YXJnYyBhbmQgYXJndi4NCg0KKw0KDQorICBAcmV0dXJuIFN0YXR1cw0KDQorKiovDQoNCitFRklf U1RBVFVTDQoNCitHZXRBcmcgKA0KDQorICBWT0lEDQoNCisgICkNCg0KK3sNCg0KKyAgRUZJX1NU QVRVUyAgICAgICAgICAgICAgICAgICAgIFN0YXR1czsNCg0KKyAgRUZJX1NIRUxMX1BBUkFNRVRF UlNfUFJPVE9DT0wgICpTaGVsbFBhcmFtZXRlcnM7DQoNCisNCg0KKyAgU3RhdHVzID0gZ0JTLT5I YW5kbGVQcm90b2NvbCAoDQoNCisgICAgICAgICAgICAgICAgICBnSW1hZ2VIYW5kbGUsDQoNCisg ICAgICAgICAgICAgICAgICAmZ0VmaVNoZWxsUGFyYW1ldGVyc1Byb3RvY29sR3VpZCwNCg0KKyAg ICAgICAgICAgICAgICAgIChWT0lEICoqKSZTaGVsbFBhcmFtZXRlcnMNCg0KKyAgICAgICAgICAg ICAgICAgICk7DQoNCisgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCg0KKyAgICByZXR1cm4g U3RhdHVzOw0KDQorICB9DQoNCisNCg0KKyAgQXJnYyA9IFNoZWxsUGFyYW1ldGVycy0+QXJnYzsN Cg0KKyAgQXJndiA9IFNoZWxsUGFyYW1ldGVycy0+QXJndjsNCg0KKyAgcmV0dXJuIEVGSV9TVUND RVNTOw0KDQorfQ0KDQorDQoNCisvKioNCg0KKyAgQ2hlY2tzIGlmIHRoZSBjaGFyYWN0ZXIgaXMg YSBkZWNpbWFsIGRpZ2l0Lg0KDQorDQoNCisgIEBwYXJhbSBDaGFyIFRoZSBjaGFyYWN0ZXIgdG8g Y2hlY2suDQoNCisNCg0KKyAgQHJldHVybiBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBkZWNp bWFsIGRpZ2l0Lg0KDQorKiovDQoNCitCT09MRUFODQoNCitJc1VuaWNvZGVEZWNpbWFsRGlnaXQg KA0KDQorICBDSEFSMTYgIENoYXINCg0KKyAgKQ0KDQorew0KDQorICByZXR1cm4gKChCT09MRUFO KShDaGFyID49IEwnMCcgJiYgQ2hhciA8PSBMJzknKSk7IH0NCg0KKw0KDQorLyoqDQoNCisgIENv bnZlcnRzIHRoZSBzdHJpbmcgdG8gYW4gaW50ZWdlci4NCg0KKw0KDQorICBAcGFyYW0gU3RyaW5n IFRoZSBpbnB1dCBzdHJpbmcuDQoNCisgIEBwYXJhbSBWYWx1ZSAgVGhlIGNvbnZlcnRlZCBudW1i ZXIuDQoNCisNCg0KKyAgQHJldHVybiBFRklfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciBhbiBlcnJv ciBjb2RlLg0KDQorKiovDQoNCitFRklfU1RBVFVTDQoNCitVbmljb2RlU3RyaW5nVG9JbnRlZ2Vy ICgNCg0KKyAgQ0hBUjE2ICAqU3RyaW5nLA0KDQorICBVSU5UTiAgICpWYWx1ZQ0KDQorICApDQoN Cit7DQoNCisgIFVJTlROICBSZXN1bHQ7DQoNCisNCg0KKyAgUmVzdWx0ID0gMDsNCg0KKw0KDQor ICBpZiAoKFN0cmluZyA9PSBOVUxMKSB8fCAoU3RyU2l6ZSAoU3RyaW5nKSA9PSAwKSB8fCAoVmFs dWUgPT0gTlVMTCkpIHsNCg0KKyAgICByZXR1cm4gKEVGSV9JTlZBTElEX1BBUkFNRVRFUik7DQoN CisgIH0NCg0KKw0KDQorICB3aGlsZSAoSXNVbmljb2RlRGVjaW1hbERpZ2l0ICgqU3RyaW5nKSkg ew0KDQorICAgIGlmICghKFJlc3VsdCA8PSAoRGl2VTY0eDMyICgoKChVSU5UNjQpIH4wKSAtICgq U3RyaW5nIC0gTCcwJykpLCAxMCkpKSkgew0KDQorICAgICAgcmV0dXJuIChFRklfREVWSUNFX0VS Uk9SKTsNCg0KKyAgICB9DQoNCisNCg0KKyAgICBSZXN1bHQgPSBNdWx0VTY0eDMyIChSZXN1bHQs IDEwKSArICgqU3RyaW5nIC0gTCcwJyk7DQoNCisgICAgU3RyaW5nKys7DQoNCisgIH0NCg0KKw0K DQorICAqVmFsdWUgPSBSZXN1bHQ7DQoNCisNCg0KKyAgcmV0dXJuIChFRklfU1VDQ0VTUyk7DQoN Cit9DQoNCisNCg0KKy8qKg0KDQorICBQcmludCBhcHAgdXNhZ2UuDQoNCisqKi8NCg0KK1NUQVRJ Qw0KDQorVk9JRA0KDQorUHJpbnRVc2FnZSAoDQoNCisgIFZPSUQNCg0KKyAgKQ0KDQorew0KDQor ICBQcmludCAoTCJNcFNlcnZpY2VzVGVzdDogIHVzYWdlXG4iKTsNCg0KKyAgUHJpbnQgKEwiICBN cFNlcnZpY2VzVGVzdCAtQSBbLU9dXG4iKTsNCg0KKyAgUHJpbnQgKEwiICBNcFNlcnZpY2VzVGVz dCAtVCA8VGltZW91dD5cbiIpOw0KDQorICBQcmludCAoTCIgIE1wU2VydmljZXNUZXN0IC1TIDxQ cm9jZXNzb3IgIz5cbiIpOw0KDQorICBQcmludCAoTCIgIE1wU2VydmljZXNUZXN0IC1QXG4iKTsN Cg0KKyAgUHJpbnQgKEwiICBNcFNlcnZpY2VzVGVzdCAtVVxuIik7DQoNCisgIFByaW50IChMIiAg TXBTZXJ2aWNlc1Rlc3QgLVdcbiIpOw0KDQorICBQcmludCAoTCIgIE1wU2VydmljZXNUZXN0IC1F IDxQcm9jZXNzb3IgIz5cbiIpOw0KDQorICBQcmludCAoTCIgIE1wU2VydmljZXNUZXN0IC1EIDxQ cm9jZXNzb3IgIz5cbiIpOw0KDQorICBQcmludCAoTCIgIE1wU2VydmljZXNUZXN0IC1oXG4iKTsN Cg0KKyAgUHJpbnQgKEwiUGFyYW1ldGVyOlxuIik7DQoNCisgIFByaW50IChMIiAgLUE6ICBSdW4g YWxsIEFQcy5cbiIpOw0KDQorICBQcmludCAoTCIgIC1POiAgUnVuIEFQcyBzZXF1ZW50aWFsbHkg KHVzZSB3aXRoIC1BKS5cbiIpOw0KDQorICBQcmludCAoTCIgIC1UOiAgU3BlY2lmeSB0aW1lb3V0 IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyB0byB3YWl0DQoNCitmb3JldmVyLlxuIik7DQoN CisgIFByaW50IChMIiAgLVM6ICBTcGVjaWZ5IHRoZSBzaW5nbGUgQVAgdG8gcnVuLlxuIik7DQoN CisgIFByaW50IChMIiAgLVA6ICBQcmludCBwcm9jZXNzb3IgaW5mb3JtYXRpb24uXG4iKTsNCg0K KyAgUHJpbnQgKEwiICAtVTogIFNldCB0aGUgc3BlY2lmaWVkIEFQIHRvIHRoZSBVbmhlYWx0aHkg c3RhdHVzICh1c2UNCg0KK3dpdGggLUUvLUQpLlxuIik7DQoNCisgIFByaW50IChMIiAgLVc6ICBS dW4gV2hvQW1JIGFuZCBwcmludCBpbmRleCBvZiBCU1AuXG4iKTsNCg0KKyAgUHJpbnQgKEwiICAt RTogIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEFQLlxuIik7DQoNCisgIFByaW50IChMIiAgLUQ6ICBE aXNhYmxlIHRoZSBzcGVjaWZpZWQgQVAuXG4iKTsNCg0KKyAgUHJpbnQgKEwiICAtaDogIFByaW50 IHRoaXMgaGVscCBwYWdlLlxuIik7IH0NCg0KKw0KDQorLyoqDQoNCisgIFBhcnNlcyBhbnkgYXJn dW1lbnRzIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuDQoNCisNCg0KKyAgQHBhcmFtIE9w dGlvbnMgIFRoZSBhcmd1bWVudHMgc3RydWN0dXJlLg0KDQorDQoNCisgIEByZXR1cm4gRUZJX1NV Q0NFU1Mgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZS4NCg0KKyoqLw0KDQorRUZJX1NUQVRV Uw0KDQorUGFyc2VBcmd1bWVudHMgKA0KDQorICBNUF9TRVJWSUNFU19URVNUX09QVElPTlMgICpP cHRpb25zDQoNCisgICkNCg0KK3sNCg0KKyAgRUZJX1NUQVRVUyAgICBTdGF0dXM7DQoNCisgIElO VDMyICAgICAgICAgQXJnSW5kZXg7DQoNCisgIENPTlNUIENIQVIxNiAgKkFyZ3VtZW50Ow0KDQor ICBCT09MRUFOICAgICAgIE5lZWRzVmFsdWU7DQoNCisgIFVJTlROICAgICAgICAgKlZhbHVlOw0K DQorDQoNCisgIFN0YXR1cyA9IEdldEFyZyAoKTsNCg0KKyAgaWYgKEVGSV9FUlJPUiAoU3RhdHVz KSkgew0KDQorICAgIFByaW50IChMIlBsZWFzZSB1c2UgdGhlIFVFRkkgU2hlbGwgdG8gcnVuIHRo aXMgYXBwbGljYXRpb24hXG4iLCBTdGF0dXMpOw0KDQorICAgIHJldHVybiBTdGF0dXM7DQoNCisg IH0NCg0KKw0KDQorICBpZiAoQXJnYyA9PSAxKSB7DQoNCisgICAgUHJpbnRVc2FnZSAoKTsNCg0K KyAgfQ0KDQorDQoNCisgIFplcm9NZW0gKE9wdGlvbnMsIHNpemVvZiAoTVBfU0VSVklDRVNfVEVT VF9PUFRJT05TKSk7DQoNCisNCg0KKyAgZm9yIChBcmdJbmRleCA9IDE7IEFyZ0luZGV4IDwgQXJn YzsgQXJnSW5kZXgrKykgew0KDQorICAgIEFyZ3VtZW50ICAgPSBBcmd2W0FyZ0luZGV4XTsNCg0K KyAgICBOZWVkc1ZhbHVlID0gRkFMU0U7DQoNCisNCg0KKyAgICBpZiAoU3RyQ21wIChBcmd1bWVu dCwgTCItQSIpID09IDApIHsNCg0KKyAgICAgIE9wdGlvbnMtPlJ1bkFsbEFQcyA9IFRSVUU7DQoN CisgICAgfSBlbHNlIGlmIChTdHJDbXAgKEFyZ3VtZW50LCBMIi1PIikgPT0gMCkgew0KDQorICAg ICAgT3B0aW9ucy0+UnVuQVBzU2VxdWVudGlhbGx5ID0gVFJVRTsNCg0KKyAgICB9IGVsc2UgaWYg KFN0ckNtcCAoQXJndW1lbnQsIEwiLVQiKSA9PSAwKSB7DQoNCisgICAgICBOZWVkc1ZhbHVlID0g VFJVRTsNCg0KKyAgICAgIFZhbHVlICAgICAgPSAmT3B0aW9ucy0+VGltZW91dDsNCg0KKyAgICB9 IGVsc2UgaWYgKFN0ckNtcCAoQXJndW1lbnQsIEwiLVMiKSA9PSAwKSB7DQoNCisgICAgICBPcHRp b25zLT5SdW5TaW5nbGVBUCA9IFRSVUU7DQoNCisgICAgICBOZWVkc1ZhbHVlICAgICAgICAgICA9 IFRSVUU7DQoNCisgICAgICBWYWx1ZSAgICAgICAgICAgICAgICA9ICZPcHRpb25zLT5Qcm9jZXNz b3JJbmRleDsNCg0KKyAgICB9IGVsc2UgaWYgKFN0ckNtcCAoQXJndW1lbnQsIEwiLVAiKSA9PSAw KSB7DQoNCisgICAgICBPcHRpb25zLT5QcmludFByb2Nlc3NvckluZm9ybWF0aW9uID0gVFJVRTsN Cg0KKyAgICB9IGVsc2UgaWYgKFN0ckNtcCAoQXJndW1lbnQsIEwiLVUiKSA9PSAwKSB7DQoNCisg ICAgICBPcHRpb25zLT5TZXRQcm9jZXNzb3JVbmhlYWx0aHkgPSBUUlVFOw0KDQorICAgIH0gZWxz ZSBpZiAoU3RyQ21wIChBcmd1bWVudCwgTCItVyIpID09IDApIHsNCg0KKyAgICAgIE9wdGlvbnMt PlByaW50QnNwUHJvY2Vzc29ySW5kZXggPSBUUlVFOw0KDQorICAgIH0gZWxzZSBpZiAoU3RyQ21w IChBcmd1bWVudCwgTCItRSIpID09IDApIHsNCg0KKyAgICAgIE9wdGlvbnMtPkVuYWJsZVByb2Nl c3NvciA9IFRSVUU7DQoNCisgICAgICBOZWVkc1ZhbHVlICAgICAgICAgICAgICAgPSBUUlVFOw0K DQorICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgID0gJk9wdGlvbnMtPlByb2Nlc3Nvcklu ZGV4Ow0KDQorICAgIH0gZWxzZSBpZiAoU3RyQ21wIChBcmd1bWVudCwgTCItRCIpID09IDApIHsN Cg0KKyAgICAgIE9wdGlvbnMtPkRpc2FibGVQcm9jZXNzb3IgPSBUUlVFOw0KDQorICAgICAgTmVl ZHNWYWx1ZSAgICAgICAgICAgICAgICA9IFRSVUU7DQoNCisgICAgICBWYWx1ZSAgICAgICAgICAg ICAgICAgICAgID0gJk9wdGlvbnMtPlByb2Nlc3NvckluZGV4Ow0KDQorICAgIH0gZWxzZSB7DQoN CisgICAgICBQcmludFVzYWdlICgpOw0KDQorICAgICAgWmVyb01lbSAoT3B0aW9ucywgc2l6ZW9m IChNUF9TRVJWSUNFU19URVNUX09QVElPTlMpKTsNCg0KKyAgICAgIHJldHVybiBFRklfU1VDQ0VT UzsNCg0KKyAgICB9DQoNCisNCg0KKyAgICBpZiAoTmVlZHNWYWx1ZSkgew0KDQorICAgICAgaWYg KChBcmdJbmRleCArIDEpIDwgQXJnYykgew0KDQorICAgICAgICBTdGF0dXMgPSBVbmljb2RlU3Ry aW5nVG9JbnRlZ2VyIChBcmd2W0FyZ0luZGV4ICsgMV0sIFZhbHVlKTsNCg0KKyAgICAgICAgaWYg KEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KDQorICAgICAgICAgIFByaW50IChMIkVycm9yOiBvcHRp b24gdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuXG4iKTsNCg0KKyAgICAgICAgICBQ cmludFVzYWdlICgpOw0KDQorICAgICAgICAgIHJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7 DQoNCisgICAgICAgIH0NCg0KKw0KDQorICAgICAgICBBcmdJbmRleCsrOw0KDQorICAgICAgfSBl bHNlIHsNCg0KKyAgICAgICAgUHJpbnRVc2FnZSAoKTsNCg0KKyAgICAgICAgcmV0dXJuIEVGSV9J TlZBTElEX1BBUkFNRVRFUjsNCg0KKyAgICAgIH0NCg0KKyAgICB9DQoNCisgIH0NCg0KKw0KDQor ICByZXR1cm4gRUZJX1NVQ0NFU1M7DQoNCit9DQoNCi0tDQoNCjIuMzAuMg0KDQoNCg0KDQoNCg0K DQoNCg0KDQoNCg0KDQoNCrGjw9zJ+cP3o7oNCrG+08q8/rqs09Cxo8Pcu/LXqNPQ0MXPoqOsvfa5 qda4tqjK1bz+yMvKudPDoaPRz737ttSxvtPKvP678sbkxNrI3df2yM66zs60vq3K2siotcSy6dTE oaLKudPDoaK4tNbGu/LXqreioaMNCkNPTkZJREVOVElBTCBOT1RFOg0KVGhpcyBlbWFpbCBjb250 YWlucyBjb25maWRlbnRpYWwgb3IgbGVnYWxseSBwcml2aWxlZ2VkIGluZm9ybWF0aW9uIGFuZCBp cyBmb3IgdGhlIHNvbGUgdXNlIG9mIGl0cyBpbnRlbmRlZCByZWNpcGllbnQuIEFueSB1bmF1dGhv cml6ZWQgcmV2aWV3LCB1c2UsIGNvcHlpbmcgb3IgZm9yd2FyZGluZyBvZiB0aGlzIGVtYWlsIG9y IHRoZSBjb250ZW50IG9mIHRoaXMgZW1haWwgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4NCg== --_000_c17e8e9e81184ce5a91e0086060da864zhaoxincom_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable

Hello:

Does t= his MpServicesTest app have been merged into master branch?

I coul= d not find it in current GitHub code base.

 

Thanks

-----=D3=CA=BC=FE=D4=AD=BC=FE-----

=B7=A2= =BC=FE=C8=CB: devel@edk2.groups.io <d= evel@edk2.groups.io> =B4=FA=B1=ED Rebecca Cran

=B7=A2= =CB=CD=CA=B1=BC=E4: 2022=C4=EA9=D4=C27=C8=D5 12:03

=CA=D5= =BC=FE=C8=CB: devel@edk2.groups.io; ardb@kernel.org; quic_llindhol@quicinc.com; Sami Mujawar = <sami.mujawar@arm.com>; Jian J Wang <jian.j.wang@intel.com>; = Liming Gao <gaoliming@byosoft.com.cn&g= t;

=B3=AD= =CB=CD: Rebecca Cran <rebe= cca@quicinc.com>

=D6=F7= =CC=E2: [edk2-devel] [PATCH v2 2/2] MdeModulePk= g: Add new Application/MpServic= esTest application

 

The MpServicesTest applicati= on exercises the EFI_MP_SERVICES_PROTOCOL.

 

usage:

  MpServicesTest -A [-O= ]

  MpServicesTest -T <= ;Timeout>

  MpServicesTest -S <= ;Processor #>

  MpServicesTest -P

  MpServicesTest -U <= ;Processor #>

  MpServicesTest -W

  MpServicesTest -E <= ;Processor #>

  MpServicesTest -D <= ;Processor #>

  MpServicesTest -h

 

Parameter:=

  -A:  Run all APs= .

  -O:  Run APs seq= uentially (use with -A).

  -T:  Specify tim= eout in milliseconds. Default is to wait forever.

  -S:  Specify the= single AP to run.

  -P:  Print proce= ssor information.

  -U:  Set the spe= cified AP to the Unhealthy status (use with -E/-D).

  -W:  Run WhoAmI = and print index of BSP.

  -E:  Enable the = specified AP.

  -D:  Disable the= specified AP.

  -h:  Print this = help page.

 

Signed-off-by: Rebecca Cran = <rebecca@quicinc.com><= /p>

Reviewed-by: Ard Biesheuvel = <ardb@kernel.org>

---

MdeModulePkg/MdeModulePkg.ds= c            &n= bsp;            = ;     |   2 +

MdeModulePkg/Application/MpServicesTest/M= pServicesTest.inf |  40 ++

MdeModulePkg/Application/MpS= ervicesTest/Options.h         = |  39 ++

MdeModulePkg/Application/MpS= ervicesTest/MpServicesTest.c   | 555 +++++= 3;++++++++++++++

MdeModulePkg/Application/MpS= ervicesTest/Options.c         = | 215 ++++++++

5 files changed, 851 inserti= ons(+)

 

diff --git a/MdeModulePkg/Md= eModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 45a8ec84ad69..295ff4dd= fcd8 100644

--- a/MdeModulePkg/MdeModule= Pkg.dsc

+++ b/MdeModuleP= kg/MdeModulePkg.dsc

@@ -166,6 +166,7 @@ [Lib= raryClasses.common.UEFI_APPLICATION]

   MemoryAllocatio= nLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf

   DebugLib|MdePkg= /Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf

   FileHandleLib|M= dePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf

+  ShellLib|ShellPk= g/Library/UefiShellLib/UefiShellLib.inf

 [LibraryClasses.common= .MM_STANDALONE]

   HobLib|MdeModul= ePkg/Library/BaseHobLibNull/BaseHobLibNull.inf

@@ -445,6 +446,7 @@ [Com= ponents]

   MdeModulePkg/Li= brary/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf

 [Components.IA32, Comp= onents.X64, Components.AARCH64]

+  MdeModulePkg/App= lication/MpServicesTest/MpServicesTest.inf

   MdeModulePkg/Un= iversal/EbcDxe/EbcDxe.inf

   MdeModulePkg/Un= iversal/EbcDxe/EbcDebugger.inf

   MdeModulePkg/Un= iversal/EbcDxe/EbcDebuggerConfig.inf

diff --git a/MdeModulePkg/Ap= plication/MpServicesTest/MpServicesTest.inf b/MdeModulePkg/Application/MpSe= rvicesTest/MpServicesTest.inf

new file mode 100644

index 000000000000..07ee4afe= c845

--- /dev/null

+++ b/MdeModuleP= kg/Application/MpServicesTest/MpServicesTest.inf

@@ -0,0 +1,40 @@

+## @file

+#  UEFI Applicatio= n to exercise EFI_MP_SERVICES_PROTOCOL.

+#

+#  Copyright (c) 2= 022, Qualcomm Innovation Center, Inc. All rights

+reserved.<BR> # #=   SPDX-License-Identifier: BSD-2-Clause-Patent # ##<= /p>

+

+[Defines]

+  INF_VERSION = ;            &n= bsp;      =3D 1.29

+  BASE_NAME &= nbsp;           &nbs= p;        =3D MpServicesTest<= /span>

+  FILE_GUID &= nbsp;           &nbs= p;        =3D 43e9defa-7209-4b0d-b136-cc= 4ca02cb469

+  MODULE_TYPE = ;            &n= bsp;      =3D UEFI_APPLICATION

+  VERSION_STRING&n= bsp;            = ;    =3D 0.1

+  ENTRY_POINT = ;            &n= bsp;      =3D UefiMain

+

+#

+# The following informa= tion is for reference only and not required by the build tools.<= /span>

+#

+#  VALID_ARCHITECT= URES           =3D IA32 X= 64 AARCH64

+#

+

+[Sources]

+  MpServicesTest.c=

+  Options.c

+  Options.h

+

+[Packages]

+  MdePkg/MdePkg.de= c

+

+[LibraryClasses]

+  BaseLib

+  ShellLib

+  UefiApplicationE= ntryPoint

+  UefiLib

+

+[Protocols]<= /span>

+  gEfiMpServicePro= tocolGuid    ## CONSUMES

+

diff --git a/MdeModulePkg/Ap= plication/MpServicesTest/Options.h b/MdeModulePkg/Application/MpServicesTes= t/Options.h

new file mode 100644

index 000000000000..cb28230a= b095

--- /dev/null

+++ b/MdeModuleP= kg/Application/MpServicesTest/Options.h

@@ -0,0 +1,39 @@

+/** @file

+  Options handling= code.

+

+  Copyright (c) 20= 22, Qualcomm Innovation Center, Inc. All rights

+reserved.<BR>

+  SPDX-License-Ide= ntifier: BSD-2-Clause-Patent **/

+

+#ifndef MPSERVICESTEST_= OPTIONS_H_

+#define MPSERVICESTEST_= OPTIONS_H_

+

+#define INFINITE_TIMEOU= T  0

+

+typedef struct {

+  UINTN  = ;    Timeout;

+  UINTN  = ;    ProcessorIndex;

+  BOOLEAN &nb= sp;  RunAllAPs;

+  BOOLEAN &nb= sp;  RunSingleAP;

+  BOOLEAN &nb= sp;  DisableProcessor;

+  BOOLEAN &nb= sp;  EnableProcessor;

+  BOOLEAN &nb= sp;  SetProcessorHealthy;

+  BOOLEAN &nb= sp;  SetProcessorUnhealthy;

+  BOOLEAN &nb= sp;  PrintProcessorInformation;

+  BOOLEAN &nb= sp;  PrintBspProcessorIndex;

+  BOOLEAN &nb= sp;  RunAPsSequentially;

+} MP_SERVICES_TEST_OPTI= ONS;

+

+/**

+  Parses any argum= ents provided on the command line.

+

+  @param Options&n= bsp; The arguments structure.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+**/

+EFI_STATUS

+ParseArguments (

+  MP_SERVICES_TEST= _OPTIONS  *Options

+  );

+

+#endif /* MPSERVICESTES= T_OPTIONS_H_ */

diff --git a/MdeModulePkg/Ap= plication/MpServicesTest/MpServicesTest.c b/MdeModulePkg/Application/MpServ= icesTest/MpServicesTest.c

new file mode 100644

index 000000000000..1cea8f52= f25d

--- /dev/null

+++ b/MdeModuleP= kg/Application/MpServicesTest/MpServicesTest.c

@@ -0,0 +1,555 @@

+/** @file

+  UEFI Application= to exercise EFI_MP_SERVICES_PROTOCOL.

+

+  Copyright (c) 20= 22, Qualcomm Innovation Center, Inc. All rights

+reserved.<BR>

+  SPDX-License-Ide= ntifier: BSD-2-Clause-Patent **/

+

+#include <Uefi.h>=

+#include <Library/Ba= seMemoryLib.h>

+#include <Library/De= bugLib.h>

+#include <Library/Me= moryAllocationLib.h> #include <Library/PrintLib.h>

+#include <Library/Ue= fiBootServicesTableLib.h>

+#include <Library/Ue= fiLib.h>

+#include <Pi/PiMulti= Phase.h>

+#include <Protocol/M= pService.h>

+

+#include "Options.= h"

+

+#define APFUNC_BUFFER_L= EN  256

+

+typedef struct {

+  EFI_MP_SERVICES_= PROTOCOL    *Mp;

+  CHAR16 &nbs= p;            &= nbsp;       **Buffer;

+} APFUNC_ARG;

+

+/** The procedure to ru= n with the MP Services interface.

+

+  @param Arg The p= rocedure argument.

+

+**/

+STATIC

+VOID<= /p>

+EFIAPI

+ApFunction (=

+  IN OUT VOID = ; *Arg

+  )

+{

+  APFUNC_ARG = *Param;

+  UINTN  = ;     ProcessorId;

+

+  if (Arg !=3D NUL= L) {

+    Para= m =3D Arg;

+

+    Para= m->Mp->WhoAmI (Param->Mp, &ProcessorId);

+    Unic= odeSPrint (Param->Buffer[ProcessorId], APFUNC_BUFFER_LEN,

+L"Hello from CPU %= ld\n", ProcessorId);

+  }

+}

+

+/**

+  Fetches the numb= er of processors and which processor is the BSP.

+

+  @param Mp  = MP Services Protocol.

+  @param NumProces= sors Number of processors.

+  @param BspIndex&= nbsp;     The index of the BSP.

+**/

+STATIC

+EFI_STATUS

+GetProcessorInformation= (

+  IN  EFI_MP_= SERVICES_PROTOCOL  *Mp,

+  OUT UINTN &= nbsp;           &nbs= p;       *NumProcessors,

+  OUT UINTN &= nbsp;            &nb= sp;      *BspIndex

+  )

+{

+  EFI_STATUS = Status;

+  UINTN  = ;     NumEnabledProcessors;

+

+  Status =3D Mp-&g= t;GetNumberOfProcessors (Mp, NumProcessors,

+ &NumEnabledProcess= ors);  if (EFI_ERROR (Status)) {

+    retu= rn Status;

+  }

+

+  Status =3D Mp-&g= t;WhoAmI (Mp, BspIndex);

+  if (EFI_ERROR (S= tatus)) {

+    retu= rn Status;

+  }

+

+  return EFI_SUCCE= SS;

+}

+

+/** Displays informatio= n returned from MP Services Protocol.

+

+  @param Mp &= nbsp;     The MP Services Protocol

+  @param BspIndex = On return, contains the index of the BSP.

+

+  @return The numb= er of CPUs in the system.

+

+**/

+STATIC

+UINTN=

+PrintProcessorInformati= on (

+  IN   E= FI_MP_SERVICES_PROTOCOL  *Mp,

+  OUT  UINTN&= nbsp;           &nbs= p;        *BspIndex

+  )

+{

+  EFI_STATUS =             &nb= sp;   Status;

+  EFI_PROCESSOR_IN= FORMATION  CpuInfo;

+  UINTN  = ;            &n= bsp;       Index;

+  UINTN  = ;            &n= bsp;       NumCpu;

+  UINTN  = ;            &n= bsp;       NumEnabledCpu;

+

+  Status =3D Mp-&g= t;GetNumberOfProcessors (Mp, &NumCpu, &NumEnabledCpu);  if

+ (EFI_ERROR (Status)) {=

+    Prin= t (L"GetNumberOfProcessors failed: %r\n", Status);  } else {=

+    Prin= t (L"Number of CPUs: %ld, Enabled: %d\n", NumCpu,

+ NumEnabledCpu);  = }

+

+  for (Index =3D 0= ; Index < NumCpu; Index++) {

+    Stat= us =3D Mp->GetProcessorInfo (Mp, CPU_V2_EXTENDED_TOPOLOGY | Index, &= CpuInfo);

+    if (= EFI_ERROR (Status)) {

+    = ;  Print (L"GetProcessorInfo for Processor %d failed: %r\n",= Index, Status);

+    } el= se {

+    = ;  Print (

+    = ;    L"Processor %d:\n"

+    = ;    L"\tID: %016lx\n"

+    = ;    L"\tStatus: %s | ",

+    = ;    Index,

+    = ;    CpuInfo.ProcessorId,

+    = ;    (CpuInfo.StatusFlag & PROCESSOR_AS_BSP_BIT) ? L&quo= t;BSP" : L"AP"

+    = ;    );

+

+    = ;  if ((CpuInfo.StatusFlag & PROCESSOR_AS_BSP_BIT) && (Bsp= Index !=3D NULL)) {

+    = ;    *BspIndex =3D Index;

+    = ;  }

+

+    = ;  Print (L"%s | ", (CpuInfo.StatusFlag & PROCESSOR_ENAB= LED_BIT) ? L"Enabled" : L"Disabled");=

+    = ;  Print (L"%s\n", (CpuInfo.StatusFlag &

+ PROCESSOR_HEALTH_STATU= S_BIT) ? L"Healthy" : L"Faulted");

+

+    &nbs= p; Print (

+    = ;    L"\tLocation: Package %d, Core %d, Thread %d\n&quo= t;

+    = ;    L"\tExtended Information: Package %d, Module %d, T= ile %d, Die %d, Core %d, Thread %d\n\n",

+    = ;    CpuInfo.Location.Package,

+    = ;    CpuInfo.Location.Core,

+    = ;    CpuInfo.Location.Thread,

+    = ;    CpuInfo.ExtendedInformation.Location2.Package,

+    = ;    CpuInfo.ExtendedInformation.Location2.Module,

+    = ;    CpuInfo.ExtendedInformation.Location2.Tile,<= /span>

+    = ;    CpuInfo.ExtendedInformation.Location2.Die,

+    = ;    CpuInfo.ExtendedInformation.Location2.Core,<= /span>

+    = ;    CpuInfo.ExtendedInformation.Location2.Thread=

+    = ;    );

+    }

+  }

+

+  return NumCpu;

+}

+

+/** Allocates memory in= ApArg for the single AP specified.

+

+  @param ApArg&nbs= p;         Pointer to the AP argume= nt structure.

+  @param Mp &= nbsp;           The MP Se= rvices Protocol.

+  @param Processor= Index The index of the AP.

+

+  @retval EFI_SUCC= ESS          Memory was succes= sfully allocated.

+  @retval EFI_OUT_= OF_RESOURCES Failed to allocate memory.

+

+**/

+STATIC

+EFI_STATUS

+AllocateApFuncBufferSin= gleAP (

+  IN APFUNC_ARG&nb= sp;            =    *ApArg,

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  IN UINTN &n= bsp;            = ;       ProcessorIndex

+  )

+{

+  ApArg->Mp =3D= Mp;

+

+  ApArg->Buffer= =3D AllocateZeroPool ((ProcessorIndex + 1) * sizeof (VOID

+ *));  if (ApArg-&= gt;Buffer =3D=3D NULL) {

+    Prin= t (L"Failed to allocate buffer for AP buffer\n");

+    retu= rn EFI_OUT_OF_RESOURCES;

+  }

+

+  ApArg->Buffer= [ProcessorIndex] =3D AllocateZeroPool (APFUNC_BUFFER_LEN);

+ if (ApArg->Buffer[P= rocessorIndex] =3D=3D NULL) {

+    Prin= t (L"Failed to allocate buffer for AP buffer\n");

+    Free= Pool (ApArg->Buffer);

+    retu= rn EFI_OUT_OF_RESOURCES;

+  }

+

+  return EFI_SUCCE= SS;

+}

+

+/** Allocates memory in= ApArg for all APs.

+

+  @param ApArg&nbs= p;  Pointer to the AP argument structure.

+  @param Mp &= nbsp;    The MP Services Protocol.

+  @param NumCpus T= he number of CPUs.

+

+  @retval EFI_SUCC= ESS          Memory was succes= sfully allocated.

+  @retval EFI_OUT_= OF_RESOURCES Failed to allocate memory.

+

+**/

+STATIC

+EFI_STATUS

+AllocateApFuncBufferAll= APs (

+  IN APFUNC_ARG&nb= sp;            =    *ApArg,

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  IN UINTN &n= bsp;            = ;       NumCpus

+  )

+{

+  INT32  Inde= x;

+

+  ApArg->Mp =3D= Mp;

+

+  ApArg->Buffer= =3D AllocateZeroPool (NumCpus * sizeof (VOID *));  if

+ (ApArg->Buffer =3D= =3D NULL) {

+    Prin= t (L"Failed to allocate buffer for AP message\n");

+    retu= rn EFI_OUT_OF_RESOURCES;

+  }

+

+  for (Index =3D 0= ; Index < NumCpus; Index++) {

+    ApAr= g->Buffer[Index] =3D AllocateZeroPool (APFUNC_BUFFER_LEN);

+    if (= ApArg->Buffer[Index] =3D=3D NULL) {

+    = ;  Print (L"Failed to allocate buffer for AP message\n");

+    = ;  for (--Index; Index >=3D 0; Index++) {=

+    = ;    FreePool (ApArg->Buffer[Index]);

+    = ;  }

+

+    = ;  FreePool (ApArg->Buffer);

+    = ;  return EFI_OUT_OF_RESOURCES;

+    }

+  }

+

+  return EFI_SUCCE= SS;

+}

+

+/** Frees memory in ApA= rg for all APs.

+

+  @param ApArg&nbs= p;  Pointer to the AP argument structure.

+  @param NumCpus T= he number of CPUs.

+

+**/

+STATIC

+VOID<= /p>

+FreeApFuncBuffer (=

+  APFUNC_ARG = *ApArg,

+  UINTN  = ;     NumCpus

+  )

+{

+  UINTN  Inde= x;

+

+  for (Index =3D 0= ; Index < NumCpus; Index++) {

+    if (= ApArg->Buffer[Index] !=3D NULL) {

+    = ;  FreePool (ApArg->Buffer[Index]);

+    }

+  }

+

+  FreePool (ApArg-= >Buffer);

+}

+

+/** Runs a specified AP= .

+

+  @param Mp &= nbsp;           The MP Se= rvices Protocol.

+  @param Processor= Index The processor index.

+  @param Timeout&n= bsp;       Timeout in milliseconds.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+

+**/

+STATIC

+EFI_STATUS

+StartupThisAP (

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  IN UINTN &n= bsp;            = ;       ProcessorIndex,

+  IN UINTN &n= bsp;            = ;       Timeout

+  )

+{

+  EFI_STATUS = Status;

+  APFUNC_ARG = ApArg;

+

+  Status =3D Alloc= ateApFuncBufferSingleAP (&ApArg, Mp, ProcessorIndex);

+ if (EFI_ERROR (Status)= ) {

+    retu= rn Status;

+  }

+

+  Status =3D Alloc= ateApFuncBufferSingleAP (&ApArg, Mp, ProcessorIndex);

+ if (EFI_ERROR (Status)= ) {

+    retu= rn Status;

+  }

+

+  Print (

+    L&qu= ot;StartupThisAP on Processor %d with %d%s timeout...",

+    Proc= essorIndex,

+    Time= out,

+    (Tim= eout =3D=3D INFINITE_TIMEOUT) ? L" (infinite)" : L"ms"<= o:p>

+    );

+  Status =3D Mp-&g= t;StartupThisAP (

+    = ;             M= p,

+    = ;             A= pFunction,

+    = ;             P= rocessorIndex,

+    = ;             N= ULL,

+    = ;             T= imeout * 1000,

+    = ;             &= amp;ApArg,

+    = ;             N= ULL

+    = ;             )= ;

+  if (EFI_ERROR (S= tatus)) {

+    Prin= t (L"failed: %r\n", Status);

+    retu= rn Status;

+  } else {

+    Prin= t (L"done.\n");

+    Prin= t (ApArg.Buffer[ProcessorIndex]);  }

+

+  FreeApFuncBuffer= (&ApArg, ProcessorIndex + 1);

+

+  return EFI_SUCCE= SS;

+}

+

+/** Runs all APs.<= /o:p>

+

+  @param Mp &= nbsp;           &nbs= p;   The MP Services Protocol.

+  @param NumCpus&n= bsp;           The number= of CPUs in the system.

+  @param Timeout&n= bsp;           Timeout in= milliseconds.

+  @param RunAPsSeq= uentially Run APs sequentially (FALSE: run

+ simultaneously)

+

+  @return EFI_SUCC= ESS on success, or an error code.

+

+**/

+STATIC

+EFI_STATUS

+StartupAllAPs (

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  IN UINTN &n= bsp;            = ;       NumCpus,

+  IN UINTN &n= bsp;            = ;       Timeout,

+  IN BOOLEAN =             &nb= sp;     RunAPsSequentially

+  )

+{

+  EFI_STATUS = Status;

+  UINTN  = ;     Index;

+  APFUNC_ARG = ApArg;

+

+  Status =3D Alloc= ateApFuncBufferAllAPs (&ApArg, Mp, NumCpus);  if

+ (EFI_ERROR (Status)) {=

+    retu= rn Status;

+  }

+

+  Print (

+    L&qu= ot;Running with SingleThread TRUE, %d%s timeout...",=

+    Time= out,

+    (Tim= eout =3D=3D INFINITE_TIMEOUT) ? L" (infinite)" : L"ms"<= o:p>

+    );

+  Status =3D Mp-&g= t;StartupAllAPs (

+    = ;             M= p,

+    = ;             A= pFunction,

+    = ;             R= unAPsSequentially,

+    = ;             N= ULL,

+    = ;             T= imeout * 1000,

+    = ;             &= amp;ApArg,

+    = ;             N= ULL

+    = ;             )= ;

+  if (EFI_ERROR (S= tatus)) {

+    Prin= t (L"failed: %r\n", Status);

+    retu= rn Status;

+  } else {

+    Prin= t (L"done.\n");

+    for = (Index =3D 0; Index < NumCpus; Index++) {

+    = ;  Print (ApArg.Buffer[Index]);

+    }

+  }

+

+  FreeApFuncBuffer= (&ApArg, NumCpus);

+  return EFI_SUCCE= SS;

+}

+

+/**

+  Enables the spec= ified AP.

+

+  @param Mp &= nbsp;           &nbs= p; The MP Services Protocol.

+  @param Processor= Index   The processor to enable.

+  @param Processor= Healthy The health status of the processor.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+**/

+STATIC

+EFI_STATUS

+EnableAP (

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  UINTN  = ;            &n= bsp;         ProcessorIndex,

+  BOOLEAN &nb= sp;            =         ProcessorHealthy

+  )

+{

+  EFI_STATUS = Status;

+  UINT32 &nbs= p;    HealthFlag;

+

+  if (ProcessorHea= lthy) {

+    Prin= t (L"Enabling Processor %d with HealthFlag healthy...", Processor= Index);

+    Heal= thFlag =3D PROCESSOR_HEALTH_STATUS_BIT;  } else {

+    Prin= t (L"Enabling Processor %d with HealthFlag faulted...", Processor= Index);

+    Heal= thFlag =3D 0;

+  }

+

+  Status =3D Mp-&g= t;EnableDisableAP (Mp, ProcessorIndex, TRUE, &HealthFlag);

+ if (EFI_ERROR (Status)= ) {

+    Prin= t (L"failed: %r\n", Status);

+    retu= rn Status;

+  } else {

+    Prin= t (L"done.\n");

+  }

+

+  return Status;

+}

+

+/**

+  Disables the spe= cified AP.

+

+  @param Mp &= nbsp;           &nbs= p; The MP Services Protocol.

+  @param Processor= Index   The processor to disable.

+  @param Processor= Healthy The health status of the processor.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+**/

+STATIC

+EFI_STATUS

+DisableAP (<= /span>

+  IN EFI_MP_SERVIC= ES_PROTOCOL  *Mp,

+  UINTN  = ;            &n= bsp;         ProcessorIndex,

+  BOOLEAN &nb= sp;            =         ProcessorHealthy

+  )

+{

+  EFI_STATUS = Status;

+  UINT32 &nbs= p;    HealthFlag;

+

+  if (ProcessorHea= lthy) {

+    Prin= t (L"Disabling Processor %d with HealthFlag healthy...", Processo= rIndex);

+    Heal= thFlag =3D PROCESSOR_HEALTH_STATUS_BIT;  } else {

+    Prin= t (L"Disabling Processor %d with HealthFlag faulted...", Processo= rIndex);

+    Heal= thFlag =3D 0;

+  }

+

+  Status =3D Mp-&g= t;EnableDisableAP (Mp, ProcessorIndex, FALSE,

+ &HealthFlag); = ; if (EFI_ERROR (Status)) {

+    Prin= t (L"failed: %r\n", Status);

+    retu= rn Status;

+  } else {

+    Prin= t (L"done.\n");

+  }

+

+  return Status;

+}

+

+/**

+  The user Entry P= oint for Application. The user code starts with this

+function

+  as the real entr= y point for the application.

+

+  @param[in] Image= Handle    The firmware allocated handle for the EFI image.

+  @param[in] Syste= mTable    A pointer to the EFI System Table.

+

+  @retval EFI_SUCC= ESS       The entry point is executed success= fully.

+  @retval other&nb= sp;            Some = error occurs when executing this entry point.

+

+**/

+EFI_STATUS

+EFIAPI

+UefiMain (

+  IN EFI_HANDLE&nb= sp;       ImageHandle,

+  IN EFI_SYSTEM_TA= BLE  *SystemTable

+  )

+{

+  EFI_STATUS =             &nb= sp;  Status;

+  EFI_MP_SERVICES_= PROTOCOL  *Mp;

+  UINTN  = ;            &n= bsp;      BspIndex;

+  UINTN  = ;            &n= bsp;      CpuIndex;

+  UINTN  = ;            &n= bsp;      NumCpus;

+  BOOLEAN &nb= sp;            =      ProcessorHealthy;

+  MP_SERVICES_TEST= _OPTIONS  Options;

+

+  BspIndex =3D 0;<= o:p>

+

+  Status =3D gBS-&= gt;LocateProtocol (

+    = ;            &n= bsp; &gEfiMpServiceProtocolGuid,

+    = ;            &n= bsp; NULL,

+    = ;            &n= bsp; (VOID **)&Mp

+    = ;            &n= bsp; );

+  if (EFI_ERROR (S= tatus)) {

+    Prin= t (L"Failed to locate EFI_MP_SERVICES_PROTOCOL (%r). Not installed on = platform?\n", Status);

+    retu= rn EFI_NOT_FOUND;

+  }

+

+  Status =3D Parse= Arguments (&Options);

+  if (EFI_ERROR (S= tatus)) {

+    retu= rn EFI_INVALID_PARAMETER;

+  }

+

+  Status =3D GetPr= ocessorInformation (Mp, &NumCpus, &BspIndex);  if

+ (EFI_ERROR (Status)) {=

+    Prin= t (L"Error: Failed to fetch processor information.\n");

+    retu= rn Status;

+  }

+

+  if (Options.Prin= tBspProcessorIndex) {

+    Stat= us =3D Mp->WhoAmI (Mp, &CpuIndex);

+    if (= EFI_ERROR (Status)) {

+    = ;  Print (L"WhoAmI failed: %r\n", Status);=

+    = ;  return Status;

+    } el= se {

+    = ;  Print (L"BSP: %016lx\n", CpuIndex);

+    }

+  }

+

+  if (Options.Prin= tProcessorInformation) {

+    NumC= pus =3D PrintProcessorInformation (Mp, &BspIndex);

+    if (= NumCpus < 2) {

+    = ;  Print (L"Error: Uniprocessor system found.\n");

+    = ;  return EFI_INVALID_PARAMETER;

+    }

+  }

+

+  if (Options.RunS= ingleAP) {

+    Stat= us =3D StartupThisAP (

+    = ;           Mp,

+    = ;           Options.Proce= ssorIndex,

+    = ;           Options.Timeo= ut

+    = ;           );=

+    if (= EFI_ERROR (Status)) {

+    = ;  return Status;

+    }

+  }

+

+  if (Options.RunA= llAPs) {

+    Stat= us =3D StartupAllAPs (Mp, NumCpus, Options.Timeout, Options.RunAPsSequentia= lly);

+    if (= EFI_ERROR (Status)) {

+    = ;  return Status;

+    }

+  }

+

+  if (Options.Enab= leProcessor) {

+    Proc= essorHealthy =3D TRUE;

+    if (= Options.SetProcessorUnhealthy) {

+    = ;  ProcessorHealthy =3D FALSE;

+    }

+

+    Stat= us =3D EnableAP (Mp, Options.ProcessorIndex, ProcessorHealthy);<= /span>

+    if (= EFI_ERROR (Status)) {

+    = ;  return Status;

+    }

+  }

+

+  if (Options.Disa= bleProcessor) {

+    Proc= essorHealthy =3D TRUE;

+    if (= Options.SetProcessorUnhealthy) {

+    = ;  ProcessorHealthy =3D FALSE;

+    }

+

+    Stat= us =3D DisableAP (Mp, Options.ProcessorIndex, ProcessorHealthy);=

+    if (= EFI_ERROR (Status)) {

+    = ;  return Status;

+    }

+  }

+

+  return EFI_SUCCE= SS;

+}

diff --git a/MdeModulePkg/Ap= plication/MpServicesTest/Options.c b/MdeModulePkg/Application/MpServicesTes= t/Options.c

new file mode 100644

index 000000000000..2ea2c94b= 7c74

--- /dev/null

+++ b/MdeModuleP= kg/Application/MpServicesTest/Options.c

@@ -0,0 +1,215 @@

+/** @file

+  Options handling= code.

+

+  Copyright (c) 20= 22, Qualcomm Innovation Center, Inc. All rights reserved.<BR>

+  Copyright (c) 20= 10-2019  Finnbarr P. Murphy.   All rights reserved.<BR>= ;

+  SPDX-License-Ide= ntifier: BSD-2-Clause-Patent **/

+

+#include <Uefi.h>=

+#include <Library/Ba= seMemoryLib.h>

+#include <Protocol/S= hellParameters.h>

+#include <Library/Ba= seLib.h>

+#include <Library/Ue= fiLib.h>

+#include <Library/Ue= fiBootServicesTableLib.h>

+

+#include "Options.= h"

+

+STATIC UINTN  = ; Argc;

+STATIC CHAR16  **A= rgv;

+

+/**

+

+  This function pr= ovides argc and argv.

+

+  @return Status

+**/

+EFI_STATUS

+GetArg (

+  VOID<= /span>

+  )

+{

+  EFI_STATUS =             &nb= sp;       Status;

+  EFI_SHELL_PARAME= TERS_PROTOCOL  *ShellParameters;

+

+  Status =3D gBS-&= gt;HandleProtocol (

+    = ;            &n= bsp; gImageHandle,

+    = ;            &n= bsp; &gEfiShellParametersProtocolGuid,

+    &nbs= p;            &= nbsp;(VOID **)&ShellParameters

+    = ;            &n= bsp; );

+  if (EFI_ERROR (S= tatus)) {

+    retu= rn Status;

+  }

+

+  Argc =3D ShellPa= rameters->Argc;

+  Argv =3D ShellPa= rameters->Argv;

+  return EFI_SUCCE= SS;

+}

+

+/**

+  Checks if the ch= aracter is a decimal digit.

+

+  @param Char The = character to check.

+

+  @return TRUE if = the character is a decimal digit.

+**/

+BOOLEAN

+IsUnicodeDecimalDigit (=

+  CHAR16  Cha= r

+  )

+{

+  return ((BOOLEAN= )(Char >=3D L'0' && Char <=3D L'9')); }

+

+/**

+  Converts the str= ing to an integer.

+

+  @param String Th= e input string.

+  @param Value&nbs= p; The converted number.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+**/

+EFI_STATUS

+UnicodeStringToInteger = (

+  CHAR16  *St= ring,

+  UINTN  = ; *Value

+  )

+{

+  UINTN  Resu= lt;

+

+  Result =3D 0;

+

+  if ((String =3D= =3D NULL) || (StrSize (String) =3D=3D 0) || (Value =3D=3D NULL)) {

+    retu= rn (EFI_INVALID_PARAMETER);

+  }

+

+  while (IsUnicode= DecimalDigit (*String)) {

+    if (= !(Result <=3D (DivU64x32 ((((UINT64) ~0) - (*String - L'0')), 10)))) {

+    = ;  return (EFI_DEVICE_ERROR);

+    }

+

+    Resu= lt =3D MultU64x32 (Result, 10) + (*String - L'0');

+    Stri= ng++;

+  }

+

+  *Value =3D Resul= t;

+

+  return (EFI_SUCC= ESS);

+}

+

+/**

+  Print app usage.=

+**/

+STATIC

+VOID<= /p>

+PrintUsage (=

+  VOID<= /span>

+  )

+{

+  Print (L"Mp= ServicesTest:  usage\n");

+  Print (L"&n= bsp; MpServicesTest -A [-O]\n");

+  Print (L"&n= bsp; MpServicesTest -T <Timeout>\n");

+  Print (L"&n= bsp; MpServicesTest -S <Processor #>\n");

+  Print (L"&n= bsp; MpServicesTest -P\n");

+  Print (L"&n= bsp; MpServicesTest -U\n");

+  Print (L"&n= bsp; MpServicesTest -W\n");

+  Print (L"&n= bsp; MpServicesTest -E <Processor #>\n");

+  Print (L"&n= bsp; MpServicesTest -D <Processor #>\n");

+  Print (L"&n= bsp; MpServicesTest -h\n");

+  Print (L"Pa= rameter:\n");

+  Print (L"&n= bsp; -A:  Run all APs.\n");

+  Print (L"&n= bsp; -O:  Run APs sequentially (use with -A).\n");

+  Print (L"&n= bsp; -T:  Specify timeout in milliseconds. Default is to wait

+forever.\n");=

+  Print (L"&n= bsp; -S:  Specify the single AP to run.\n");

+  Print (L"&n= bsp; -P:  Print processor information.\n");

+  Print (L"&n= bsp; -U:  Set the specified AP to the Unhealthy status (use

+with -E/-D).\n");<= o:p>

+  Print (L"&n= bsp; -W:  Run WhoAmI and print index of BSP.\n");

+  Print (L"&n= bsp; -E:  Enable the specified AP.\n");

+  Print (L"&n= bsp; -D:  Disable the specified AP.\n");

+  Print (L"&n= bsp; -h:  Print this help page.\n"); }

+

+/**

+  Parses any argum= ents provided on the command line.

+

+  @param Options&n= bsp; The arguments structure.

+

+  @return EFI_SUCC= ESS on success, or an error code.

+**/

+EFI_STATUS

+ParseArguments (

+  MP_SERVICES_TEST= _OPTIONS  *Options

+  )

+{

+  EFI_STATUS =    Status;

+  INT32  = ;       ArgIndex;

+  CONST CHAR16&nbs= p; *Argument;

+  BOOLEAN &nb= sp;     NeedsValue;

+  UINTN  = ;       *Value;

+

+  Status =3D GetAr= g ();

+  if (EFI_ERROR (S= tatus)) {

+    Prin= t (L"Please use the UEFI Shell to run this application!\n", Statu= s);

+    retu= rn Status;

+  }

+

+  if (Argc =3D=3D = 1) {

+    Prin= tUsage ();

+  }

+

+  ZeroMem (Options= , sizeof (MP_SERVICES_TEST_OPTIONS));

+

+  for (ArgIndex = =3D 1; ArgIndex < Argc; ArgIndex++) {

+    Argu= ment   =3D Argv[ArgIndex];

+    Need= sValue =3D FALSE;

+

+    if (= StrCmp (Argument, L"-A") =3D=3D 0) {

+    = ;  Options->RunAllAPs =3D TRUE;

+    } el= se if (StrCmp (Argument, L"-O") =3D=3D 0) {

+    = ;  Options->RunAPsSequentially =3D TRUE;

+    } el= se if (StrCmp (Argument, L"-T") =3D=3D 0) {

+    = ;  NeedsValue =3D TRUE;

+    = ;  Value      =3D &Options->Timeout;

+    } el= se if (StrCmp (Argument, L"-S") =3D=3D 0) {

+    = ;  Options->RunSingleAP =3D TRUE;

+    = ;  NeedsValue         &nb= sp; =3D TRUE;

+    = ;  Value          &n= bsp;     =3D &Options->ProcessorIndex;

+    } el= se if (StrCmp (Argument, L"-P") =3D=3D 0) {

+    = ;  Options->PrintProcessorInformation =3D TRUE;

+    } el= se if (StrCmp (Argument, L"-U") =3D=3D 0) {

+    = ;  Options->SetProcessorUnhealthy =3D TRUE;

+    } el= se if (StrCmp (Argument, L"-W") =3D=3D 0) {

+    = ;  Options->PrintBspProcessorIndex =3D TRUE;

+    } el= se if (StrCmp (Argument, L"-E") =3D=3D 0) {

+    = ;  Options->EnableProcessor =3D TRUE;

+    = ;  NeedsValue         &nb= sp;     =3D TRUE;

+    = ;  Value          &n= bsp;         =3D &Options->P= rocessorIndex;

+    } el= se if (StrCmp (Argument, L"-D") =3D=3D 0) {

+    = ;  Options->DisableProcessor =3D TRUE;

+    = ;  NeedsValue         &nb= sp;      =3D TRUE;

+    = ;  Value          &n= bsp;          =3D &Options= ->ProcessorIndex;

+    } el= se {

+    = ;  PrintUsage ();

+    = ;  ZeroMem (Options, sizeof (MP_SERVICES_TEST_OPTIONS));

+    = ;  return EFI_SUCCESS;

+    }

+

+    if (= NeedsValue) {

+    = ;  if ((ArgIndex + 1) < Argc) {

+    = ;    Status =3D UnicodeStringToInteger (Argv[ArgIndex + = 1], Value);

+    = ;    if (EFI_ERROR (Status)) {

+    = ;      Print (L"Error: option value must be a= positive integer.\n");

+    = ;      PrintUsage ();

+    = ;      return EFI_INVALID_PARAMETER;

+    = ;    }

+

+    = ;    ArgIndex++;

+    = ;  } else {

+    = ;    PrintUsage ();

+    = ;    return EFI_INVALID_PARAMETER;

+    = ;  }

+    }

+  }

+

+  return EFI_SUCCE= SS;

+}

--

2.30.2

 

 

 

 

 



=B1=A3=C3=DC=C9=F9=C3=F7=A3=BA
=B1=BE=D3=CA=BC=FE=BA=AC=D3=D0=B1=A3=C3=DC=BB=F2=D7=A8=D3= =D0=D0=C5=CF=A2=A3=AC=BD=F6=B9=A9=D6=B8=B6=A8=CA=D5=BC=FE=C8=CB=CA=B9=D3=C3= =A1=A3=D1=CF=BD=FB=B6=D4=B1=BE=D3=CA=BC=FE=BB=F2=C6=E4=C4=DA=C8=DD=D7=F6=C8= =CE=BA=CE=CE=B4=BE=AD=CA=DA=C8=A8=B5=C4=B2=E9=D4=C4=A1=A2=CA=B9=D3=C3=A1=A2= =B8=B4=D6=C6=BB=F2=D7=AA=B7=A2=A1=A3
CONFIDENTIAL NOTE:
This email contains confidential or legally privileged information and i= s for the sole use of its intended recipient. Any unauthorized review, use,= copying or forwarding of this email or the content of this email is strict= ly prohibited.
--_000_c17e8e9e81184ce5a91e0086060da864zhaoxincom_--