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 lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 04B0EC28B2E for ; Mon, 10 Mar 2025 12:40:12 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trcPT-0002Uz-99; Mon, 10 Mar 2025 08:39:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1trcPP-0002UJ-Ro for qemu-devel@nongnu.org; Mon, 10 Mar 2025 08:39:04 -0400 Received: from mta-03.yadro.com ([89.207.88.253]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1trcPI-0007pW-QI for qemu-devel@nongnu.org; Mon, 10 Mar 2025 08:39:03 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 mta-03.yadro.com 7086AE0002 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yadro.com; s=mta-04; t=1741610328; bh=q8HoPrm08t8olunxkGhqNUQHIi2w7X2QvDIlMR6vHds=; h=From:To:Subject:Date:Message-ID:Content-Type:MIME-Version:From; b=PQsvuKwmtLLAzWwoONudJosLHkHWO9M5ywPGhQjs0lenPSoxgZembpgW4iFrAfZLg SaCJNBgaxZClD0M4WonNjJhvj2HNQnZ1CcBNwvLrDmkft3d9ybrtRyNa2Ob0oFEo4o RKB11Oc04ND3Vqd/ZlrdW8x7FXC3esnVPVLxP5iYDRs7A40pK69/6IesCToe9M0oC8 PdhYjdU4R6BYKCCH65RJ2t5X4MQskjlpOaRAm8adwDXYwaluM/DJSkLJgU3XpTuPdP EZ8pOgsjSb5LDvGVnj9EMTSR7sIbfAfBIMbjage+vpGvCVSVEJPCrlLoupdy8Z3XPy +qZUL2UM2K3Zw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yadro.com; s=mta-03; t=1741610328; bh=q8HoPrm08t8olunxkGhqNUQHIi2w7X2QvDIlMR6vHds=; h=From:To:Subject:Date:Message-ID:Content-Type:MIME-Version:From; b=UiJEV8wZwuSIpw/0eSMmqFcIqiBHyQ9946qNtsr2F4ts6KtepVEHK06L1+18Cfo9N WzivsKg0P9YUNDHIJ/XqsZei/VsM5YLd8djokkkNVk4G3+BPjk2y2pyGd9ZGoAz0DV P5ptUW9GSCzZS49DpEgSBqYO2DWB8I068KNK31wd24BVelsWgtd8iKrR8uMmp+mocj iZrxnBhjA1vIVAkVtDyariilqU5biaQsWSZNmPuvXeLnvAx//DjOkX9/YASPHM1H7l GvNxUloI4LKms1p99pIoQHxTfk3Kwa8j1LFPt+JRvrBi85lYdpx+kwr4EdJ7cZHeCv AUCbZobE0kIzg== From: Ilya Chichkov To: =?gb2312?B?UGhpbGlwcGUgTWF0aGlldS1EYXVkqKY=?= , Bernhard Beschow CC: "qemu-devel@nongnu.org" Subject: Re: [PATCH v2] hw/rtc: Add RTC PCF8563 module Thread-Topic: [PATCH v2] hw/rtc: Add RTC PCF8563 module Thread-Index: AQHbkbC0w+VruqzlzEepV7B5i0U4rbNsRvPY Date: Mon, 10 Mar 2025 12:38:45 +0000 Message-ID: <342e4188176e4ce18ada13cbaf3c7e86@yadro.com> References: <20250310113635.349822-1-i.chichkov@yadro.com> In-Reply-To: <20250310113635.349822-1-i.chichkov@yadro.com> Accept-Language: ru-RU, en-US Content-Language: ru-RU X-MS-Has-Attach: X-MS-TNEF-Correlator: Content-Type: multipart/alternative; boundary="_000_342e4188176e4ce18ada13cbaf3c7e86yadrocom_" MIME-Version: 1.0 Received-SPF: pass client-ip=89.207.88.253; envelope-from=i.chichkov@yadro.com; helo=mta-03.yadro.com X-Spam_score_int: 4 X-Spam_score: 0.4 X-Spam_bar: / X-Spam_report: (0.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, MIME_CHARSET_FARAWAY=2.45, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org --_000_342e4188176e4ce18ada13cbaf3c7e86yadrocom_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 DQpIaSBQaGlsIGFuZCBCZXJuaGFyZCwNCg0KSSB3b3VsZCBsaWtlIHRvIGFwb2xvZ2l6ZSBmb3Ig bm90IGluY2x1ZGluZyB5b3UgaW4gdGhlIGluaXRpYWwgZW1haWwgcmVnYXJkaW5nIHRoZSBSVEMg UENGODU2MyBwYXRjaC4gVGhpcyB3YXMgYW4gb3ZlcnNpZ2h0IG9uIG15IHBhcnQsIGFuZCBJIHJl Z3JldCBhbnkgaW5jb252ZW5pZW5jZSB0aGlzIG1heSBoYXZlIGNhdXNlZC4NCg0KX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18NCqewp+Q6IElseWEgQ2hpY2hrb3YNCqewp+Sn4afip9Gn 06fdp9an36fgOiAxMCCn3qfRp+Kn5KfRIDIwMjUgp9QuIDE0OjM2OjM0DQqnrKfgp96n5TogUGFv bG8gQm9uemluaTsgUGV0ZXIgTWF5ZGVsbA0Kp6yn4Kfhp9qn8TogcWVtdS1kZXZlbEBub25nbnUu b3JnOyBuaWtpdGEuc2h1YmluQG1hcXVlZmVsLm1lOyBJbHlhIENoaWNoa292DQqntKfWp96n0Tog W1BBVENIIHYyXSBody9ydGM6IEFkZCBSVEMgUENGODU2MyBtb2R1bGUNCg0KQWRkIFBDRjg1NjMg YSByZWFsLXRpbWUgY2xvY2sgd2l0aCBjYWxlbmRhciBhbmQgSTJDIGludGVyZmFjZS4NClRoaXMg Y29tbWl0IGFkZHMgc3VwcG9ydCBmb3IgaW50ZXJmYWNpbmcgd2l0aCBpdCBhbmQgaW1wbGVtZW50 cw0KZnVuY3Rpb25hbGl0eSBvZiBzZXR0aW5nIHRpbWVyLCBhbGFybSwgcmVhZGluZyBhbmQgd3Jp dGluZyB0aW1lLg0KDQpTaWduZWQtb2ZmLWJ5OiBJbHlhIENoaWNoa292IDxpLmNoaWNoa292QHlh ZHJvLmNvbT4NCi0tLQ0KdjEtPnYyDQpQaGlsOg0KLSBBZGQgaG90IHJlc2V0DQotIEZpeCB0cmFj ZSBtZXNzYWdlDQotIEFkZCB0ZXN0aW5nIGNvdmVyYWdlIHdpdGggcXRlc3QNCg0KQmVybmhhcmQ6 DQotIE1vdmUgZGF0YXNoZWV0IGxpbmsgdG8gc291cmNlIGNvZGUgdG9wIGNvbW1lbnQgc2VjdGlv bg0KLSBGaXggdHlwb3MNCi0gVXBkYXRlIGxpY2VuY2UgaWRlbnRpZmllciB0byBTUERYDQotIFJl bW92ZSB1bnVzZWQgaW1wb3J0IGxpYnJhcmllcw0KLSBDaGFuZ2UgT0JKRUNUX0NIRUNLIHRvIE9C SkVDVF9ERUNMQVJFX1NJTVBMRV9UWVBFDQotIFJlbW92ZSBvdXRkYXRlZCBjb21tZW50DQotIFJl bmFtZSBpMmMgdG8gcGFyZW50X29iag0KLSBNb3ZlZCBnZXRfdGltZSBpbnNpZGUgY2FwdHVyZV90 aW1lIGZ1bmN0aW9uIHRoYXQgaXMNCiAgY2FsbGVkIG9ubHkgd2hlbiBJMkMgcmVxdWVzdCBzdGFy dHMNCi0gQWRkIGZpZWxkcyBpbnNpZGUgVk1TdGF0ZURlc2NyaXB0aW9uDQotIFJlbW92ZWQgcGNm ODU2M19yZWFsaXplDQotIENoYW5nZSB0eXBlX2luaXQgdG8gREVGSU5FX1RZUEVTDQotLS0NCiBo dy9ydGMvS2NvbmZpZyAgICAgICB8ICAgNSArDQogaHcvcnRjL21lc29uLmJ1aWxkICAgfCAgIDEg Kw0KIGh3L3J0Yy9wY2Y4NTYzX3J0Yy5jIHwgNzQwICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysNCiBody9ydGMvdHJhY2UtZXZlbnRzICB8ICAxMiArDQogNCBmaWxl cyBjaGFuZ2VkLCA3NTggaW5zZXJ0aW9ucygrKQ0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBody9ydGMv cGNmODU2M19ydGMuYw0KDQpkaWZmIC0tZ2l0IGEvaHcvcnRjL0tjb25maWcgYi9ody9ydGMvS2Nv bmZpZw0KaW5kZXggYjkwYzJlNTEwYS4uNGU3YTFmNzVlZiAxMDA2NDQNCi0tLSBhL2h3L3J0Yy9L Y29uZmlnDQorKysgYi9ody9ydGMvS2NvbmZpZw0KQEAgLTI3LDUgKzI3LDEwIEBAIGNvbmZpZyBH T0xERklTSF9SVEMNCiBjb25maWcgTFM3QV9SVEMNCiAgICAgYm9vbA0KDQorY29uZmlnIFBDRjg1 NjNfUlRDDQorICAgIGJvb2wNCisgICAgZGVwZW5kcyBvbiBJMkMNCisgICAgZGVmYXVsdCB5IGlm IEkyQ19ERVZJQ0VTDQorDQogY29uZmlnIFNUTTMyX1JUQw0KICAgICBib29sDQpcIE5vIG5ld2xp bmUgYXQgZW5kIG9mIGZpbGUNCmRpZmYgLS1naXQgYS9ody9ydGMvbWVzb24uYnVpbGQgYi9ody9y dGMvbWVzb24uYnVpbGQNCmluZGV4IGI2YmI3NDM2YzcuLjYxODBmZmM2ZDkgMTAwNjQ0DQotLS0g YS9ody9ydGMvbWVzb24uYnVpbGQNCisrKyBiL2h3L3J0Yy9tZXNvbi5idWlsZA0KQEAgLTEzLDQg KzEzLDUgQEAgc3lzdGVtX3NzLmFkZCh3aGVuOiAnQ09ORklHX0dPTERGSVNIX1JUQycsIGlmX3Ry dWU6IGZpbGVzKCdnb2xkZmlzaF9ydGMuYycpKQ0KIHN5c3RlbV9zcy5hZGQod2hlbjogJ0NPTkZJ R19MUzdBX1JUQycsIGlmX3RydWU6IGZpbGVzKCdsczdhX3J0Yy5jJykpDQogc3lzdGVtX3NzLmFk ZCh3aGVuOiAnQ09ORklHX0FMTFdJTk5FUl9IMycsIGlmX3RydWU6IGZpbGVzKCdhbGx3aW5uZXIt cnRjLmMnKSkNCiBzeXN0ZW1fc3MuYWRkKHdoZW46ICdDT05GSUdfTUMxNDY4MThSVEMnLCBpZl90 cnVlOiBmaWxlcygnbWMxNDY4MThydGMuYycpKQ0KK3N5c3RlbV9zcy5hZGQod2hlbjogJ0NPTkZJ R19QQ0Y4NTYzX1JUQycsIGlmX3RydWU6IGZpbGVzKCdwY2Y4NTYzX3J0Yy5jJykpDQogc3lzdGVt X3NzLmFkZCh3aGVuOiAnQ09ORklHX1NUTTMyX1JUQycsIGlmX3RydWU6IGZpbGVzKCdzdG0zMi1y dGMuYycpKQ0KZGlmZiAtLWdpdCBhL2h3L3J0Yy9wY2Y4NTYzX3J0Yy5jIGIvaHcvcnRjL3BjZjg1 NjNfcnRjLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwLi4xOTViNjk3 NTk4DQotLS0gL2Rldi9udWxsDQorKysgYi9ody9ydGMvcGNmODU2M19ydGMuYw0KQEAgLTAsMCAr MSw3NDAgQEANCisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcg0K Ky8qDQorICogUmVhbC10aW1lIGNsb2NrL2NhbGVuZGFyIFBDRjg1NjMgd2l0aCBJMkMgaW50ZXJm YWNlLg0KKyAqDQorICogRGF0YXNoZWV0OiBodHRwczovL3d3dy5ueHAuY29tL2RvY3MvZW4vZGF0 YS1zaGVldC9QQ0Y4NTYzLnBkZg0KKyAqDQorICogQXV0aG9yIChjKSAyMDI0IElseWEgQ2hpY2hr b3YgPGkuY2hpY2hrb3ZAeWFkcm8uY29tPg0KKyAqLw0KKw0KKyNpbmNsdWRlICJxZW11L29zZGVw LmgiDQorI2luY2x1ZGUgImh3L3N5c2J1cy5oIg0KKyNpbmNsdWRlICJody9yZWdpc3Rlci5oIg0K KyNpbmNsdWRlICJody9yZWdpc3RlcmZpZWxkcy5oIg0KKyNpbmNsdWRlICJody9pcnEuaCINCisj aW5jbHVkZSAicWVtdS9iaXRvcHMuaCINCisjaW5jbHVkZSAiaHcvcWRldi1wcm9wZXJ0aWVzLmgi DQorI2luY2x1ZGUgInFlbXUvdGltZXIuaCINCisjaW5jbHVkZSAiaHcvaTJjL2kyYy5oIg0KKyNp bmNsdWRlICJxZW11L2JjZC5oIg0KKyNpbmNsdWRlICJxb20vb2JqZWN0LmgiDQorI2luY2x1ZGUg InN5c2VtdS9zeXNlbXUuaCINCisjaW5jbHVkZSAic3lzZW11L3J0Yy5oIg0KKyNpbmNsdWRlICJt aWdyYXRpb24vdm1zdGF0ZS5oIg0KKyNpbmNsdWRlICJxYXBpL3Zpc2l0b3IuaCINCisNCisjaW5j bHVkZSAidHJhY2UuaCINCisNCisjZGVmaW5lIFRZUEVfUENGODU2MyAicGNmODU2MyINCitPQkpF Q1RfREVDTEFSRV9TSU1QTEVfVFlQRShQY2Y4NTYzU3RhdGUsIFBDRjg1NjMpDQorDQorI2RlZmlu ZSAgUENGODU2M19DUzEgICAgICAgICAgICAweDAwDQorI2RlZmluZSAgUENGODU2M19DUzIgICAg ICAgICAgICAweDAxDQorI2RlZmluZSAgUENGODU2M19WTFMgICAgICAgICAgICAweDAyDQorI2Rl ZmluZSAgUENGODU2M19NSU5VVEVTICAgICAgICAweDAzDQorI2RlZmluZSAgUENGODU2M19IT1VS UyAgICAgICAgICAweDA0DQorI2RlZmluZSAgUENGODU2M19EQVlTICAgICAgICAgICAweDA1DQor I2RlZmluZSAgUENGODU2M19XRUVLREFZUyAgICAgICAweDA2DQorI2RlZmluZSAgUENGODU2M19D RU5UVVJZX01PTlRIUyAweDA3DQorI2RlZmluZSAgUENGODU2M19ZRUFSUyAgICAgICAgICAweDA4 DQorI2RlZmluZSAgUENGODU2M19NSU5VVEVfQSAgICAgICAweDA5DQorI2RlZmluZSAgUENGODU2 M19IT1VSX0EgICAgICAgICAweDBBDQorI2RlZmluZSAgUENGODU2M19EQVlfQSAgICAgICAgICAw eDBCDQorI2RlZmluZSAgUENGODU2M19XRUVLREFZX0EgICAgICAweDBDDQorI2RlZmluZSAgUENG ODU2M19DTEtPVVRfQ1RMICAgICAweDBEDQorI2RlZmluZSAgUENGODU2M19USU1FUl9DVEwgICAg ICAweDBFDQorI2RlZmluZSAgUENGODU2M19USU1FUiAgICAgICAgICAweDBGDQorDQorI2RlZmlu ZSBNSU5VVEVTX0lOX0hPVVIgNjANCisjZGVmaW5lIEhPVVJTX0lOX0RBWSAyNA0KKyNkZWZpbmUg REFZU19JTl9NT05USCAzMQ0KKyNkZWZpbmUgREFZU19JTl9XRUVLIDcNCisNCitSRUc4KFBDRjg1 NjNfQ1MxLCAweDAwKQ0KKyAgICBGSUVMRChQQ0Y4NTYzX0NTMSwgUlNWRDAsICAwLCAgMykNCisg ICAgRklFTEQoUENGODU2M19DUzEsIFRFU1RDLCAgMywgIDEpDQorICAgIEZJRUxEKFBDRjg1NjNf Q1MxLCBSU1ZEMSwgIDQsICAxKQ0KKyAgICBGSUVMRChQQ0Y4NTYzX0NTMSwgU1RPUCwgICA1LCAg MSkNCisgICAgRklFTEQoUENGODU2M19DUzEsIFJTVkQyLCAgNiwgIDEpDQorICAgIEZJRUxEKFBD Rjg1NjNfQ1MxLCBURVNUMSwgIDcsICAxKQ0KKw0KK1JFRzgoUENGODU2M19DUzIsIDB4MDEpDQor ICAgIEZJRUxEKFBDRjg1NjNfQ1MyLCBUSUUsICAgMCwgIDEpDQorICAgIEZJRUxEKFBDRjg1NjNf Q1MyLCBBSUUsICAgMSwgIDEpDQorICAgIEZJRUxEKFBDRjg1NjNfQ1MyLCBURiwgICAgMiwgIDEp DQorICAgIEZJRUxEKFBDRjg1NjNfQ1MyLCBBRiwgICAgMywgIDEpDQorICAgIEZJRUxEKFBDRjg1 NjNfQ1MyLCBUSV9UUCwgNCwgIDEpDQorICAgIEZJRUxEKFBDRjg1NjNfQ1MyLCBSU1ZELCAgNSwg IDMpDQorDQorUkVHOChQQ0Y4NTYzX1ZMUywgMHgwMikNCisgICAgRklFTEQoUENGODU2M19WTFMs IFNFQ09ORFMsICAwLCAgNykNCisgICAgRklFTEQoUENGODU2M19WTFMsIFZMLCAgICAgICA3LCAg MSkNCisNCitSRUc4KFBDRjg1NjNfTUlOVVRFUywgMHgwMykNCisgICAgRklFTEQoUENGODU2M19N SU5VVEVTLCBNSU5VVEVTLCAwLCAgNykNCisgICAgRklFTEQoUENGODU2M19NSU5VVEVTLCBSU1ZE LCAgICA3LCAgMSkNCisNCitSRUc4KFBDRjg1NjNfSE9VUlMsIDB4MDQpDQorICAgIEZJRUxEKFBD Rjg1NjNfSE9VUlMsIEhPVVJTLCAwLCAgNikNCisgICAgRklFTEQoUENGODU2M19IT1VSUywgUlNW RCwgIDYsICAyKQ0KKw0KK1JFRzgoUENGODU2M19EQVlTLCAweDA1KQ0KKyAgICBGSUVMRChQQ0Y4 NTYzX0RBWVMsIERBWVMsIDAsICA2KQ0KKyAgICBGSUVMRChQQ0Y4NTYzX0RBWVMsIFJTVkQsIDYs ICAyKQ0KKw0KK1JFRzgoUENGODU2M19XRUVLREFZUywgMHgwNikNCisgICAgRklFTEQoUENGODU2 M19XRUVLREFZUywgV0VFS0RBWVMsIDAsICAzKQ0KKyAgICBGSUVMRChQQ0Y4NTYzX1dFRUtEQVlT LCBSU1ZELCAgICAgMywgIDUpDQorDQorUkVHOChQQ0Y4NTYzX0NFTlRVUllfTU9OVEhTLCAweDA3 KQ0KKyAgICBGSUVMRChQQ0Y4NTYzX0NFTlRVUllfTU9OVEhTLCBNT05USFMsICAwLCAgNSkNCisg ICAgRklFTEQoUENGODU2M19DRU5UVVJZX01PTlRIUywgUlNWRCwgICAgNSwgIDIpDQorICAgIEZJ RUxEKFBDRjg1NjNfQ0VOVFVSWV9NT05USFMsIENFTlRVUlksIDcsICAxKQ0KKw0KK1JFRzgoUENG ODU2M19ZRUFSUywgMHgwOCkNCisgICAgRklFTEQoUENGODU2M19ZRUFSUywgWUVBUlMsIDAsICA4 KQ0KKw0KK1JFRzgoUENGODU2M19NSU5VVEVfQSwgMHgwOSkNCisgICAgRklFTEQoUENGODU2M19N SU5VVEVfQSwgTUlOVVRFX0EsIDAsICA3KQ0KKyAgICBGSUVMRChQQ0Y4NTYzX01JTlVURV9BLCBB RV9NLCAgICAgNywgIDEpDQorDQorUkVHOChQQ0Y4NTYzX0hPVVJfQSwgMHgwQSkNCisgICAgRklF TEQoUENGODU2M19IT1VSX0EsIEhPVVJfQSwgMCwgIDcpDQorICAgIEZJRUxEKFBDRjg1NjNfSE9V Ul9BLCBBRV9ILCAgIDcsICAxKQ0KKw0KK1JFRzgoUENGODU2M19EQVlfQSwgMHgwQikNCisgICAg RklFTEQoUENGODU2M19EQVlfQSwgREFZX0EsICAwLCAgNykNCisgICAgRklFTEQoUENGODU2M19E QVlfQSwgQUVfRCwgICA3LCAgMSkNCisNCitSRUc4KFBDRjg1NjNfV0VFS0RBWV9BLCAweDBDKQ0K KyAgICBGSUVMRChQQ0Y4NTYzX1dFRUtEQVlfQSwgV0VFS0RBWV9BLCAwLCAgMykNCisgICAgRklF TEQoUENGODU2M19XRUVLREFZX0EsIFJTVkQsICAgICAgMywgIDQpDQorICAgIEZJRUxEKFBDRjg1 NjNfV0VFS0RBWV9BLCBBRV9XLCAgICAgIDcsICAxKQ0KKw0KK1JFRzgoUENGODU2M19DTEtPVVRf Q1RMLCAweDBEKQ0KKyAgICBGSUVMRChQQ0Y4NTYzX0NMS09VVF9DVEwsIEZELCAgIDAsICAyKQ0K KyAgICBGSUVMRChQQ0Y4NTYzX0NMS09VVF9DVEwsIFJTVkQsIDIsICA1KQ0KKyAgICBGSUVMRChQ Q0Y4NTYzX0NMS09VVF9DVEwsIEZFLCAgIDcsICAxKQ0KKw0KK1JFRzgoUENGODU2M19USU1FUl9D VEwsIDB4MEUpDQorICAgIEZJRUxEKFBDRjg1NjNfVElNRVJfQ1RMLCBURCwgICAwLCAgMikNCisg ICAgRklFTEQoUENGODU2M19USU1FUl9DVEwsIFJTVkQsIDIsICA1KQ0KKyAgICBGSUVMRChQQ0Y4 NTYzX1RJTUVSX0NUTCwgVEUsICAgNywgIDEpDQorDQorUkVHOChQQ0Y4NTYzX1RJTUVSLCAweDBG KQ0KKyAgICBGSUVMRChQQ0Y4NTYzX1RJTUVSLCBUSU1FUiwgMCwgIDgpDQorDQordHlwZWRlZiBz dHJ1Y3QgUGNmODU2M1N0YXRlIHsNCisgICAgSTJDU2xhdmUgcGFyZW50X29iajsNCisNCisgICAg c3RydWN0IHRtIGN1cnJlbnRfdGltZTsNCisgICAgcWVtdV9pcnEgaXJxOw0KKw0KKyAgICB1aW50 OF90IHJlYWRfaW5kZXg7DQorICAgIHVpbnQ4X3Qgd3JpdGVfaW5kZXg7DQorICAgIHVpbnQ4X3Qg cmVnX2FkZHI7DQorDQorICAgIC8qIENvbnRyb2wgYW5kIHN0YXR1cyAqLw0KKyAgICB1aW50OF90 IGNzMTsNCisgICAgdWludDhfdCBjczI7DQorICAgIC8qIENvdW50ZXJzICovDQorICAgIHVpbnQ4 X3QgdmxzOw0KKyAgICB1aW50OF90IG1pbnV0ZXM7DQorICAgIHVpbnQ4X3QgaG91cnM7DQorICAg IHVpbnQ4X3QgZGF5czsNCisgICAgdWludDhfdCB3ZWVrZGF5czsNCisgICAgdWludDhfdCBjZW50 dXJlX21vbnRoczsNCisgICAgdWludDhfdCB5ZWFyczsNCisgICAgLyogQWxhcm0gcmVnaXN0ZXJz ICovDQorICAgIHVpbnQ4X3QgbWludXRlX2E7DQorICAgIHVpbnQ4X3QgaG91cl9hOw0KKyAgICB1 aW50OF90IGRheV9hOw0KKyAgICB1aW50OF90IHdlZWtkYXlfYTsNCisgICAgLyogVGltZXIgY29u dHJvbCAqLw0KKyAgICB1aW50OF90IGNsa291dF9jdGw7DQorICAgIHVpbnQ4X3QgdGltZXJfY3Rs Ow0KKyAgICB1aW50OF90IHRpbWVyX2NudDsNCisNCisgICAgUUVNVVRpbWVyICphbGFybV90aW1l cjsNCisgICAgc3RydWN0IHRtIHRtX2FsYXJtOw0KKyAgICBib29sIGFsYXJtX2lycTsNCisgICAg UUVNVVRpbWVyICp0aW1lcjsNCisgICAgdGltZV90IHRpbWVfb2Zmc2V0Ow0KKyAgICB0aW1lX3Qg c3RvcF90aW1lOw0KKyAgICBRRU1VVGltZXIgKmlycV9nZW5fdGltZXI7DQorfSBQY2Y4NTYzU3Rh dGU7DQorDQorc3RhdGljIHVpbnQxNl90IGdldF9zcmNfZnJlcShQY2Y4NTYzU3RhdGUgKnMsIGJv b2wgKm11bHRpcGx5KQ0KK3sNCisgICAgKm11bHRpcGx5ID0gZmFsc2U7DQorICAgIC8qIFNlbGVj dCBzb3VyY2UgY2xvY2sgZnJlcXVlbmN5IChIeikgKi8NCisgICAgc3dpdGNoIChGSUVMRF9FWDgo cy0+dGltZXJfY3RsLCBQQ0Y4NTYzX1RJTUVSX0NUTCwgVEQpKSB7DQorICAgIGNhc2UgMDoNCisg ICAgICAgIHJldHVybiA0MDk2Ow0KKyAgICBjYXNlIDE6DQorICAgICAgICByZXR1cm4gNjQ7DQor ICAgIGNhc2UgMjoNCisgICAgICAgIHJldHVybiAxOw0KKyAgICBjYXNlIDM6DQorICAgICAgICAq bXVsdGlwbHkgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIDYwOw0KKyAgICBkZWZhdWx0Og0KKyAg ICAgICAgcmV0dXJuIDA7DQorICAgIH0NCit9DQorDQorc3RhdGljIHVpbnQxNl90IGdldF9pcnFf cHVsc2VfZnJlcShQY2Y4NTYzU3RhdGUgKnMpDQorew0KKyAgICBpZiAocy0+dGltZXJfY250ID4g MSkgew0KKyAgICAgICAgc3dpdGNoIChGSUVMRF9FWDgocy0+dGltZXJfY3RsLCBQQ0Y4NTYzX1RJ TUVSX0NUTCwgVEQpKSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgcmV0dXJuIDgx OTI7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgcmV0dXJuIDEyODsNCisgICAgICAg IGNhc2UgMjoNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgICByZXR1cm4gNjQ7DQorICAg ICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICB9 IGVsc2Ugew0KKyAgICAgICAgaWYgKEZJRUxEX0VYOChzLT50aW1lcl9jdGwsIFBDRjg1NjNfVElN RVJfQ1RMLCBURCkgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiA0MDk2Ow0KKyAgICAgICAg fQ0KKyAgICAgICAgcmV0dXJuIDY0Ow0KKyAgICB9DQorDQorfQ0KKw0KK3N0YXRpYyB2b2lkIHRp bWVyX2lycShQY2Y4NTYzU3RhdGUgKnMpDQorew0KKyAgICBpZiAoIUZJRUxEX0VYOChzLT5jczIs IFBDRjg1NjNfQ1MyLCBUSUUpKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAg aWYgKEZJRUxEX0VYOChzLT5jczIsIFBDRjg1NjNfQ1MyLCBUSV9UUCkpIHsNCisgICAgICAgIHFl bXVfaXJxX3B1bHNlKHMtPmlycSk7DQorDQorICAgICAgICAvKiBTdGFydCBJUlEgcHVsc2UgZ2Vu ZXJhdG9yICovDQorICAgICAgICB1aW50NjRfdCBkZWxheSA9IHMtPnRpbWVyX2NudCAqDQorICAg ICAgICAgICAgICAgICAgICAgICAgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAqDQorICAgICAgICAg ICAgICAgICAgICAgICAgZ2V0X2lycV9wdWxzZV9mcmVxKHMpOw0KKyAgICAgICAgdGltZXJfbW9k KHMtPmlycV9nZW5fdGltZXIsDQorICAgICAgICAgICAgICAgICAgICBxZW11X2Nsb2NrX2dldF9u cyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgZGVsYXkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAg cWVtdV9pcnFfcmFpc2Uocy0+aXJxKTsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBhbGFy bV9pcnEoUGNmODU2M1N0YXRlICpzKQ0KK3sNCisgICAgaWYgKEZJRUxEX0VYOChzLT5jczIsIFBD Rjg1NjNfQ1MyLCBBSUUpKSB7DQorICAgICAgICBxZW11X2lycV9yYWlzZShzLT5pcnEpOw0KKyAg ICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHNldF9hbGFybShQY2Y4NTYzU3RhdGUgKnMpDQorew0K KyAgICB1aW50NjRfdCBkaWZmX3NlYyA9IDA7DQorICAgIHVpbnQ2NF90IGRpZmZfbWluID0gMDsN CisgICAgdWludDY0X3QgZGlmZl9ob3VyID0gMDsNCisgICAgdWludDY0X3QgZGlmZl9kYXkgPSAw Ow0KKyAgICB1aW50NjRfdCBkaWZmX3dkYXkgPSAwOw0KKyAgICB1aW50NjRfdCBkZWxheSA9IDA7 DQorICAgIHVpbnQ2NF90IG5vd19jbCA9IDA7DQorICAgIHN0cnVjdCB0bSBub3c7DQorDQorICAg IGJvb2wgaXNfbWluX2VuID0gIUZJRUxEX0VYOChzLT5taW51dGVfYSwgUENGODU2M19NSU5VVEVf QSwgQUVfTSk7DQorICAgIGJvb2wgaXNfaG91cl9lbiA9ICFGSUVMRF9FWDgocy0+aG91cl9hLCBQ Q0Y4NTYzX0hPVVJfQSwgQUVfSCk7DQorICAgIGJvb2wgaXNfZGF5X2VuID0gIUZJRUxEX0VYOChz LT5kYXlfYSwgUENGODU2M19EQVlfQSwgQUVfRCk7DQorICAgIGJvb2wgaXNfd2RheV9lbiA9ICFG SUVMRF9FWDgocy0+d2Vla2RheV9hLCBQQ0Y4NTYzX1dFRUtEQVlfQSwgQUVfVyk7DQorICAgIGlm ICghaXNfZGF5X2VuICYmICFpc193ZGF5X2VuICYmICFpc19ob3VyX2VuICYmICFpc19taW5fZW4p IHsNCisgICAgICAgIGlmIChzLT5hbGFybV90aW1lcikgew0KKyAgICAgICAgICAgIHRpbWVyX2Rl bChzLT5hbGFybV90aW1lcik7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgIH0N CisNCisgICAgcWVtdV9nZXRfdGltZWRhdGUoJm5vdywgcy0+dGltZV9vZmZzZXQpOw0KKw0KKyAg ICBpZiAoaXNfbWluX2VuKSB7DQorICAgICAgICBpZiAocy0+dG1fYWxhcm0udG1fbWluID4gcy0+ Y3VycmVudF90aW1lLnRtX21pbikgew0KKyAgICAgICAgICAgIGRpZmZfbWluID0gcy0+dG1fYWxh cm0udG1fbWluIC0gcy0+Y3VycmVudF90aW1lLnRtX21pbjsNCisgICAgICAgIH0gZWxzZSB7DQor ICAgICAgICAgICAgZGlmZl9taW4gPSAoTUlOVVRFU19JTl9IT1VSIC0NCisgICAgICAgICAgICAg ICAgICAgICAgICBzLT5jdXJyZW50X3RpbWUudG1fbWluICsgcy0+dG1fYWxhcm0udG1fbWluKTsN CisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAoaXNfaG91cl9lbikgew0KKyAgICAgICAg aWYgKHMtPnRtX2FsYXJtLnRtX2hvdXIgPiBzLT5jdXJyZW50X3RpbWUudG1faG91cikgew0KKyAg ICAgICAgICAgIGRpZmZfaG91ciA9IHMtPnRtX2FsYXJtLnRtX2hvdXIgLSBzLT5jdXJyZW50X3Rp bWUudG1faG91cjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZGlmZl9ob3VyID0g KEhPVVJTX0lOX0RBWSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfdGlt ZS50bV9ob3VyICsgcy0+dG1fYWxhcm0udG1faG91cik7DQorICAgICAgICB9DQorICAgIH0NCisN CisgICAgaWYgKGlzX2RheV9lbikgew0KKyAgICAgICAgaWYgKHMtPnRtX2FsYXJtLnRtX21kYXkg PiBzLT5jdXJyZW50X3RpbWUudG1fbWRheSkgew0KKyAgICAgICAgICAgIGRpZmZfZGF5ID0gcy0+ dG1fYWxhcm0udG1fbWRheSAtIHMtPmN1cnJlbnRfdGltZS50bV9tZGF5Ow0KKyAgICAgICAgfSBl bHNlIHsNCisgICAgICAgICAgICBkaWZmX2RheSA9IChEQVlTX0lOX01PTlRIIC0NCisgICAgICAg ICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3RpbWUudG1fbWRheSArIHMtPnRtX2FsYXJtLnRt X21kYXkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmIChpc193ZGF5X2VuKSB7DQor ICAgICAgICBpZiAocy0+dG1fYWxhcm0udG1fd2RheSA+IHMtPmN1cnJlbnRfdGltZS50bV93ZGF5 KSB7DQorICAgICAgICAgICAgZGlmZl93ZGF5ID0gcy0+dG1fYWxhcm0udG1fd2RheSAtIHMtPmN1 cnJlbnRfdGltZS50bV93ZGF5Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkaWZm X3dkYXkgPSAoREFZU19JTl9XRUVLIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3Vy cmVudF90aW1lLnRtX3dkYXkgKyBzLT50bV9hbGFybS50bV93ZGF5KTsNCisgICAgICAgIH0NCisg ICAgfQ0KKw0KKyAgICBkaWZmX3NlYyA9IChkaWZmX21pbiAqIDYwKSArDQorICAgICAgICAgICAg ICAgKGRpZmZfaG91ciAqIDYwICogNjApICsNCisgICAgICAgICAgICAgICAoZGlmZl9kYXkgKiAy NCAqIDYwICogNjApICsNCisgICAgICAgICAgICAgICAoZGlmZl93ZGF5ICogMjQgKiA2MCAqIDYw KTsNCisgICAgbm93X2NsID0gbXVsZGl2NjQocWVtdV9jbG9ja19nZXRfbnMocnRjX2Nsb2NrKSwg MSwgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCk7DQorICAgIGRlbGF5ID0gbXVsZGl2NjQoKG5vd19j bCArIGRpZmZfc2VjKSwgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCwgMSk7DQorDQorICAgIGlmIChz LT5hbGFybV90aW1lcikgew0KKyAgICAgICAgdGltZXJfZGVsKHMtPmFsYXJtX3RpbWVyKTsNCisg ICAgfQ0KKyAgICB0aW1lcl9tb2Qocy0+YWxhcm1fdGltZXIsIGRlbGF5KTsNCit9DQorDQorc3Rh dGljIHZvaWQgcGNmODU2M191cGRhdGVfaXJxKFBjZjg1NjNTdGF0ZSAqcykNCit7DQorICAgIGlm IChGSUVMRF9FWDgocy0+Y3MyLCBQQ0Y4NTYzX0NTMiwgVEYpKSB7DQorICAgICAgICB0aW1lcl9p cnEocyk7DQorICAgIH0NCisNCisgICAgaWYgKEZJRUxEX0VYOChzLT5jczIsIFBDRjg1NjNfQ1My LCBBRikpIHsNCisgICAgICAgIGFsYXJtX2lycShzKTsNCisgICAgfQ0KK30NCisNCitzdGF0aWMg dm9pZCBhbGFybV90aW1lcl9jYih2b2lkICpvcGFxdWUpDQorew0KKyAgICBQY2Y4NTYzU3RhdGUg KnMgPSBQQ0Y4NTYzKG9wYXF1ZSk7DQorDQorICAgIHNldF9hbGFybShzKTsNCisgICAgcy0+Y3My ID0gRklFTERfRFA4KHMtPmNzMiwgUENGODU2M19DUzIsIEFGLCAxKTsNCisgICAgcGNmODU2M191 cGRhdGVfaXJxKHMpOw0KK30NCisNCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpvcGFxdWUp DQorew0KKyAgICBQY2Y4NTYzU3RhdGUgKnMgPSBQQ0Y4NTYzKG9wYXF1ZSk7DQorDQorICAgIHMt PnRpbWVyX2NudCA9IDA7DQorICAgIHMtPmNzMiA9IEZJRUxEX0RQOChzLT5jczIsIFBDRjg1NjNf Q1MyLCBURiwgMSk7DQorICAgIHBjZjg1NjNfdXBkYXRlX2lycShzKTsNCit9DQorDQorc3RhdGlj IHZvaWQgaXJxX2dlbl90aW1lcl9jYih2b2lkICpvcGFxdWUpDQorew0KKyAgICBQY2Y4NTYzU3Rh dGUgKnMgPSBQQ0Y4NTYzKG9wYXF1ZSk7DQorDQorICAgIHBjZjg1NjNfdXBkYXRlX2lycShzKTsN Cit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIGNhcHR1cmVfdGltZShQY2Y4NTYzU3RhdGUgKnMp DQorew0KKyAgICBxZW11X2dldF90aW1lZGF0ZSgmcy0+Y3VycmVudF90aW1lLCBzLT50aW1lX29m ZnNldCk7DQorICAgIHRyYWNlX3BjZjg1NjNfcnRjX2NhcHR1cmVfdGltZSgpOw0KK30NCisNCitz dGF0aWMgdm9pZCBzZXRfdGltZShQY2Y4NTYzU3RhdGUgKnMsIHN0cnVjdCB0bSAqdG0pDQorew0K KyAgICBzLT50aW1lX29mZnNldCA9IHFlbXVfdGltZWRhdGVfZGlmZih0bSk7DQorICAgIHNldF9h bGFybShzKTsNCisgICAgdHJhY2VfcGNmODU2M19ydGNfc2V0X3RpbWUoKTsNCit9DQorDQorc3Rh dGljIHZvaWQgcGNmODU2M19yZXNldChJMkNTbGF2ZSAqaTJjKQ0KK3sNCisgICAgUGNmODU2M1N0 YXRlICpzID0gUENGODU2MyhpMmMpOw0KKw0KKyAgICBzLT5yZWFkX2luZGV4ID0gMDsNCisgICAg cy0+d3JpdGVfaW5kZXggPSAwOw0KKyAgICBzLT5yZWdfYWRkciA9IDA7DQorDQorICAgIHMtPmNz MSA9IDB4ODsNCisgICAgcy0+Y3MyID0gMHgwOw0KKyAgICBzLT52bHMgPSAweDgwOw0KKyAgICBz LT5taW51dGVzID0gMHgwOw0KKyAgICBzLT5ob3VycyA9IDB4MDsNCisgICAgcy0+ZGF5cyA9IDB4 MDsNCisgICAgcy0+d2Vla2RheXMgPSAweDA7DQorICAgIHMtPmNlbnR1cmVfbW9udGhzID0gMHgw Ow0KKyAgICBzLT55ZWFycyA9IDB4MDsNCisgICAgcy0+bWludXRlX2EgPSAweDgwOw0KKyAgICBz LT5ob3VyX2EgPSAweDgwOw0KKyAgICBzLT5kYXlfYSA9IDB4ODA7DQorICAgIHMtPndlZWtkYXlf YSA9IDB4ODA7DQorICAgIHMtPmNsa291dF9jdGwgPSAweDgwOw0KKyAgICBzLT50aW1lcl9jdGwg PSAweDM7DQorICAgIHMtPnRpbWVyX2NudCA9IDB4MDsNCisNCisgICAgcy0+c3RvcF90aW1lID0g MDsNCisgICAgcy0+cmVnX2FkZHIgPSAwOw0KKw0KKyAgICBzLT5hbGFybV9pcnEgPSBmYWxzZTsN CisgICAgcy0+dGltZV9vZmZzZXQgPSAwOw0KKw0KKyAgICBxZW11X2lycV9sb3dlcihzLT5pcnEp Ow0KKyAgICBxZW11X2dldF90aW1lZGF0ZSgmcy0+dG1fYWxhcm0sIDApOw0KKw0KKyAgICB0aW1l cl9kZWwocy0+YWxhcm1fdGltZXIpOw0KKyAgICB0aW1lcl9kZWwocy0+dGltZXIpOw0KK30NCisN CitzdGF0aWMgdm9pZCBwY2Y4NTYzX3JlYWQoUGNmODU2M1N0YXRlICpzLCB1aW50OF90ICpyZXN1 bHQpDQorew0KKyAgICBzdHJ1Y3QgdG0gKnRtID0gJnMtPmN1cnJlbnRfdGltZTsNCisNCisgICAg Ym9vbCBtdWx0aXBseSA9IGZhbHNlOw0KKyAgICB1aW50MTZfdCBzcmNfZnJlcSA9IGdldF9zcmNf ZnJlcShzLCAmbXVsdGlwbHkpOw0KKw0KKyAgICBzd2l0Y2ggKHMtPnJlZ19hZGRyKSB7DQorICAg IGNhc2UgUENGODU2M19DUzE6DQorICAgICAgICAqcmVzdWx0ID0gcy0+Y3MxOw0KKyAgICAgICAg YnJlYWs7DQorICAgIGNhc2UgUENGODU2M19DUzI6DQorICAgICAgICAqcmVzdWx0ID0gcy0+Y3My Ow0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19WTFM6DQorICAgICAgICAqcmVz dWx0ID0gKHMtPnZscyAmIDB4ODApIHwgdG9fYmNkKHRtLT50bV9zZWMpOw0KKyAgICAgICAgYnJl YWs7DQorICAgIGNhc2UgUENGODU2M19NSU5VVEVTOg0KKyAgICAgICAgKnJlc3VsdCA9IHRvX2Jj ZCh0bS0+dG1fbWluKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1NjNfSE9VUlM6 DQorICAgICAgICAqcmVzdWx0ID0gdG9fYmNkKHRtLT50bV9ob3VyKTsNCisgICAgICAgIGJyZWFr Ow0KKyAgICBjYXNlIFBDRjg1NjNfREFZUzoNCisgICAgICAgICpyZXN1bHQgPSB0b19iY2QodG0t PnRtX21kYXkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19XRUVLREFZUzoN CisgICAgICAgICpyZXN1bHQgPSB0b19iY2QodG0tPnRtX3dkYXkpOw0KKyAgICAgICAgYnJlYWs7 DQorICAgIGNhc2UgUENGODU2M19DRU5UVVJZX01PTlRIUzoNCisgICAgICAgICpyZXN1bHQgPSB0 b19iY2QodG0tPnRtX21vbiArIDEpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2 M19ZRUFSUzoNCisgICAgICAgICpyZXN1bHQgPSB0b19iY2QoKHRtLT50bV95ZWFyICsgMTkwMCkg JSAxMDApOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19NSU5VVEVfQToNCisg ICAgICAgICpyZXN1bHQgPSBzLT5taW51dGVfYTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNl IFBDRjg1NjNfSE9VUl9BOg0KKyAgICAgICAgKnJlc3VsdCA9IHMtPmhvdXJfYTsNCisgICAgICAg IGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1NjNfREFZX0E6DQorICAgICAgICAqcmVzdWx0ID0gcy0+ ZGF5X2E7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBQQ0Y4NTYzX1dFRUtEQVlfQToNCisg ICAgICAgICpyZXN1bHQgPSBzLT53ZWVrZGF5X2E7DQorICAgICAgICBicmVhazsNCisgICAgY2Fz ZSBQQ0Y4NTYzX0NMS09VVF9DVEw6DQorICAgICAgICAqcmVzdWx0ID0gcy0+Y2xrb3V0X2N0bDsN CisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1NjNfVElNRVJfQ1RMOg0KKyAgICAgICAg KnJlc3VsdCA9IHMtPnRpbWVyX2N0bDsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1 NjNfVElNRVI6DQorICAgICAgICBpZiAodGltZXJfcGVuZGluZyhzLT50aW1lcikpIHsNCisgICAg ICAgICAgICB1aW50NjRfdCBleHBpcmVfdGltZV9zID0gbXVsZGl2NjQodGltZXJfZXhwaXJlX3Rp bWVfbnMocy0+dGltZXIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBOQU5PU0VDT05EU19QRVJfU0VDT05EKTsNCisgICAgICAgICAgICBpZiAobXVsdGlwbHkpIHsN CisgICAgICAgICAgICAgICAgcy0+dGltZXJfY250ID0gbXVsZGl2NjQoZXhwaXJlX3RpbWVfcywg MSwgc3JjX2ZyZXEpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHMt PnRpbWVyX2NudCA9IG11bGRpdjY0KGV4cGlyZV90aW1lX3MsIHNyY19mcmVxLCAxKTsNCisgICAg ICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICAqcmVzdWx0ID0gcy0+dGltZXJfY250Ow0K KyAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQorDQorc3RhdGljIHZvaWQgcGNmODU2M193cml0 ZShQY2Y4NTYzU3RhdGUgKnMsIHVpbnQ4X3QgdmFsKQ0KK3sNCisgICAgc3RydWN0IHRtICp0bSA9 ICZzLT5jdXJyZW50X3RpbWU7DQorICAgIGludCB0bXA7DQorDQorICAgIHN3aXRjaCAocy0+cmVn X2FkZHIpIHsNCisgICAgY2FzZSBQQ0Y4NTYzX0NTMToNCisgICAgICAgIHMtPmNzMSA9IHZhbCAm IDB4YTg7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBQQ0Y4NTYzX0NTMjoNCisgICAgICAg IHMtPmNzMiA9IHZhbCAmIDB4MWY7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBQQ0Y4NTYz X1ZMUzoNCisgICAgICAgIHRtcCA9IGZyb21fYmNkKEZJRUxEX0VYOCh2YWwsIFBDRjg1NjNfVkxT LCBTRUNPTkRTKSk7DQorICAgICAgICBpZiAodG1wID49IDAgJiYgdG1wIDw9IDU5KSB7DQorICAg ICAgICAgICAgdG0tPnRtX3NlYyA9IHRtcDsNCisgICAgICAgICAgICBzZXRfdGltZShzLCB0bSk7 DQorICAgICAgICB9DQorDQorICAgICAgICBib29sIHZsID0gRklFTERfRVg4KHZhbCwgUENGODU2 M19WTFMsIFZMKTsNCisNCisgICAgICAgIGlmICh2bCBeIChzLT52bHMgJiAweDgwKSkgew0KKyAg ICAgICAgICAgIGlmICh2bCkgew0KKyAgICAgICAgICAgICAgICAvKiBDbG9jayBpbnRlZ3JpdHkg aXMgbm90IGd1YXJhbnRlZWQgKi8NCisgICAgICAgICAgICAgICAgcy0+c3RvcF90aW1lID0gdGlt ZShOVUxMKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPnN0b3BfdGltZSAhPSAwKSB7DQor ICAgICAgICAgICAgICAgIHMtPnRpbWVfb2Zmc2V0ICs9IHMtPnN0b3BfdGltZSAtIHRpbWUoTlVM TCk7DQorICAgICAgICAgICAgICAgIHMtPnN0b3BfdGltZSA9IDA7DQorICAgICAgICAgICAgfQ0K KyAgICAgICAgfQ0KKw0KKyAgICAgICAgcy0+dmxzID0gdmwgPDwgODsNCisgICAgICAgIGJyZWFr Ow0KKyAgICBjYXNlIFBDRjg1NjNfTUlOVVRFUzoNCisgICAgICAgIHRtcCA9IGZyb21fYmNkKEZJ RUxEX0VYOCh2YWwsIFBDRjg1NjNfTUlOVVRFUywgTUlOVVRFUykpOw0KKyAgICAgICAgaWYgKHRt cCA+PSAwICYmIHRtcCA8PSA1OSkgew0KKyAgICAgICAgICAgIHMtPm1pbnV0ZXMgPSB2YWw7DQor ICAgICAgICAgICAgdG0tPnRtX21pbiA9IHRtcDsNCisgICAgICAgICAgICBzZXRfdGltZShzLCB0 bSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBQQ0Y4NTYzX0hPVVJT Og0KKyAgICAgICAgdG1wID0gZnJvbV9iY2QoRklFTERfRVg4KHZhbCwgUENGODU2M19IT1VSUywg SE9VUlMpKTsNCisgICAgICAgIGlmICh0bXAgPj0gMCAmJiB0bXAgPD0gMjMpIHsNCisgICAgICAg ICAgICBzLT5ob3VycyA9IHZhbDsNCisgICAgICAgICAgICB0bS0+dG1faG91ciA9IHRtcDsNCisg ICAgICAgICAgICBzZXRfdGltZShzLCB0bSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsN CisgICAgY2FzZSBQQ0Y4NTYzX0RBWVM6DQorICAgICAgICB0bXAgPSBmcm9tX2JjZChGSUVMRF9F WDgodmFsLCBQQ0Y4NTYzX0RBWVMsIERBWVMpKTsNCisgICAgICAgIGlmICh0bXAgPj0gMSAmJiB0 bXAgPD0gMzEpIHsNCisgICAgICAgICAgICBzLT5kYXlzID0gdmFsOw0KKyAgICAgICAgICAgIHRt LT50bV9tZGF5ID0gdG1wOw0KKyAgICAgICAgICAgIHNldF90aW1lKHMsIHRtKTsNCisgICAgICAg IH0NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1NjNfV0VFS0RBWVM6DQorICAgICAg ICB0bXAgPSBmcm9tX2JjZChGSUVMRF9FWDgodmFsLCBQQ0Y4NTYzX1dFRUtEQVlTLCBXRUVLREFZ UykpOw0KKyAgICAgICAgaWYgKHRtcCA+PSAwICYmIHRtcCA8PSA2KSB7DQorICAgICAgICAgICAg cy0+d2Vla2RheXMgPSB2YWw7DQorICAgICAgICAgICAgdG0tPnRtX3dkYXkgPSB0bXA7DQorICAg ICAgICAgICAgc2V0X3RpbWUocywgdG0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQor ICAgIGNhc2UgUENGODU2M19DRU5UVVJZX01PTlRIUzoNCisgICAgICAgIHRtcCA9IGZyb21fYmNk KEZJRUxEX0VYOCh2YWwsIFBDRjg1NjNfQ0VOVFVSWV9NT05USFMsIE1PTlRIUykpOw0KKyAgICAg ICAgaWYgKHRtcCA+PSAwICYmIHRtcCA8PSAxMikgew0KKyAgICAgICAgICAgIHMtPmNlbnR1cmVf bW9udGhzID0gdmFsOw0KKyAgICAgICAgICAgIHRtLT50bV9tb24gPSB0bXA7DQorICAgICAgICAg ICAgc2V0X3RpbWUocywgdG0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIGNh c2UgUENGODU2M19ZRUFSUzoNCisgICAgICAgIHRtcCA9IGZyb21fYmNkKEZJRUxEX0VYOCh2YWws IFBDRjg1NjNfWUVBUlMsIFlFQVJTKSk7DQorICAgICAgICBpZiAodG1wID49IDAgJiYgdG1wIDw9 IDk5KSB7DQorICAgICAgICAgICAgcy0+eWVhcnMgPSB2YWw7DQorICAgICAgICAgICAgdG0tPnRt X3llYXIgPSB0bXAgKyAxMDA7DQorICAgICAgICAgICAgc2V0X3RpbWUocywgdG0pOw0KKyAgICAg ICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19NSU5VVEVfQToNCisgICAg ICAgIHMtPm1pbnV0ZV9hID0gdmFsOw0KKyAgICAgICAgdG1wID0gZnJvbV9iY2QoRklFTERfRVg4 KHZhbCwgUENGODU2M19NSU5VVEVfQSwgTUlOVVRFX0EpKTsNCisgICAgICAgIGlmICh0bXAgPj0g MCAmJiB0bXAgPD0gNTkpIHsNCisgICAgICAgICAgICBzLT50bV9hbGFybS50bV9taW4gPSB0bXA7 DQorICAgICAgICAgICAgc2V0X2FsYXJtKHMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7 DQorICAgIGNhc2UgUENGODU2M19IT1VSX0E6DQorICAgICAgICBzLT5ob3VyX2EgPSB2YWwgJiAw eGJmOw0KKyAgICAgICAgdG1wID0gZnJvbV9iY2QoRklFTERfRVg4KHZhbCwgUENGODU2M19IT1VS X0EsIEhPVVJfQSkpOw0KKyAgICAgICAgaWYgKHRtcCA+PSAwICYmIHRtcCA8PSAyMykgew0KKyAg ICAgICAgICAgIHMtPnRtX2FsYXJtLnRtX2hvdXIgPSB0bXA7DQorICAgICAgICAgICAgc2V0X2Fs YXJtKHMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19E QVlfQToNCisgICAgICAgIHMtPmRheV9hID0gdmFsICYgMHhiZjsNCisgICAgICAgIHRtcCA9IGZy b21fYmNkKEZJRUxEX0VYOCh2YWwsIFBDRjg1NjNfREFZX0EsIERBWV9BKSk7DQorICAgICAgICBp ZiAodG1wID49IDEgJiYgdG1wIDw9IDMxKSB7DQorICAgICAgICAgICAgcy0+dG1fYWxhcm0udG1f bWRheSA9IHRtcDsNCisgICAgICAgICAgICBzZXRfYWxhcm0ocyk7DQorICAgICAgICB9DQorICAg ICAgICBicmVhazsNCisgICAgY2FzZSBQQ0Y4NTYzX1dFRUtEQVlfQToNCisgICAgICAgIHMtPndl ZWtkYXlfYSA9IHZhbCAmIDB4ODc7DQorICAgICAgICB0bXAgPSBmcm9tX2JjZChGSUVMRF9FWDgo dmFsLCBQQ0Y4NTYzX1dFRUtEQVlfQSwgV0VFS0RBWV9BKSk7DQorICAgICAgICBpZiAodG1wID49 IDAgJiYgdG1wIDw9IDYpIHsNCisgICAgICAgICAgICBzLT50bV9hbGFybS50bV93ZGF5ID0gdG1w Ow0KKyAgICAgICAgICAgIHNldF9hbGFybShzKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFr Ow0KKyAgICBjYXNlIFBDRjg1NjNfQ0xLT1VUX0NUTDoNCisgICAgICAgIHMtPmNsa291dF9jdGwg PSB2YWwgJiAweDgzOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgUENGODU2M19USU1FUl9D VEw6DQorICAgICAgICBzLT50aW1lcl9jdGwgPSB2YWwgJiAweDgzOw0KKw0KKyAgICAgICAgaWYg KCFGSUVMRF9FWDMyKHMtPnRpbWVyX2N0bCwgUENGODU2M19USU1FUl9DVEwsIFRFKSkgew0KKyAg ICAgICAgICAgIGlmICh0aW1lcl9wZW5kaW5nKHMtPnRpbWVyKSkgew0KKyAgICAgICAgICAgICAg ICB0aW1lcl9kZWwocy0+dGltZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAg ICAgIGJyZWFrOw0KKyAgICBjYXNlIFBDRjg1NjNfVElNRVI6DQorICAgICAgICBzLT50aW1lcl9j bnQgPSB2YWw7DQorICAgICAgICBpZiAoRklFTERfRVgzMihzLT50aW1lcl9jdGwsIFBDRjg1NjNf VElNRVJfQ1RMLCBURSkpIHsNCisgICAgICAgICAgICBib29sIG11bHRpcGx5ID0gZmFsc2U7DQor ICAgICAgICAgICAgdWludDE2X3Qgc3JjX2ZyZXEgPSBnZXRfc3JjX2ZyZXEocywgJm11bHRpcGx5 KTsNCisgICAgICAgICAgICB1aW50NjRfdCBkZWxheSA9IDA7DQorDQorICAgICAgICAgICAgLyog Q2FsY3VsYXRlIHRpbWVyJ3MgZGVsYXkgaW4gbnMgYmFzZWQgb24gdmFsdWUgYW5kIHNldCBpdCB1 cCAqLw0KKyAgICAgICAgICAgIGlmIChtdWx0aXBseSkgew0KKyAgICAgICAgICAgICAgICBkZWxh eSA9IHZhbCAqIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQgKiBzcmNfZnJlcTsNCisgICAgICAgICAg ICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkZWxheSA9IHZhbCAqIE5BTk9TRUNPTkRTX1BF Ul9TRUNPTkQgLyBzcmNfZnJlcTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGltZXJf bW9kKHMtPnRpbWVyLCBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgZGVs YXkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCit9DQorDQorc3RhdGlj IHVpbnQ4X3QgcGNmODU2M19yeChJMkNTbGF2ZSAqaTJjKQ0KK3sNCisgICAgUGNmODU2M1N0YXRl ICpzID0gUENGODU2MyhpMmMpOw0KKyAgICB1aW50OF90IHJlc3VsdCA9IDB4ZmY7DQorDQorICAg IHBjZjg1NjNfcmVhZChzLCAmcmVzdWx0KTsNCisgICAgLyogQXV0by1pbmNyZW1lbnQgcmVnaXN0 ZXIgYWRkcmVzcyAqLw0KKyAgICBzLT5yZWdfYWRkcisrOw0KKw0KKyAgICB0cmFjZV9wY2Y4NTYz X3J0Y19yZWFkKHMtPnJlYWRfaW5kZXgsIHJlc3VsdCk7DQorICAgIHJldHVybiByZXN1bHQ7DQor fQ0KKw0KK3N0YXRpYyBpbnQgcGNmODU2M190eChJMkNTbGF2ZSAqaTJjLCB1aW50OF90IGRhdGEp DQorew0KKyAgICBQY2Y4NTYzU3RhdGUgKnMgPSBQQ0Y4NTYzKGkyYyk7DQorDQorICAgIGlmIChz LT53cml0ZV9pbmRleCA9PSAwKSB7DQorICAgICAgICAvKiBSZWNlaXZlIHJlZ2lzdGVyIGFkZHJl c3MgKi8NCisgICAgICAgIHMtPnJlZ19hZGRyID0gZGF0YTsNCisgICAgICAgIHMtPndyaXRlX2lu ZGV4Kys7DQorICAgICAgICB0cmFjZV9wY2Y4NTYzX3J0Y193cml0ZV9hZGRyKGRhdGEpOw0KKyAg ICB9IGVsc2Ugew0KKyAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHRvIHdyaXRlICovDQorICAgICAg ICBwY2Y4NTYzX3dyaXRlKHMsIGRhdGEpOw0KKyAgICAgICAgcy0+d3JpdGVfaW5kZXgrKzsNCisg ICAgICAgIHMtPnJlZ19hZGRyKys7DQorICAgICAgICB0cmFjZV9wY2Y4NTYzX3J0Y193cml0ZV9k YXRhKGRhdGEpOw0KKyAgICB9DQorICAgIHJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHBj Zjg1NjNfZXZlbnQoSTJDU2xhdmUgKmkyYywgZW51bSBpMmNfZXZlbnQgZXZlbnQpDQorew0KKyAg ICB0cmFjZV9wY2Y4NTYzX3J0Y19ldmVudChldmVudCk7DQorICAgIFBjZjg1NjNTdGF0ZSAqcyA9 IFBDRjg1NjMoaTJjKTsNCisNCisgICAgc3dpdGNoIChldmVudCkgew0KKyAgICBjYXNlIEkyQ19T VEFSVF9SRUNWOg0KKyAgICAgICAgY2FwdHVyZV90aW1lKHMpOw0KKyAgICAgICAgYnJlYWs7DQor ICAgIGNhc2UgSTJDX0ZJTklTSDoNCisgICAgICAgIHMtPnJlYWRfaW5kZXggPSAwOw0KKyAgICAg ICAgcy0+d3JpdGVfaW5kZXggPSAwOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQor ICAgIH0NCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3Jp cHRpb24gdm1zdGF0ZV9wY2Y4NTYzID0gew0KKyAgICAubmFtZSA9ICJQQ0Y4NTYzIiwNCisgICAg LnZlcnNpb25faWQgPSAwLA0KKyAgICAubWluaW11bV92ZXJzaW9uX2lkID0gMCwNCisgICAgLmZp ZWxkcyA9IChjb25zdCBWTVN0YXRlRmllbGRbXSkgew0KKyAgICAgICAgVk1TVEFURV9JMkNfU0xB VkUocGFyZW50X29iaiwgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVUlOVDgocmVh ZF9pbmRleCwgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVUlOVDgod3JpdGVfaW5k ZXgsIFBjZjg1NjNTdGF0ZSksDQorICAgICAgICBWTVNUQVRFX1VJTlQ4KHJlZ19hZGRyLCBQY2Y4 NTYzU3RhdGUpLA0KKyAgICAgICAgVk1TVEFURV9VSU5UOChjczEsIFBjZjg1NjNTdGF0ZSksDQor ICAgICAgICBWTVNUQVRFX1VJTlQ4KGNzMiwgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RB VEVfVUlOVDgodmxzLCBQY2Y4NTYzU3RhdGUpLA0KKyAgICAgICAgVk1TVEFURV9VSU5UOChtaW51 dGVzLCBQY2Y4NTYzU3RhdGUpLA0KKyAgICAgICAgVk1TVEFURV9VSU5UOChob3VycywgUGNmODU2 M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVUlOVDgoZGF5cywgUGNmODU2M1N0YXRlKSwNCisg ICAgICAgIFZNU1RBVEVfVUlOVDgod2Vla2RheXMsIFBjZjg1NjNTdGF0ZSksDQorICAgICAgICBW TVNUQVRFX1VJTlQ4KGNlbnR1cmVfbW9udGhzLCBQY2Y4NTYzU3RhdGUpLA0KKyAgICAgICAgVk1T VEFURV9VSU5UOCh5ZWFycywgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVUlOVDgo bWludXRlX2EsIFBjZjg1NjNTdGF0ZSksDQorICAgICAgICBWTVNUQVRFX1VJTlQ4KGhvdXJfYSwg UGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVUlOVDgoZGF5X2EsIFBjZjg1NjNTdGF0 ZSksDQorICAgICAgICBWTVNUQVRFX1VJTlQ4KHdlZWtkYXlfYSwgUGNmODU2M1N0YXRlKSwNCisg ICAgICAgIFZNU1RBVEVfVUlOVDgoY2xrb3V0X2N0bCwgUGNmODU2M1N0YXRlKSwNCisgICAgICAg IFZNU1RBVEVfVUlOVDgodGltZXJfY3RsLCBQY2Y4NTYzU3RhdGUpLA0KKyAgICAgICAgVk1TVEFU RV9VSU5UOCh0aW1lcl9jbnQsIFBjZjg1NjNTdGF0ZSksDQorICAgICAgICBWTVNUQVRFX1RJTUVS X1BUUih0aW1lciwgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfVElNRVJfUFRSKGly cV9nZW5fdGltZXIsIFBjZjg1NjNTdGF0ZSksDQorICAgICAgICBWTVNUQVRFX1RJTUVSX1BUUihh bGFybV90aW1lciwgUGNmODU2M1N0YXRlKSwNCisgICAgICAgIFZNU1RBVEVfRU5EX09GX0xJU1Qo KQ0KKyAgICB9DQorfTsNCisNCitzdGF0aWMgdm9pZCBwY2Y4NTYzX2luaXQoT2JqZWN0ICpvYmop DQorew0KKyAgICBJMkNTbGF2ZSAqaTJjID0gSTJDX1NMQVZFKG9iaik7DQorICAgIFBjZjg1NjNT dGF0ZSAqcyA9IFBDRjg1NjMob2JqKTsNCisNCisgICAgcy0+YWxhcm1fdGltZXIgPSB0aW1lcl9u ZXdfbnMocnRjX2Nsb2NrLCAmYWxhcm1fdGltZXJfY2IsIHMpOw0KKyAgICBzLT50aW1lciA9IHRp bWVyX25ld19ucyhRRU1VX0NMT0NLX1ZJUlRVQUwsICZ0aW1lcl9jYiwgcyk7DQorICAgIHMtPmly cV9nZW5fdGltZXIgPSB0aW1lcl9uZXdfbnMoUUVNVV9DTE9DS19WSVJUVUFMLCAmaXJxX2dlbl90 aW1lcl9jYiwgcyk7DQorDQorICAgIHFkZXZfaW5pdF9ncGlvX291dChERVZJQ0UocyksICZzLT5p cnEsIDEpOw0KKw0KKyAgICBwY2Y4NTYzX3Jlc2V0KGkyYyk7DQorDQorICAgIHRyYWNlX3BjZjg1 NjNfcnRjX2luaXQoKTsNCisNCisgICAgcy0+cmVnX2FkZHIgPSAweDA5Ow0KKyAgICBwY2Y4NTYz X3dyaXRlKHMsIDB4ODEpOw0KKyAgICBzZXRfYWxhcm0ocyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IHBjZjg1NjNfcmVzZXRfaG9sZChPYmplY3QgKm9iaiwgUmVzZXRUeXBlIHR5cGUpDQorew0KKyAg ICBJMkNTbGF2ZSAqaTJjID0gSTJDX1NMQVZFKG9iaik7DQorICAgIHBjZjg1NjNfcmVzZXQoaTJj KTsNCit9DQorDQorc3RhdGljIHZvaWQgcGNmODU2M19jbGFzc19pbml0KE9iamVjdENsYXNzICpr bGFzcywgdm9pZCAqZGF0YSkNCit7DQorICAgIERldmljZUNsYXNzICpkYyA9IERFVklDRV9DTEFT UyhrbGFzcyk7DQorICAgIEkyQ1NsYXZlQ2xhc3MgKmsgPSBJMkNfU0xBVkVfQ0xBU1Moa2xhc3Mp Ow0KKyAgICBSZXNldHRhYmxlQ2xhc3MgKnJjID0gUkVTRVRUQUJMRV9DTEFTUyhrbGFzcyk7DQor DQorICAgIGstPmV2ZW50ID0gcGNmODU2M19ldmVudDsNCisgICAgay0+cmVjdiA9IHBjZjg1NjNf cng7DQorICAgIGstPnNlbmQgPSBwY2Y4NTYzX3R4Ow0KKyAgICBkYy0+dm1zZCA9ICZ2bXN0YXRl X3BjZjg1NjM7DQorICAgIHJjLT5waGFzZXMuaG9sZCA9IHBjZjg1NjNfcmVzZXRfaG9sZDsNCit9 DQorDQorc3RhdGljIGNvbnN0IFR5cGVJbmZvIHBjZjg1NjNfcmVnaXN0ZXJfdHlwZXNbXSA9IHsN CisgICAgew0KKyAgICAgICAgLm5hbWUgICAgICAgICAgPSBUWVBFX1BDRjg1NjMsDQorICAgICAg ICAucGFyZW50ICAgICAgICA9IFRZUEVfSTJDX1NMQVZFLA0KKyAgICAgICAgLmluc3RhbmNlX3Np emUgPSBzaXplb2YoUGNmODU2M1N0YXRlKSwNCisgICAgICAgIC5pbnN0YW5jZV9pbml0ID0gcGNm ODU2M19pbml0LA0KKyAgICAgICAgLmNsYXNzX2luaXQgICAgPSBwY2Y4NTYzX2NsYXNzX2luaXQs DQorICAgIH0sDQorfTsNCisNCitERUZJTkVfVFlQRVMocGNmODU2M19yZWdpc3Rlcl90eXBlcykN CmRpZmYgLS1naXQgYS9ody9ydGMvdHJhY2UtZXZlbnRzIGIvaHcvcnRjL3RyYWNlLWV2ZW50cw0K aW5kZXggNzQzZmY3NzVkNC4uMTdjNTI0ZDYxZCAxMDA2NDQNCi0tLSBhL2h3L3J0Yy90cmFjZS1l dmVudHMNCisrKyBiL2h3L3J0Yy90cmFjZS1ldmVudHMNCkBAIC00MywzICs0MywxNSBAQCBzdG0z Ml9ydGNfYXJtX29pbnRyKHVpbnQ2NF90IHRvY2tzLCB1aW50NjRfdCBuc2VjcykgIm92ZXJmbG93 IGludGVycnVwdCBpbiAlIiBQUg0KIHN0bTMyX3J0Y19hcm1fYWludHIodWludDY0X3QgdG9ja3Ms IHVpbnQ2NF90IG5zZWNzKSAiYWxhcm0gaW50ZXJydXB0IGluICUiIFBSSXU2NCAiIHRpY2tzLCAl IiBQUkl1NjQiIG5zZWNzIg0KIHN0bTMyX3J0Y19yZWFkKHVpbnQ2NF90IGFkZHIsIHVpbnQ2NF90 IHZhbHVlLCB1aW50MzJfdCBzaXplKSAiYWRkciAweCUwMiIgUFJJeDY0ICIgdmFsdWUgMHglMDgi IFBSSXg2NCIgc2l6ZSAldSINCiBzdG0zMl9ydGNfd3JpdGUodWludDY0X3QgYWRkciwgdWludDY0 X3QgdmFsdWUsIHVpbnQzMl90IHNpemUpICJhZGRyIDB4JTAyIiBQUkl4NjQgIiB2YWx1ZSAweCUw OCIgUFJJeDY0IiBzaXplICV1Ig0KKw0KKyMgcGNmODU2M19ydGMuYw0KK3BjZjg1NjNfcnRjX3dy aXRlX2RhdGEodWludDhfdCBkYXRhKSAiZGF0YTogMHgleCINCitwY2Y4NTYzX3J0Y193cml0ZV9h ZGRyKHVpbnQ4X3QgYWRkcikgInJlZ2lzdGVyIGFkZHJlc3M6IDB4JXgiDQorcGNmODU2M19ydGNf cmVhZCh1aW50OF90IGFkZHIsIHVpbnQ4X3QgZGF0YSkgImFkZHI6IDB4JXgsIGRhdGE6IDB4JXgi DQorcGNmODU2M19ydGNfZXZlbnQodWludDhfdCBldmVudCkgIkV2ZW50OiAweCV4Ig0KK3BjZjg1 NjNfcnRjX2luaXQodm9pZCkNCitwY2Y4NTYzX3J0Y19yZXNldCh2b2lkKQ0KK3BjZjg1NjNfcnRj X3NldF90aW1lKHZvaWQpDQorcGNmODU2M19ydGNfZ2V0X3RpbWUodm9pZCkNCitwY2Y4NTYzX3J0 Y19zZXRfYWxhcm0odm9pZCkNCitwY2Y4NTYzX3J0Y19jYXB0dXJlX3RpbWUodm9pZCkNCi0tDQoy LjM0LjENCg0K --_000_342e4188176e4ce18ada13cbaf3c7e86yadrocom_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable


Hi Phil and Be= rnhard,

I would like to apologize for not including you in the initial email r= egarding the RTC PCF8563 patch. This was an oversight on my part, and I reg= ret any inconvenience this may have caused.


=A7=B0=A7=E4: Ilya Chichk= ov
=A7=B0=A7=E4=A7=E1=A7=E2=A7=D1=A7=D3=A7=DD=A7=D6=A7=DF=A7=E0: 10 =A7= =DE=A7=D1=A7=E2=A7=E4=A7=D1 2025 =A7=D4. 14:36:34
=A7=AC=A7=E0=A7=DE=A7=E5: Paolo Bonzini; Peter Maydell
=A7=AC=A7=E0=A7=E1=A7=DA=A7=F1: qemu-devel@nongnu.org; nikita.shubin= @maquefel.me; Ilya Chichkov
=A7=B4=A7=D6=A7=DE=A7=D1: [PATCH v2] hw/rtc: Add RTC PCF8563 module<= /font>
 
Add PCF8563 a real-time clock with calendar and I2= C interface.
This commit adds support for interfacing with it and implements
functionality of setting timer, alarm, reading and writing time.

Signed-off-by: Ilya Chichkov <i.chichkov@yadro.com>
---
v1->v2
Phil:
- Add hot reset
- Fix trace message
- Add testing coverage with qtest

Bernhard:
- Move datasheet link to source code top comment section
- Fix typos
- Update licence identifier to SPDX
- Remove unused import libraries
- Change OBJECT_CHECK to OBJECT_DECLARE_SIMPLE_TYPE
- Remove outdated comment
- Rename i2c to parent_obj
- Moved get_time inside capture_time function that is
  called only when I2C request starts
- Add fields inside VMStateDescription
- Removed pcf8563_realize
- Change type_init to DEFINE_TYPES
---
 hw/rtc/Kconfig       |   5 &#= 43;
 hw/rtc/meson.build   |   1 +
 hw/rtc/pcf8563_rtc.c | 740 ++++++++&#= 43;++++++++++++++&#= 43;++++++++++++++&#= 43;++++
 hw/rtc/trace-events  |  12 +
 4 files changed, 758 insertions(+)
 create mode 100644 hw/rtc/pcf8563_rtc.c

diff --git a/hw/rtc/Kconfig b/hw/rtc/Kconfig
index b90c2e510a..4e7a1f75ef 100644
--- a/hw/rtc/Kconfig
+++ b/hw/rtc/Kconfig
@@ -27,5 +27,10 @@ config GOLDFISH_RTC
 config LS7A_RTC
     bool
 
+config PCF8563_RTC
+    bool
+    depends on I2C
+    default y if I2C_DEVICES
+
 config STM32_RTC
     bool
\ No newline at end of file
diff --git a/hw/rtc/meson.build b/hw/rtc/meson.build
index b6bb7436c7..6180ffc6d9 100644
--- a/hw/rtc/meson.build
+++ b/hw/rtc/meson.build
@@ -13,4 +13,5 @@ system_ss.add(when: 'CONFIG_GOLDFISH_RTC', if_true: f= iles('goldfish_rtc.c'))
 system_ss.add(when: 'CONFIG_LS7A_RTC', if_true: files('ls7a_rtc.c'))<= br>  system_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-= rtc.c'))
 system_ss.add(when: 'CONFIG_MC146818RTC', if_true: files('mc146818rtc= .c'))
+system_ss.add(when: 'CONFIG_PCF8563_RTC', if_true: files('pcf8563_rtc.= c'))
 system_ss.add(when: 'CONFIG_STM32_RTC', if_true: files('stm32-rtc.c')= )
diff --git a/hw/rtc/pcf8563_rtc.c b/hw/rtc/pcf8563_rtc.c
new file mode 100644
index 0000000000..195b697598
--- /dev/null
+++ b/hw/rtc/pcf8563_rtc.c
@@ -0,0 +1,740 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Real-time clock/calendar PCF8563 with I2C interface.
+ *
+ * Datasheet: https://www.nxp.com/docs/en/data-sheet/PCF8563.pdf
+ *
+ * Author (c) 2024 Ilya Chichkov <i.chichkov@yadro.com>
+ */
+
+#include "qemu/osdep.h"
+#include "hw/sysbus.h"
+#include "hw/register.h"
+#include "hw/registerfields.h"
+#include "hw/irq.h"
+#include "qemu/bitops.h"
+#include "hw/qdev-properties.h"
+#include "qemu/timer.h"
+#include "hw/i2c/i2c.h"
+#include "qemu/bcd.h"
+#include "qom/object.h"
+#include "sysemu/sysemu.h"
+#include "sysemu/rtc.h"
+#include "migration/vmstate.h"
+#include "qapi/visitor.h"
+
+#include "trace.h"
+
+#define TYPE_PCF8563 "pcf8563"
+OBJECT_DECLARE_SIMPLE_TYPE(Pcf8563State, PCF8563)
+
+#define  PCF8563_CS1       &nb= sp;    0x00
+#define  PCF8563_CS2       &nb= sp;    0x01
+#define  PCF8563_VLS       &nb= sp;    0x02
+#define  PCF8563_MINUTES       = ; 0x03
+#define  PCF8563_HOURS       &= nbsp;  0x04
+#define  PCF8563_DAYS       &n= bsp;   0x05
+#define  PCF8563_WEEKDAYS       0x0= 6
+#define  PCF8563_CENTURY_MONTHS 0x07
+#define  PCF8563_YEARS       &= nbsp;  0x08
+#define  PCF8563_MINUTE_A       0x0= 9
+#define  PCF8563_HOUR_A       =   0x0A
+#define  PCF8563_DAY_A       &= nbsp;  0x0B
+#define  PCF8563_WEEKDAY_A      0x0C
+#define  PCF8563_CLKOUT_CTL     0x0D
+#define  PCF8563_TIMER_CTL      0x0E
+#define  PCF8563_TIMER       &= nbsp;  0x0F
+
+#define MINUTES_IN_HOUR 60
+#define HOURS_IN_DAY 24
+#define DAYS_IN_MONTH 31
+#define DAYS_IN_WEEK 7
+
+REG8(PCF8563_CS1, 0x00)
+    FIELD(PCF8563_CS1, RSVD0,  0,  3)
+    FIELD(PCF8563_CS1, TESTC,  3,  1)
+    FIELD(PCF8563_CS1, RSVD1,  4,  1)
+    FIELD(PCF8563_CS1, STOP,   5,  1) +    FIELD(PCF8563_CS1, RSVD2,  6,  1)
+    FIELD(PCF8563_CS1, TEST1,  7,  1)
+
+REG8(PCF8563_CS2, 0x01)
+    FIELD(PCF8563_CS2, TIE,   0,  1)
+    FIELD(PCF8563_CS2, AIE,   1,  1)
+    FIELD(PCF8563_CS2, TF,    2,  1= )
+    FIELD(PCF8563_CS2, AF,    3,  1= )
+    FIELD(PCF8563_CS2, TI_TP, 4,  1)
+    FIELD(PCF8563_CS2, RSVD,  5,  3)
+
+REG8(PCF8563_VLS, 0x02)
+    FIELD(PCF8563_VLS, SECONDS,  0,  7)
+    FIELD(PCF8563_VLS, VL,     = ;  7,  1)
+
+REG8(PCF8563_MINUTES, 0x03)
+    FIELD(PCF8563_MINUTES, MINUTES, 0,  7)
+    FIELD(PCF8563_MINUTES, RSVD,    7,&n= bsp; 1)
+
+REG8(PCF8563_HOURS, 0x04)
+    FIELD(PCF8563_HOURS, HOURS, 0,  6)
+    FIELD(PCF8563_HOURS, RSVD,  6,  2)
+
+REG8(PCF8563_DAYS, 0x05)
+    FIELD(PCF8563_DAYS, DAYS, 0,  6)
+    FIELD(PCF8563_DAYS, RSVD, 6,  2)
+
+REG8(PCF8563_WEEKDAYS, 0x06)
+    FIELD(PCF8563_WEEKDAYS, WEEKDAYS, 0,  3)
+    FIELD(PCF8563_WEEKDAYS, RSVD,   &nbs= p; 3,  5)
+
+REG8(PCF8563_CENTURY_MONTHS, 0x07)
+    FIELD(PCF8563_CENTURY_MONTHS, MONTHS,  0, = ; 5)
+    FIELD(PCF8563_CENTURY_MONTHS, RSVD,  &nbs= p; 5,  2)
+    FIELD(PCF8563_CENTURY_MONTHS, CENTURY, 7,  1)<= br> +
+REG8(PCF8563_YEARS, 0x08)
+    FIELD(PCF8563_YEARS, YEARS, 0,  8)
+
+REG8(PCF8563_MINUTE_A, 0x09)
+    FIELD(PCF8563_MINUTE_A, MINUTE_A, 0,  7)
+    FIELD(PCF8563_MINUTE_A, AE_M,   &nbs= p; 7,  1)
+
+REG8(PCF8563_HOUR_A, 0x0A)
+    FIELD(PCF8563_HOUR_A, HOUR_A, 0,  7)
+    FIELD(PCF8563_HOUR_A, AE_H,   7,  1)=
+
+REG8(PCF8563_DAY_A, 0x0B)
+    FIELD(PCF8563_DAY_A, DAY_A,  0,  7)
+    FIELD(PCF8563_DAY_A, AE_D,   7,  1)<= br> +
+REG8(PCF8563_WEEKDAY_A, 0x0C)
+    FIELD(PCF8563_WEEKDAY_A, WEEKDAY_A, 0,  3)
+    FIELD(PCF8563_WEEKDAY_A, RSVD,   &nb= sp;  3,  4)
+    FIELD(PCF8563_WEEKDAY_A, AE_W,   &nb= sp;  7,  1)
+
+REG8(PCF8563_CLKOUT_CTL, 0x0D)
+    FIELD(PCF8563_CLKOUT_CTL, FD,   0,  = 2)
+    FIELD(PCF8563_CLKOUT_CTL, RSVD, 2,  5)
+    FIELD(PCF8563_CLKOUT_CTL, FE,   7,  = 1)
+
+REG8(PCF8563_TIMER_CTL, 0x0E)
+    FIELD(PCF8563_TIMER_CTL, TD,   0,  2= )
+    FIELD(PCF8563_TIMER_CTL, RSVD, 2,  5)
+    FIELD(PCF8563_TIMER_CTL, TE,   7,  1= )
+
+REG8(PCF8563_TIMER, 0x0F)
+    FIELD(PCF8563_TIMER, TIMER, 0,  8)
+
+typedef struct Pcf8563State {
+    I2CSlave parent_obj;
+
+    struct tm current_time;
+    qemu_irq irq;
+
+    uint8_t read_index;
+    uint8_t write_index;
+    uint8_t reg_addr;
+
+    /* Control and status */
+    uint8_t cs1;
+    uint8_t cs2;
+    /* Counters */
+    uint8_t vls;
+    uint8_t minutes;
+    uint8_t hours;
+    uint8_t days;
+    uint8_t weekdays;
+    uint8_t centure_months;
+    uint8_t years;
+    /* Alarm registers */
+    uint8_t minute_a;
+    uint8_t hour_a;
+    uint8_t day_a;
+    uint8_t weekday_a;
+    /* Timer control */
+    uint8_t clkout_ctl;
+    uint8_t timer_ctl;
+    uint8_t timer_cnt;
+
+    QEMUTimer *alarm_timer;
+    struct tm tm_alarm;
+    bool alarm_irq;
+    QEMUTimer *timer;
+    time_t time_offset;
+    time_t stop_time;
+    QEMUTimer *irq_gen_timer;
+} Pcf8563State;
+
+static uint16_t get_src_freq(Pcf8563State *s, bool *multiply)
+{
+    *multiply =3D false;
+    /* Select source clock frequency (Hz) */
+    switch (FIELD_EX8(s->timer_ctl, PCF8563_TIMER_CT= L, TD)) {
+    case 0:
+        return 4096;
+    case 1:
+        return 64;
+    case 2:
+        return 1;
+    case 3:
+        *multiply =3D true;
+        return 60;
+    default:
+        return 0;
+    }
+}
+
+static uint16_t get_irq_pulse_freq(Pcf8563State *s)
+{
+    if (s->timer_cnt > 1) {
+        switch (FIELD_EX8(s->tim= er_ctl, PCF8563_TIMER_CTL, TD)) {
+        case 0:
+            ret= urn 8192;
+        case 1:
+            ret= urn 128;
+        case 2:
+        case 3:
+            ret= urn 64;
+        default:
+            ret= urn 0;
+        }
+    } else {
+        if (FIELD_EX8(s->timer_c= tl, PCF8563_TIMER_CTL, TD) =3D=3D 0) {
+            ret= urn 4096;
+        }
+        return 64;
+    }
+
+}
+
+static void timer_irq(Pcf8563State *s)
+{
+    if (!FIELD_EX8(s->cs2, PCF8563_CS2, TIE)) {
+        return;
+    }
+
+    if (FIELD_EX8(s->cs2, PCF8563_CS2, TI_TP)) {
+        qemu_irq_pulse(s->irq);<= br> +
+        /* Start IRQ pulse generato= r */
+        uint64_t delay =3D s->ti= mer_cnt *
+           &nbs= p;            NANOSE= CONDS_PER_SECOND *
+           &nbs= p;            get_ir= q_pulse_freq(s);
+        timer_mod(s->irq_gen_tim= er,
+           &nbs= p;        qemu_clock_get_ns(QEMU_CLOCK_V= IRTUAL) + delay);
+    } else {
+        qemu_irq_raise(s->irq);<= br> +    }
+}
+
+static void alarm_irq(Pcf8563State *s)
+{
+    if (FIELD_EX8(s->cs2, PCF8563_CS2, AIE)) {
+        qemu_irq_raise(s->irq);<= br> +    }
+}
+
+static void set_alarm(Pcf8563State *s)
+{
+    uint64_t diff_sec =3D 0;
+    uint64_t diff_min =3D 0;
+    uint64_t diff_hour =3D 0;
+    uint64_t diff_day =3D 0;
+    uint64_t diff_wday =3D 0;
+    uint64_t delay =3D 0;
+    uint64_t now_cl =3D 0;
+    struct tm now;
+
+    bool is_min_en =3D !FIELD_EX8(s->minute_a, PCF85= 63_MINUTE_A, AE_M);
+    bool is_hour_en =3D !FIELD_EX8(s->hour_a, PCF856= 3_HOUR_A, AE_H);
+    bool is_day_en =3D !FIELD_EX8(s->day_a, PCF8563_= DAY_A, AE_D);
+    bool is_wday_en =3D !FIELD_EX8(s->weekday_a, PCF= 8563_WEEKDAY_A, AE_W);
+    if (!is_day_en && !is_wday_en && !i= s_hour_en && !is_min_en) {
+        if (s->alarm_timer) { +            tim= er_del(s->alarm_timer);
+        }
+        return;
+    }
+
+    qemu_get_timedate(&now, s->time_offset);
+
+    if (is_min_en) {
+        if (s->tm_alarm.tm_min &= gt; s->current_time.tm_min) {
+            dif= f_min =3D s->tm_alarm.tm_min - s->current_time.tm_min;
+        } else {
+            dif= f_min =3D (MINUTES_IN_HOUR -
+           &nbs= p;            s->= current_time.tm_min + s->tm_alarm.tm_min);
+        }
+    }
+
+    if (is_hour_en) {
+        if (s->tm_alarm.tm_hour = > s->current_time.tm_hour) {
+            dif= f_hour =3D s->tm_alarm.tm_hour - s->current_time.tm_hour;
+        } else {
+            dif= f_hour =3D (HOURS_IN_DAY -
+           &nbs= p;             = s->current_time.tm_hour + s->tm_alarm.tm_hour);
+        }
+    }
+
+    if (is_day_en) {
+        if (s->tm_alarm.tm_mday = > s->current_time.tm_mday) {
+            dif= f_day =3D s->tm_alarm.tm_mday - s->current_time.tm_mday;
+        } else {
+            dif= f_day =3D (DAYS_IN_MONTH -
+           &nbs= p;            s->= current_time.tm_mday + s->tm_alarm.tm_mday);
+        }
+    }
+
+    if (is_wday_en) {
+        if (s->tm_alarm.tm_wday = > s->current_time.tm_wday) {
+            dif= f_wday =3D s->tm_alarm.tm_wday - s->current_time.tm_wday;
+        } else {
+            dif= f_wday =3D (DAYS_IN_WEEK -
+           &nbs= p;             = s->current_time.tm_wday + s->tm_alarm.tm_wday);
+        }
+    }
+
+    diff_sec =3D (diff_min * 60) +
+           &nbs= p;   (diff_hour * 60 * 60) +
+           &nbs= p;   (diff_day * 24 * 60 * 60) +
+           &nbs= p;   (diff_wday * 24 * 60 * 60);
+    now_cl =3D muldiv64(qemu_clock_get_ns(rtc_clock), 1= , NANOSECONDS_PER_SECOND);
+    delay =3D muldiv64((now_cl + diff_sec), NANOSEC= ONDS_PER_SECOND, 1);
+
+    if (s->alarm_timer) {
+        timer_del(s->alarm_timer= );
+    }
+    timer_mod(s->alarm_timer, delay);
+}
+
+static void pcf8563_update_irq(Pcf8563State *s)
+{
+    if (FIELD_EX8(s->cs2, PCF8563_CS2, TF)) {
+        timer_irq(s);
+    }
+
+    if (FIELD_EX8(s->cs2, PCF8563_CS2, AF)) {
+        alarm_irq(s);
+    }
+}
+
+static void alarm_timer_cb(void *opaque)
+{
+    Pcf8563State *s =3D PCF8563(opaque);
+
+    set_alarm(s);
+    s->cs2 =3D FIELD_DP8(s->cs2, PCF8563_CS2, AF,= 1);
+    pcf8563_update_irq(s);
+}
+
+static void timer_cb(void *opaque)
+{
+    Pcf8563State *s =3D PCF8563(opaque);
+
+    s->timer_cnt =3D 0;
+    s->cs2 =3D FIELD_DP8(s->cs2, PCF8563_CS2, TF,= 1);
+    pcf8563_update_irq(s);
+}
+
+static void irq_gen_timer_cb(void *opaque)
+{
+    Pcf8563State *s =3D PCF8563(opaque);
+
+    pcf8563_update_irq(s);
+}
+
+static inline void capture_time(Pcf8563State *s)
+{
+    qemu_get_timedate(&s->current_time, s->ti= me_offset);
+    trace_pcf8563_rtc_capture_time();
+}
+
+static void set_time(Pcf8563State *s, struct tm *tm)
+{
+    s->time_offset =3D qemu_timedate_diff(tm);
+    set_alarm(s);
+    trace_pcf8563_rtc_set_time();
+}
+
+static void pcf8563_reset(I2CSlave *i2c)
+{
+    Pcf8563State *s =3D PCF8563(i2c);
+
+    s->read_index =3D 0;
+    s->write_index =3D 0;
+    s->reg_addr =3D 0;
+
+    s->cs1 =3D 0x8;
+    s->cs2 =3D 0x0;
+    s->vls =3D 0x80;
+    s->minutes =3D 0x0;
+    s->hours =3D 0x0;
+    s->days =3D 0x0;
+    s->weekdays =3D 0x0;
+    s->centure_months =3D 0x0;
+    s->years =3D 0x0;
+    s->minute_a =3D 0x80;
+    s->hour_a =3D 0x80;
+    s->day_a =3D 0x80;
+    s->weekday_a =3D 0x80;
+    s->clkout_ctl =3D 0x80;
+    s->timer_ctl =3D 0x3;
+    s->timer_cnt =3D 0x0;
+
+    s->stop_time =3D 0;
+    s->reg_addr =3D 0;
+
+    s->alarm_irq =3D false;
+    s->time_offset =3D 0;
+
+    qemu_irq_lower(s->irq);
+    qemu_get_timedate(&s->tm_alarm, 0);
+
+    timer_del(s->alarm_timer);
+    timer_del(s->timer);
+}
+
+static void pcf8563_read(Pcf8563State *s, uint8_t *result)
+{
+    struct tm *tm =3D &s->current_time;
+
+    bool multiply =3D false;
+    uint16_t src_freq =3D get_src_freq(s, &multiply= );
+
+    switch (s->reg_addr) {
+    case PCF8563_CS1:
+        *result =3D s->cs1;
+        break;
+    case PCF8563_CS2:
+        *result =3D s->cs2;
+        break;
+    case PCF8563_VLS:
+        *result =3D (s->vls &= ; 0x80) | to_bcd(tm->tm_sec);
+        break;
+    case PCF8563_MINUTES:
+        *result =3D to_bcd(tm->t= m_min);
+        break;
+    case PCF8563_HOURS:
+        *result =3D to_bcd(tm->t= m_hour);
+        break;
+    case PCF8563_DAYS:
+        *result =3D to_bcd(tm->t= m_mday);
+        break;
+    case PCF8563_WEEKDAYS:
+        *result =3D to_bcd(tm->t= m_wday);
+        break;
+    case PCF8563_CENTURY_MONTHS:
+        *result =3D to_bcd(tm->t= m_mon + 1);
+        break;
+    case PCF8563_YEARS:
+        *result =3D to_bcd((tm->= tm_year + 1900) % 100);
+        break;
+    case PCF8563_MINUTE_A:
+        *result =3D s->minute_a;=
+        break;
+    case PCF8563_HOUR_A:
+        *result =3D s->hour_a; +        break;
+    case PCF8563_DAY_A:
+        *result =3D s->day_a; +        break;
+    case PCF8563_WEEKDAY_A:
+        *result =3D s->weekday_a= ;
+        break;
+    case PCF8563_CLKOUT_CTL:
+        *result =3D s->clkout_ct= l;
+        break;
+    case PCF8563_TIMER_CTL:
+        *result =3D s->timer_ctl= ;
+        break;
+    case PCF8563_TIMER:
+        if (timer_pending(s->tim= er)) {
+            uin= t64_t expire_time_s =3D muldiv64(timer_expire_time_ns(s->timer),
+           &nbs= p;            &= nbsp;           &nbs= p;         1,
+           &nbs= p;            &= nbsp;           &nbs= p;         NANOSECONDS_PER_SECOND);=
+            if = (multiply) {
+           &nbs= p;    s->timer_cnt =3D muldiv64(expire_time_s, 1, src_fre= q);
+            } e= lse {
+           &nbs= p;    s->timer_cnt =3D muldiv64(expire_time_s, src_freq, = 1);
+            } +        }
+        *result =3D s->timer_cnt= ;
+        break;
+    }
+}
+
+static void pcf8563_write(Pcf8563State *s, uint8_t val)
+{
+    struct tm *tm =3D &s->current_time;
+    int tmp;
+
+    switch (s->reg_addr) {
+    case PCF8563_CS1:
+        s->cs1 =3D val & 0xa= 8;
+        break;
+    case PCF8563_CS2:
+        s->cs2 =3D val & 0x1= f;
+        break;
+    case PCF8563_VLS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_VLS, SECONDS));
+        if (tmp >=3D 0 &&= ; tmp <=3D 59) {
+            tm-= >tm_sec =3D tmp;
+            set= _time(s, tm);
+        }
+
+        bool vl =3D FIELD_EX8(val, = PCF8563_VLS, VL);
+
+        if (vl ^ (s->vls & 0= x80)) {
+            if = (vl) {
+           &nbs= p;    /* Clock integrity is not guaranteed */
+           &nbs= p;    s->stop_time =3D time(NULL);
+            } e= lse if (s->stop_time !=3D 0) {
+           &nbs= p;    s->time_offset +=3D s->stop_time - time(NULL= );
+           &nbs= p;    s->stop_time =3D 0;
+            } +        }
+
+        s->vls =3D vl << 8= ;
+        break;
+    case PCF8563_MINUTES:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_MINUTES, MINUTES));
+        if (tmp >=3D 0 &&= ; tmp <=3D 59) {
+            s-&= gt;minutes =3D val;
+            tm-= >tm_min =3D tmp;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_HOURS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_HOURS, HOURS));
+        if (tmp >=3D 0 &&= ; tmp <=3D 23) {
+            s-&= gt;hours =3D val;
+            tm-= >tm_hour =3D tmp;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_DAYS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_DAYS, DAYS));
+        if (tmp >=3D 1 &&= ; tmp <=3D 31) {
+            s-&= gt;days =3D val;
+            tm-= >tm_mday =3D tmp;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_WEEKDAYS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_WEEKDAYS, WEEKDAYS));
+        if (tmp >=3D 0 &&= ; tmp <=3D 6) {
+            s-&= gt;weekdays =3D val;
+            tm-= >tm_wday =3D tmp;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_CENTURY_MONTHS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_CENTURY_MONTHS, MONTHS));
+        if (tmp >=3D 0 &&= ; tmp <=3D 12) {
+            s-&= gt;centure_months =3D val;
+            tm-= >tm_mon =3D tmp;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_YEARS:
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_YEARS, YEARS));
+        if (tmp >=3D 0 &&= ; tmp <=3D 99) {
+            s-&= gt;years =3D val;
+            tm-= >tm_year =3D tmp + 100;
+            set= _time(s, tm);
+        }
+        break;
+    case PCF8563_MINUTE_A:
+        s->minute_a =3D val;
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_MINUTE_A, MINUTE_A));
+        if (tmp >=3D 0 &&= ; tmp <=3D 59) {
+            s-&= gt;tm_alarm.tm_min =3D tmp;
+            set= _alarm(s);
+        }
+        break;
+    case PCF8563_HOUR_A:
+        s->hour_a =3D val & = 0xbf;
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_HOUR_A, HOUR_A));
+        if (tmp >=3D 0 &&= ; tmp <=3D 23) {
+            s-&= gt;tm_alarm.tm_hour =3D tmp;
+            set= _alarm(s);
+        }
+        break;
+    case PCF8563_DAY_A:
+        s->day_a =3D val & 0= xbf;
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_DAY_A, DAY_A));
+        if (tmp >=3D 1 &&= ; tmp <=3D 31) {
+            s-&= gt;tm_alarm.tm_mday =3D tmp;
+            set= _alarm(s);
+        }
+        break;
+    case PCF8563_WEEKDAY_A:
+        s->weekday_a =3D val &am= p; 0x87;
+        tmp =3D from_bcd(FIELD_EX8(= val, PCF8563_WEEKDAY_A, WEEKDAY_A));
+        if (tmp >=3D 0 &&= ; tmp <=3D 6) {
+            s-&= gt;tm_alarm.tm_wday =3D tmp;
+            set= _alarm(s);
+        }
+        break;
+    case PCF8563_CLKOUT_CTL:
+        s->clkout_ctl =3D val &a= mp; 0x83;
+        break;
+    case PCF8563_TIMER_CTL:
+        s->timer_ctl =3D val &am= p; 0x83;
+
+        if (!FIELD_EX32(s->timer= _ctl, PCF8563_TIMER_CTL, TE)) {
+            if = (timer_pending(s->timer)) {
+           &nbs= p;    timer_del(s->timer);
+            } +        }
+        break;
+    case PCF8563_TIMER:
+        s->timer_cnt =3D val; +        if (FIELD_EX32(s->timer_= ctl, PCF8563_TIMER_CTL, TE)) {
+            boo= l multiply =3D false;
+            uin= t16_t src_freq =3D get_src_freq(s, &multiply);
+            uin= t64_t delay =3D 0;
+
+            /* = Calculate timer's delay in ns based on value and set it up */
+            if = (multiply) {
+           &nbs= p;    delay =3D val * NANOSECONDS_PER_SECOND * src_freq;
+            } e= lse {
+           &nbs= p;    delay =3D val * NANOSECONDS_PER_SECOND / src_freq;
+            } +            tim= er_mod(s->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + delay);
+        }
+        break;
+    }
+}
+
+static uint8_t pcf8563_rx(I2CSlave *i2c)
+{
+    Pcf8563State *s =3D PCF8563(i2c);
+    uint8_t result =3D 0xff;
+
+    pcf8563_read(s, &result);
+    /* Auto-increment register address */
+    s->reg_addr++;
+
+    trace_pcf8563_rtc_read(s->read_index, result); +    return result;
+}
+
+static int pcf8563_tx(I2CSlave *i2c, uint8_t data)
+{
+    Pcf8563State *s =3D PCF8563(i2c);
+
+    if (s->write_index =3D=3D 0) {
+        /* Receive register address= */
+        s->reg_addr =3D data; +        s->write_index++= ;
+        trace_pcf8563_rtc_write_add= r(data);
+    } else {
+        /* Receive data to write */=
+        pcf8563_write(s, data);
+        s->write_index++= ;
+        s->reg_addr++; +        trace_pcf8563_rtc_write_dat= a(data);
+    }
+    return 0;
+}
+
+static int pcf8563_event(I2CSlave *i2c, enum i2c_event event)
+{
+    trace_pcf8563_rtc_event(event);
+    Pcf8563State *s =3D PCF8563(i2c);
+
+    switch (event) {
+    case I2C_START_RECV:
+        capture_time(s);
+        break;
+    case I2C_FINISH:
+        s->read_index =3D 0;
+        s->write_index =3D 0; +    default:
+        break;
+    }
+    return 0;
+}
+
+static const VMStateDescription vmstate_pcf8563 =3D {
+    .name =3D "PCF8563",
+    .version_id =3D 0,
+    .minimum_version_id =3D 0,
+    .fields =3D (const VMStateField[]) {
+        VMSTATE_I2C_SLAVE(parent_ob= j, Pcf8563State),
+        VMSTATE_UINT8(read_index, P= cf8563State),
+        VMSTATE_UINT8(write_index, = Pcf8563State),
+        VMSTATE_UINT8(reg_addr, Pcf= 8563State),
+        VMSTATE_UINT8(cs1, Pcf8563S= tate),
+        VMSTATE_UINT8(cs2, Pcf8563S= tate),
+        VMSTATE_UINT8(vls, Pcf8563S= tate),
+        VMSTATE_UINT8(minutes, Pcf8= 563State),
+        VMSTATE_UINT8(hours, Pcf856= 3State),
+        VMSTATE_UINT8(days, Pcf8563= State),
+        VMSTATE_UINT8(weekdays, Pcf= 8563State),
+        VMSTATE_UINT8(centure_month= s, Pcf8563State),
+        VMSTATE_UINT8(years, Pcf856= 3State),
+        VMSTATE_UINT8(minute_a, Pcf= 8563State),
+        VMSTATE_UINT8(hour_a, Pcf85= 63State),
+        VMSTATE_UINT8(day_a, Pcf856= 3State),
+        VMSTATE_UINT8(weekday_a, Pc= f8563State),
+        VMSTATE_UINT8(clkout_ctl, P= cf8563State),
+        VMSTATE_UINT8(timer_ctl, Pc= f8563State),
+        VMSTATE_UINT8(timer_cnt, Pc= f8563State),
+        VMSTATE_TIMER_PTR(timer, Pc= f8563State),
+        VMSTATE_TIMER_PTR(irq_gen_t= imer, Pcf8563State),
+        VMSTATE_TIMER_PTR(alarm_tim= er, Pcf8563State),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void pcf8563_init(Object *obj)
+{
+    I2CSlave *i2c =3D I2C_SLAVE(obj);
+    Pcf8563State *s =3D PCF8563(obj);
+
+    s->alarm_timer =3D timer_new_ns(rtc_clock, &= alarm_timer_cb, s);
+    s->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, &a= mp;timer_cb, s);
+    s->irq_gen_timer =3D timer_new_ns(QEMU_CLOCK_VIR= TUAL, &irq_gen_timer_cb, s);
+
+    qdev_init_gpio_out(DEVICE(s), &s->irq, 1); +
+    pcf8563_reset(i2c);
+
+    trace_pcf8563_rtc_init();
+
+    s->reg_addr =3D 0x09;
+    pcf8563_write(s, 0x81);
+    set_alarm(s);
+}
+
+static void pcf8563_reset_hold(Object *obj, ResetType type)
+{
+    I2CSlave *i2c =3D I2C_SLAVE(obj);
+    pcf8563_reset(i2c);
+}
+
+static void pcf8563_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc =3D DEVICE_CLASS(klass);
+    I2CSlaveClass *k =3D I2C_SLAVE_CLASS(klass);
+    ResettableClass *rc =3D RESETTABLE_CLASS(klass); +
+    k->event =3D pcf8563_event;
+    k->recv =3D pcf8563_rx;
+    k->send =3D pcf8563_tx;
+    dc->vmsd =3D &vmstate_pcf8563;
+    rc->phases.hold =3D pcf8563_reset_hold;
+}
+
+static const TypeInfo pcf8563_register_types[] =3D {
+    {
+        .name   &nbs= p;      =3D TYPE_PCF8563,
+        .parent   &n= bsp;    =3D TYPE_I2C_SLAVE,
+        .instance_size =3D sizeof(P= cf8563State),
+        .instance_init =3D pcf8563_= init,
+        .class_init  &nbs= p; =3D pcf8563_class_init,
+    },
+};
+
+DEFINE_TYPES(pcf8563_register_types)
diff --git a/hw/rtc/trace-events b/hw/rtc/trace-events
index 743ff775d4..17c524d61d 100644
--- a/hw/rtc/trace-events
+++ b/hw/rtc/trace-events
@@ -43,3 +43,15 @@ stm32_rtc_arm_ointr(uint64_t tocks, uint64_t nsecs) = "overflow interrupt in %" PR
 stm32_rtc_arm_aintr(uint64_t tocks, uint64_t nsecs) "alarm inter= rupt in %" PRIu64 " ticks, %" PRIu64" nsecs"
 stm32_rtc_read(uint64_t addr, uint64_t value, uint32_t size) "ad= dr 0x%02" PRIx64 " value 0x%08" PRIx64" size %u"  stm32_rtc_write(uint64_t addr, uint64_t value, uint32_t size) "a= ddr 0x%02" PRIx64 " value 0x%08" PRIx64" size %u"<= br> +
+# pcf8563_rtc.c
+pcf8563_rtc_write_data(uint8_t data) "data: 0x%x"
+pcf8563_rtc_write_addr(uint8_t addr) "register address: 0x%x"= ;
+pcf8563_rtc_read(uint8_t addr, uint8_t data) "addr: 0x%x, data: 0= x%x"
+pcf8563_rtc_event(uint8_t event) "Event: 0x%x"
+pcf8563_rtc_init(void)
+pcf8563_rtc_reset(void)
+pcf8563_rtc_set_time(void)
+pcf8563_rtc_get_time(void)
+pcf8563_rtc_set_alarm(void)
+pcf8563_rtc_capture_time(void)
--
2.34.1

--_000_342e4188176e4ce18ada13cbaf3c7e86yadrocom_--