From nobody Tue Feb 10 20:30:20 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1dmarc=pass fromdomain=outlook.com); dmarc=pass(p=none dis=none) header.from=outlook.com ARC-Seal: i=2; a=rsa-sha256; t=1601726693; cv=pass; d=zohomail.com; s=zohoarc; b=KbvSJmxZZsTlgCuokLJ0pxkT/U0cf0JrXVcLKD3/J9TOR9C88oyzzueJZaT2t00cKVv2tL8CB6fVElTYyMviY0EVbWhtulctlVQgWLpz2T2ACylQvT+2doIK3v/noO9oYnpXL/mkse8EmynzdvBBoji+/ri3fXUOctTxvDcOhfg= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601726693; h=Content-Type:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=4TRSWADUkEx5vOgnxW8xV7Q71Cj+PxCAZTsLHFt50+s=; b=mlEEm4cJS+Gp4ZZL80sMW/GZQISaqRWHGO6jPTFlbrF2Y3LQzblPg/8sK9wKp6BZfgpX2spQUNN+AY8ON0YqUElxiPbXWwTLzOGa5irqbgA2HCT7Q6QzQnOY50shNZ6wE9ufZ4OcoxWHp+XhKCEy+9Pcx5rVvvd6NBZZenxqk4w= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1dmarc=pass fromdomain=outlook.com); dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601726693181295.35075846580014; Sat, 3 Oct 2020 05:04:53 -0700 (PDT) Received: from localhost ([::1]:41542 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kOgHT-00024N-Ex for importer@patchew.org; Sat, 03 Oct 2020 08:04:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58296) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kOgGV-0001c6-AF for qemu-devel@nongnu.org; Sat, 03 Oct 2020 08:03:51 -0400 Received: from mail-dm6nam12olkn2090.outbound.protection.outlook.com ([40.92.22.90]:44545 helo=NAM12-DM6-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kOgGS-0007UU-Gw for qemu-devel@nongnu.org; Sat, 03 Oct 2020 08:03:50 -0400 Received: from DM6NAM12FT004.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc64::4e) by DM6NAM12HT097.eop-nam12.prod.protection.outlook.com (2a01:111:e400:fc64::249) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.14; Sat, 3 Oct 2020 12:03:41 +0000 Received: from DM6PR16MB2473.namprd16.prod.outlook.com (2a01:111:e400:fc64::4b) by DM6NAM12FT004.mail.protection.outlook.com (2a01:111:e400:fc64::154) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3455.13 via Frontend Transport; Sat, 3 Oct 2020 12:03:41 +0000 Received: from DM6PR16MB2473.namprd16.prod.outlook.com ([fe80::ec2c:246a:b4d4:48b1]) by DM6PR16MB2473.namprd16.prod.outlook.com ([fe80::ec2c:246a:b4d4:48b1%3]) with mapi id 15.20.3433.039; Sat, 3 Oct 2020 12:03:41 +0000 Received: from [121.168.203.43] (121.168.203.43) by SL2P216CA0058.KORP216.PROD.OUTLOOK.COM (2603:1096:100:19::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.34 via Frontend Transport; Sat, 3 Oct 2020 12:03:39 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ItsBXbNB2UrEsKvNvIXI81RZ0BEkTdvoQ9iIbG42ae5Zs0yDucRxkCu7CJspKUWYHYPXhkqGuDWCEQH8VL/jjtlBu2EYm+x6IJqN4bonczO1fWTpOzYKIRrijweLA7ml6OmWkM3kBjIzok3ouZ4Dt39JbttGQe8hvTwgCR7+WTliDaBFAk0uRge70kMTldOxJF9WUEoI3cg4Emtn/gtaQ0w2kvuw4zx5BdXGN5sAMwe1L5lBk3xftC/JeYU4loNP+MgY8JLNvfq2yeW4GIgQo/26xSvGi0uRJi1t5JOfiAdD8dfhhKsoaLhHsotnNbyyDYQhDgPPhkXEYNpwGnOS5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4TRSWADUkEx5vOgnxW8xV7Q71Cj+PxCAZTsLHFt50+s=; b=MFFwXpCT9Pdlopl8XP/tQEwYe2+ODnLcEobT/b6KeQF392PoPgo6e1W+hP49etaOmS1q/642XYwh+CteFwXtm4IxspuU4lbdiQe6vOLHSolJabrbHqLMG712Un3lxFuTEpfBLCfuG0kWhf89vrrDhI+R3WwDCJ7uY7srAFd0SGQOj6nmVYeLewag0QIHoudREBbUJ+4BLxJop7HKty+UVMN56hxTczOq7o1uQ8/SodDDoYpywOAh0spewS0/squZsEB5FNZ/VEEh1k7f/toN+5wZm4vXx80WDDmiJR5gBPhFQ6QqSNO8b3hj53l3Eyt6gz1xtq84u/a7DwqLLaSW8g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4TRSWADUkEx5vOgnxW8xV7Q71Cj+PxCAZTsLHFt50+s=; b=dTl1dZQah+2EMePOB8k2lxR4/tfuPDP0nd2WKBkbcnCkQ8UaHrYub2IMM4z8YstpswfA2HOe9kyG9595yduSm6Sgm+PU6lum7plh5X9VCQxvZxcbLDi6AD7GVszKkuNbUo8FRwWQBUaYwNHFytOeoSe1J9vokNvw3e2wKRwg4PV+qcusl+eZmetnK0kEd2r/qnmMJkMz85QvaNgtl4TWoG74CBsFKARcD3yGAIrMIfxGarDFkLfbdDaYGXWTxNL0JKcwqw7zd9dF3FQWO0BrnDpLuu3i5J7g49NT9LoNanhQqzN6p+eZNT9NPHDxklrZaSR89S8knHvB8wZZ4KBnkw== X-IncomingTopHeaderMarker: OriginalChecksum:716AD8A1C4964077F17D7828D4E87D41745885A53F2D2B9C0F550E5FBFBEC022; UpperCasedChecksum:0B9E0A52313B33C3611EEFE81A426A67CC25C3DE3F9D53877A36A6A93D859199; SizeAsReceived:8562; Count:44 To: qemu-devel@nongnu.org, S.E.Harris@kent.ac.uk, mrolnik@gmail.com, heecheol.yang@outlook.com From: Heecheol Yang Subject: [PATCH v3] hw/avr: Add limited support for avr gpio registers Message-ID: Date: Sat, 3 Oct 2020 21:03:35 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 Content-Type: multipart/alternative; boundary="------------019145E12CE2D065CBF1DE0C" Content-Language: en-US X-TMN: [vCvDOety6a4IbRrRom76KDjM8xdp/Li/] X-ClientProxiedBy: SL2P216CA0058.KORP216.PROD.OUTLOOK.COM (2603:1096:100:19::20) To DM6PR16MB2473.namprd16.prod.outlook.com (2603:10b6:5:6e::28) X-Microsoft-Original-Message-ID: <0e59c0ff-432e-85a3-c000-21dd64f74e72@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 44 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: acdfe715-70b3-45f8-bc14-08d867945e47 X-MS-Exchange-SLBlob-MailProps: =?utf-8?B?S0U1eXd1T2FONWo1Tm4vVllicXE4NDJKUjRwMDgzbW5yU0I1UWJNbjhVd2hH?= =?utf-8?B?WDRrV093TVlqY1pYTStBNEVnSk5iM3NXVkZBWDF2YWU1QXVBRndpdUR5VUY3?= =?utf-8?B?YS9NWUhJUmdNY3NSMHRhZEpZWG9CY2k4MVdmUUl6SWhDb0lERk8xdm1oVkdC?= =?utf-8?B?elVWaG90RjFKamVMSWJ1UkpITXdML1pqQUo2dlhleFF4SStCaWtMSGdEdlNs?= =?utf-8?B?TFZkQ2dBUDZ3WkRPOUdMelV5WFpEMWhuU0NhMlBLdi9DbjAydEVPMk1nT2Yr?= =?utf-8?B?VW9NTTRwZG9CM2hHbHdmaHhsZGJSOXo1RENjZ2k3eTYwSkVhNHZwOUl4YlEv?= =?utf-8?B?NG5xMzZiYnJmTFI4ZkQvVElKcVVXZURHK20wZVljdWpaZmpvMW5ZQTV5QTlT?= =?utf-8?B?SU95T3EvOFAxaUF4MDlTbitHTHJUdW1sOW1lb2lCd0pQbFlCYThYSnlUdjg0?= =?utf-8?B?V0IydlZTSGdVdm5nN29GZU5mZGhsemxRRHR2eU9JNFBjV040blo5UHl6SzRx?= =?utf-8?B?Qnh4Rjd0ZlA0NkNRZ0lXN1BuQUI0c1l2VnRKaEUxWTFSMk1UWXNyeTdyNGV6?= =?utf-8?B?aXY3SlJJejBzNlhUakFvWEpKYWs4RElXR1pZZ04vZ1ByakMyYjh4OUFTMEdy?= =?utf-8?B?Y25vL3FHRHR2RzA3MnRNckZDdkxSd2cwWDBXV3VlWGtwNm1TTzhJZDFDUG8x?= =?utf-8?B?dUd6S09Rc3FLOU54OWk3SnZzZU9HbHhTdzh3aGV4WFhGK3UyL2RtYTlJNkpO?= =?utf-8?B?NzlkT2dRNGs1cEpFcEJmbWdoTFNFSm9CbHNjbS85cEFpVCtQNUYzL0hZL1FM?= =?utf-8?B?b2FzR0ExYzRFcCtER09UM002YTRha3cwZ1BDNitTRUZPR25VcEhIaUw2NThZ?= =?utf-8?B?UnJRMXRFVy96MVFVSkRiRGlZeGQxcVlyV1R0d0pSY1V5LzRwZi9zQm84NkZi?= =?utf-8?B?VHRyQnl3UVZVeDRnd1oyNmJXWFovcXBkMXRwMDd3ZHBPTmZTOXdZK3RUWldz?= =?utf-8?B?cVF2djRBdUF3Y1M2dEU3b2txZERLWjhscnNjNGpoSEF6bTNwdTJodi9OYmhj?= =?utf-8?B?SmFVTisvQjg4a1FlY0lIQVY3SW5BV09zbVFEcGtYbTJiTkVzVHo2blFockV4?= =?utf-8?B?RmpCdVRXNUtBN1dYVEMrdExJZXcvcGhlRmhMcHphZnRkcWYvbnBEOGF1MWFu?= =?utf-8?B?cFZCU2dKdVZOUjZQYWdId3FNbllyZnNVYXlwQWFxemVPR1JEcVRIREM4Nmdh?= =?utf-8?Q?PqPO+DXiJezQn3vdFME0sbQEb2j9scri35GpumeRCvfU/WU?= X-MS-TrafficTypeDiagnostic: DM6NAM12HT097: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: cex+TzU9KLSHIiqaHxC9Xlz0n04ZeIYCLJOvck0Qk9X4twuyf3rhL5vsiSecZMzRQ1e3r4n//pxPctcTGXjI3oLhXp9Im9KEhOEI5/Vd8k0VCz0kq0zGc0BfZtGEpV23w8Hz/ci4uqYb7EqwX7c2qsKv9bO2qpELhk/7KZXGolazIp3nzJN1/rPjnEvC+Q+JvyCOjfFENPhUeeUzqvCL9nMIQXEfSXHJbGf34ad0G+Bfnleu/Se8h1m3DnAJLtkR X-MS-Exchange-AntiSpam-MessageData: AODiyOWsJw5rY/OdeP6HH9ZU2wBybnbemCMoyX6pMapbqtyRLMObx4cwNXzbLQbiZrOsshe12KjYWAg9R6S7tn7dq8sVBPUIAQcqVxTBeJTNHLDkJl9SpG+5b9ta2GhOGxJPSCVk14FeN1FkBWY6nA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: acdfe715-70b3-45f8-bc14-08d867945e47 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Oct 2020 12:03:41.6650 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: DM6NAM12FT004.eop-nam12.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6NAM12HT097 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=40.92.22.90; envelope-from=heecheol.yang@outlook.com; helo=NAM12-DM6-obe.outbound.protection.outlook.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/03 08:03:46 X-ACL-Warn: Detected OS = Windows NT kernel [generic] [fuzzy] X-Spam_score_int: 2 X-Spam_score: 0.2 X-Spam_bar: / X-Spam_report: (0.2 / 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, FORGED_MUA_MOZILLA=2.309, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, MSGID_FROM_MTA_HEADER=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @outlook.com) --------------019145E12CE2D065CBF1DE0C Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 I am very sorry for your inconvenience. This is 3rd version of the patch=20 for what I did. I should have read the contribution guide again and again. I am very=20 sorry again. The contents of the patch is the same with the v2. This mail is just for=20 patchew and making a new thread. Here are what I changed from the v1: * Remove unnecessary header inclusions * Replace codes for unreachable conditions with g_assert_not_reached() function * Remove 'enable' field from AVRGPIOState structure: It is actually unnecessary. I copied this field from AVRUSARTState structure. Thanks a lot! With best regards Heecheol Yang. Add some of these features for avr gpio: =C2=A0 - GPIO I/O : PORTx registers =C2=A0 - Data Direction : DDRx registers Following things are not supported yet: =C2=A0 - PINx registers =C2=A0 - MCUR registers =C2=A0 - Even though read/write for DDRx registers are =C2=A0=C2=A0=C2=A0 implemented, actual direction controls are not =C2=A0=C2=A0=C2=A0 supported yet. Signed-off-by: Heecheol Yang --- =C2=A0hw/avr/Kconfig=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0 1 + =C2=A0hw/avr/atmega.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0=C2=A0 7 ++- =C2=A0hw/avr/atmega.h=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0=C2=A0 2 + =C2=A0hw/gpio/Kconfig=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 |=C2=A0=C2=A0 3 + =C2=A0hw/gpio/avr_gpio.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |= 112 +++++++++++++++++++++++++++++++++++++ =C2=A0hw/gpio/meson.build=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2= =A0=C2=A0 2 + =C2=A0include/hw/gpio/avr_gpio.h |=C2=A0 46 +++++++++++++++ =C2=A07 files changed, 171 insertions(+), 2 deletions(-) =C2=A0create mode 100644 hw/gpio/avr_gpio.c =C2=A0create mode 100644 include/hw/gpio/avr_gpio.h diff --git a/hw/avr/Kconfig b/hw/avr/Kconfig index d31298c3cc..16a57ced11 100644 --- a/hw/avr/Kconfig +++ b/hw/avr/Kconfig @@ -3,6 +3,7 @@ config AVR_ATMEGA_MCU =C2=A0=C2=A0=C2=A0=C2=A0 select AVR_TIMER16 =C2=A0=C2=A0=C2=A0=C2=A0 select AVR_USART =C2=A0=C2=A0=C2=A0=C2=A0 select AVR_POWER +=C2=A0=C2=A0=C2=A0 select AVR_GPIO =C2=A0config ARDUINO =C2=A0=C2=A0=C2=A0=C2=A0 select AVR_ATMEGA_MCU diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c index 44c6afebbb..ad942028fd 100644 --- a/hw/avr/atmega.c +++ b/hw/avr/atmega.c @@ -283,8 +283,11 @@ static void atmega_realize(DeviceState *dev, Error=20 **errp) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 c= ontinue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 devname =3D g_strdup_prin= tf("atmega-gpio-%c", 'a' + (char)i); -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 create_unimplemented_device(dev= name, -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 OFFSET_DATA= + mc->dev[idx].addr, 3); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 object_initialize_child(OBJECT(= dev), devname, &s->gpio[i], +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 TYPE_AVR_GPIO); + sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &error_abort); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 OFFSET_= DATA + mc->dev[idx].addr); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 g_free(devname); =C2=A0=C2=A0=C2=A0=C2=A0 } diff --git a/hw/avr/atmega.h b/hw/avr/atmega.h index a99ee15c7e..e2289d5744 100644 --- a/hw/avr/atmega.h +++ b/hw/avr/atmega.h @@ -13,6 +13,7 @@ =C2=A0#include "hw/char/avr_usart.h" =C2=A0#include "hw/timer/avr_timer16.h" +#include "hw/gpio/avr_gpio.h" =C2=A0#include "hw/misc/avr_power.h" =C2=A0#include "target/avr/cpu.h" =C2=A0#include "qom/object.h" @@ -44,6 +45,7 @@ struct AtmegaMcuState { =C2=A0=C2=A0=C2=A0=C2=A0 DeviceState *io; =C2=A0=C2=A0=C2=A0=C2=A0 AVRMaskState pwr[POWER_MAX]; =C2=A0=C2=A0=C2=A0=C2=A0 AVRUsartState usart[USART_MAX]; +=C2=A0=C2=A0=C2=A0 AVRGPIOState gpio[GPIO_MAX]; =C2=A0=C2=A0=C2=A0=C2=A0 AVRTimer16State timer[TIMER_MAX]; =C2=A0=C2=A0=C2=A0=C2=A0 uint64_t xtal_freq_hz; =C2=A0}; diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig index b6fdaa2586..1752d0ce56 100644 --- a/hw/gpio/Kconfig +++ b/hw/gpio/Kconfig @@ -10,3 +10,6 @@ config GPIO_KEY =C2=A0config SIFIVE_GPIO =C2=A0=C2=A0=C2=A0=C2=A0 bool + +config AVR_GPIO +=C2=A0=C2=A0=C2=A0 bool diff --git a/hw/gpio/avr_gpio.c b/hw/gpio/avr_gpio.c new file mode 100644 index 0000000000..6ca8e8703a --- /dev/null +++ b/hw/gpio/avr_gpio.c @@ -0,0 +1,112 @@ +/* + * AVR processors GPIO registers emulation. + * + * Copyright (C) 2020 Heecheol Yang + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 or + * (at your option) version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.=C2=A0 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "hw/sysbus.h" +#include "hw/irq.h" +#include "hw/gpio/avr_gpio.h" +#include "hw/qdev-properties.h" + +static void avr_gpio_reset(DeviceState *dev) +{ +=C2=A0=C2=A0=C2=A0 AVRGPIOState *gpio =3D AVR_GPIO(dev); +=C2=A0=C2=A0=C2=A0 gpio->ddr_val =3D 0u; +=C2=A0=C2=A0=C2=A0 gpio->port_val =3D 0u; +} +static uint64_t avr_gpio_read(void *opaque, hwaddr offset, unsigned int=20 size) +{ +=C2=A0=C2=A0=C2=A0 AVRGPIOState *s =3D (AVRGPIOState *)opaque; +=C2=A0=C2=A0=C2=A0 switch (offset) { +=C2=A0=C2=A0=C2=A0 case GPIO_PIN: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Not implemented yet */ +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 case GPIO_DDR: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return s->ddr_val; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 case GPIO_PORT: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return s->port_val; +=C2=A0=C2=A0=C2=A0 default: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 g_assert_not_reached(); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0 return 0; +} + +static void avr_gpio_write(void *opaque, hwaddr offset, uint64_t value, +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 unsigned int size) +{ +=C2=A0=C2=A0=C2=A0 AVRGPIOState *s =3D (AVRGPIOState *)opaque; +=C2=A0=C2=A0=C2=A0 switch (offset) { +=C2=A0=C2=A0=C2=A0 case GPIO_PIN: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Not implemented yet */ +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 case GPIO_DDR: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 s->ddr_val =3D value & 0xF; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 case GPIO_PORT: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 s->port_val =3D value & 0xF; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 default: +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 g_assert_not_reached(); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break; +=C2=A0=C2=A0=C2=A0 } +} + +static const MemoryRegionOps avr_gpio_ops =3D { +=C2=A0=C2=A0=C2=A0 .read =3D avr_gpio_read, +=C2=A0=C2=A0=C2=A0 .write =3D avr_gpio_write, +=C2=A0=C2=A0=C2=A0 .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static void avr_gpio_init(Object *obj) +{ +=C2=A0=C2=A0=C2=A0 AVRGPIOState *s =3D AVR_GPIO(obj); +=C2=A0=C2=A0=C2=A0 memory_region_init_io(&s->mmio, obj, &avr_gpio_ops, s,=20 TYPE_AVR_GPIO, 3); +=C2=A0=C2=A0=C2=A0 sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} +static void avr_gpio_realize(DeviceState *dev, Error **errp) +{ +=C2=A0=C2=A0=C2=A0 avr_gpio_reset(dev); +} + + +static void avr_gpio_class_init(ObjectClass *klass, void *data) +{ +=C2=A0=C2=A0=C2=A0 DeviceClass *dc =3D DEVICE_CLASS(klass); + +=C2=A0=C2=A0=C2=A0 dc->reset =3D avr_gpio_reset; +=C2=A0=C2=A0=C2=A0 dc->realize =3D avr_gpio_realize; +} + +static const TypeInfo avr_gpio_info =3D { +=C2=A0=C2=A0=C2=A0 .name=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 =3D TYPE_AVR_GPIO, +=C2=A0=C2=A0=C2=A0 .parent=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D T= YPE_SYS_BUS_DEVICE, +=C2=A0=C2=A0=C2=A0 .instance_size =3D sizeof(AVRGPIOState), +=C2=A0=C2=A0=C2=A0 .instance_init =3D avr_gpio_init, +=C2=A0=C2=A0=C2=A0 .class_init=C2=A0=C2=A0=C2=A0 =3D avr_gpio_class_init, +}; + +static void avr_gpio_register_types(void) +{ +=C2=A0=C2=A0=C2=A0 type_register_static(&avr_gpio_info); +} + +type_init(avr_gpio_register_types) diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build index 86cae9a0f3..258bd5dcfc 100644 --- a/hw/gpio/meson.build +++ b/hw/gpio/meson.build @@ -11,3 +11,5 @@ softmmu_ss.add(when: 'CONFIG_OMAP', if_true:=20 files('omap_gpio.c')) =C2=A0softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_gpio.c'= )) =C2=A0softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_gpi= o.c')) =C2=A0softmmu_ss.add(when: 'CONFIG_SIFIVE_GPIO', if_true:=20 files('sifive_gpio.c')) + +softmmu_ss.add(when: 'CONFIG_AVR_GPIO', if_true: files('avr_gpio.c')) diff --git a/include/hw/gpio/avr_gpio.h b/include/hw/gpio/avr_gpio.h new file mode 100644 index 0000000000..84d783f8fc --- /dev/null +++ b/include/hw/gpio/avr_gpio.h @@ -0,0 +1,46 @@ +/* + * AVR processors GPIO registers definition. + * + * Copyright (C) 2020 Heecheol Yang + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 or + * (at your option) version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.=C2=A0 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#ifndef AVR_GPIO_H +#define AVR_GPIO_H + +#include "hw/sysbus.h" +#include "qom/object.h" + +/* Offsets of registers. */ +#define GPIO_PIN=C2=A0=C2=A0 0x00 +#define GPIO_DDR=C2=A0=C2=A0 0x01 +#define GPIO_PORT=C2=A0 0x02 + +#define TYPE_AVR_GPIO "avr-gpio" +OBJECT_DECLARE_SIMPLE_TYPE(AVRGPIOState, AVR_GPIO) + +struct AVRGPIOState { +=C2=A0=C2=A0=C2=A0 /*< private >*/ +=C2=A0=C2=A0=C2=A0 SysBusDevice parent_obj; + +=C2=A0=C2=A0=C2=A0 /*< public >*/ +=C2=A0=C2=A0=C2=A0 MemoryRegion mmio; + +=C2=A0=C2=A0=C2=A0 uint8_t ddr_val; +=C2=A0=C2=A0=C2=A0 uint8_t port_val; + +}; + +#endif /* AVR_GPIO_H */ --=20 2.17.1 --------------019145E12CE2D065CBF1DE0C Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4 dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8cD4KICAgIDwv cD4KICAgIDxkaXYgY2xhc3M9Im1vei10ZXh0LWh0bWwiIGxhbmc9ImtvIj4KICAgICAgPGRpdiBz dHlsZT0iZm9udC1mYW1pbHk6IEd1bGltLCDqtbTrprwsICZxdW90O05hbnVtIEdvdGhpYyZxdW90 OywKICAgICAgICBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiByZ2IoMCwgMCwg MCk7Ij4KICAgICAgICBJIGFtIHZlcnkgc29ycnkgZm9yIHlvdXIgaW5jb252ZW5pZW5jZS4gVGhp cyBpcyAzcmQgdmVyc2lvbiBvZgogICAgICAgIHRoZSBwYXRjaCBmb3Igd2hhdCBJIGRpZC4mbmJz cDs8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEd1bGltLCDqtbTrprwsICZx dW90O05hbnVtIEdvdGhpYyZxdW90OywKICAgICAgICBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEy cHQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7Ij4KICAgICAgICBJIHNob3VsZCBoYXZlIHJlYWQgdGhl IGNvbnRyaWJ1dGlvbiBndWlkZSBhZ2FpbiBhbmQgYWdhaW4uIEkgYW0KICAgICAgICB2ZXJ5IHNv cnJ5IGFnYWluLjwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogR3VsaW0sIOq1 tOumvCwgJnF1b3Q7TmFudW0gR290aGljJnF1b3Q7LAogICAgICAgIHNhbnMtc2VyaWY7IGZvbnQt c2l6ZTogMTJwdDsgY29sb3I6IHJnYigwLCAwLCAwKTsiPgogICAgICAgIDxicj4KICAgICAgPC9k aXY+CiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBHdWxpbSwg6rW066a8LCAmcXVvdDtO YW51bSBHb3RoaWMmcXVvdDssCiAgICAgICAgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBj b2xvcjogcmdiKDAsIDAsIDApOyI+CiAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoZSBwYXRjaCBp cyB0aGUgc2FtZSB3aXRoIHRoZSB2Mi4gVGhpcyBtYWlsIGlzCiAgICAgICAganVzdCBmb3IgcGF0 Y2hldyBhbmQgbWFraW5nIGEgbmV3IHRocmVhZC48L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iZm9u dC1mYW1pbHk6IEd1bGltLCDqtbTrprwsICZxdW90O05hbnVtIEdvdGhpYyZxdW90OywKICAgICAg ICBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7Ij4KICAg ICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiBHdWxpbSwg6rW0 66a8LCAmcXVvdDtOYW51bQogICAgICAgICAgR290aGljJnF1b3Q7LCBzYW5zLXNlcmlmIj4KICAg ICAgICAgIEhlcmUgYXJlIHdoYXQgSSBjaGFuZ2VkIGZyb20gdGhlIHYxOjwvZGl2PgogICAgICAg IDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6IEd1bGltLCDqtbTrprws ICZxdW90O05hbnVtCiAgICAgICAgICBHb3RoaWMmcXVvdDssIHNhbnMtc2VyaWYiPgogICAgICAg ICAgPHVsPgogICAgICAgICAgICA8bGk+UmVtb3ZlIHVubmVjZXNzYXJ5IGhlYWRlciBpbmNsdXNp b25zPC9saT4KICAgICAgICAgICAgPGxpPlJlcGxhY2UgY29kZXMgZm9yIHVucmVhY2hhYmxlIGNv bmRpdGlvbnMgd2l0aAogICAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgZnVuY3Rp b248L2xpPgogICAgICAgICAgICA8bGk+UmVtb3ZlICdlbmFibGUnIGZpZWxkIGZyb20gQVZSR1BJ T1N0YXRlIHN0cnVjdHVyZTogSXQgaXMKICAgICAgICAgICAgICBhY3R1YWxseSB1bm5lY2Vzc2Fy eS4gSSBjb3BpZWQgdGhpcyBmaWVsZCBmcm9tCiAgICAgICAgICAgICAgQVZSVVNBUlRTdGF0ZSBz dHJ1Y3R1cmUuPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGJy PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEd1bGltLCDqtbTr prwsICZxdW90O05hbnVtIEdvdGhpYyZxdW90OywKICAgICAgICBzYW5zLXNlcmlmOyBmb250LXNp emU6IDEycHQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7Ij4KICAgICAgICBUaGFua3MgYSBsb3QhPC9k aXY+CiAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBHdWxpbSwg6rW066a8LCAmcXVvdDtO YW51bSBHb3RoaWMmcXVvdDssCiAgICAgICAgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBj b2xvcjogcmdiKDAsIDAsIDApOyI+CiAgICAgICAgV2l0aCBiZXN0IHJlZ2FyZHM8L2Rpdj4KICAg ICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEd1bGltLCDqtbTrprwsICZxdW90O05hbnVtIEdv dGhpYyZxdW90OywKICAgICAgICBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IGNvbG9yOiBy Z2IoMCwgMCwgMCk7Ij4KICAgICAgICBIZWVjaGVvbCBZYW5nLjwvZGl2PgogICAgICA8ZGl2IHN0 eWxlPSJmb250LWZhbWlseTogR3VsaW0sIOq1tOumvCwgJnF1b3Q7TmFudW0gR290aGljJnF1b3Q7 LAogICAgICAgIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHJnYigwLCAwLCAw KTsiPgogICAgICAgIDxicj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPGRpdiBj bGFzcz0iQm9keUZyYWdtZW50Ij48Zm9udCBzaXplPSIyIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjExcHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlBsYWluVGV4dCI+QWRkIHNvbWUgb2Yg dGhlc2UgZmVhdHVyZXMgZm9yIGF2cgogICAgICAgICAgICAgICAgZ3Bpbzo8YnI+CiAgICAgICAg ICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDsgLSBHUElPIEkvTyA6IFBPUlR4IHJl Z2lzdGVyczxicj4KICAgICAgICAgICAgICAgICZuYnNwOyAtIERhdGEgRGlyZWN0aW9uIDogRERS eCByZWdpc3RlcnM8YnI+CiAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICBGb2xs b3dpbmcgdGhpbmdzIGFyZSBub3Qgc3VwcG9ydGVkIHlldDo8YnI+CiAgICAgICAgICAgICAgICAm bmJzcDsgLSBQSU54IHJlZ2lzdGVyczxicj4KICAgICAgICAgICAgICAgICZuYnNwOyAtIE1DVVIg cmVnaXN0ZXJzPGJyPgogICAgICAgICAgICAgICAgJm5ic3A7IC0gRXZlbiB0aG91Z2ggcmVhZC93 cml0ZSBmb3IgRERSeCByZWdpc3RlcnMgYXJlPGJyPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5i c3A7Jm5ic3A7IGltcGxlbWVudGVkLCBhY3R1YWwgZGlyZWN0aW9uIGNvbnRyb2xzIGFyZSBub3Q8 YnI+CiAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3VwcG9ydGVkIHlldC48YnI+ CiAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICBTaWduZWQtb2ZmLWJ5OiBIZWVj aGVvbCBZYW5nCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZF IiBocmVmPSJtYWlsdG86aGVlY2hlb2wueWFuZ0BvdXRsb29rLmNvbSI+Jmx0O2hlZWNoZW9sLnlh bmdAb3V0bG9vay5jb20mZ3Q7PC9hPjxicj4KICAgICAgICAgICAgICAgIC0tLTxicj4KICAgICAg ICAgICAgICAgICZuYnNwO2h3L2F2ci9LY29uZmlnJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHwmbmJzcDsmbmJz cDsgMSArPGJyPgogICAgICAgICAgICAgICAgJm5ic3A7aHcvYXZyL2F0bWVnYS5jJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IHwmbmJzcDsmbmJzcDsgNyArKy08YnI+CiAgICAgICAgICAgICAgICAmbmJzcDtody9hdnIvYXRt ZWdhLmgmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgfCZuYnNwOyZuYnNwOyAyICs8YnI+CiAgICAgICAgICAgICAgICAmbmJz cDtody9ncGlvL0tjb25maWcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfCZuYnNwOyZuYnNwOyAzICs8YnI+CiAgICAgICAg ICAgICAgICAmbmJzcDtody9ncGlvL2F2cl9ncGlvLmMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfCAxMTIKICAgICAgICAgICAgICAgICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKys8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDtody9n cGlvL21lc29uLmJ1aWxkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IHwmbmJzcDsmbmJzcDsgMiArPGJyPgogICAgICAgICAgICAgICAgJm5ic3A7aW5jbHVkZS9ody9n cGlvL2F2cl9ncGlvLmggfCZuYnNwOyA0NiArKysrKysrKysrKysrKys8YnI+CiAgICAgICAgICAg ICAgICAmbmJzcDs3IGZpbGVzIGNoYW5nZWQsIDE3MSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9u cygtKTxicj4KICAgICAgICAgICAgICAgICZuYnNwO2NyZWF0ZSBtb2RlIDEwMDY0NCBody9ncGlv L2F2cl9ncGlvLmM8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDtjcmVhdGUgbW9kZSAxMDA2NDQg aW5jbHVkZS9ody9ncGlvL2F2cl9ncGlvLmg8YnI+CiAgICAgICAgICAgICAgICA8YnI+CiAgICAg ICAgICAgICAgICBkaWZmIC0tZ2l0IGEvaHcvYXZyL0tjb25maWcgYi9ody9hdnIvS2NvbmZpZzxi cj4KICAgICAgICAgICAgICAgIGluZGV4IGQzMTI5OGMzY2MuLjE2YTU3Y2VkMTEgMTAwNjQ0PGJy PgogICAgICAgICAgICAgICAgLS0tIGEvaHcvYXZyL0tjb25maWc8YnI+CiAgICAgICAgICAgICAg ICArKysgYi9ody9hdnIvS2NvbmZpZzxicj4KICAgICAgICAgICAgICAgIEBAIC0zLDYgKzMsNyBA QCBjb25maWcgQVZSX0FUTUVHQV9NQ1U8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgc2VsZWN0IEFWUl9USU1FUjE2PGJyPgogICAgICAgICAgICAgICAgJm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNlbGVjdCBBVlJfVVNBUlQ8YnI+CiAgICAgICAgICAgICAgICAm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2VsZWN0IEFWUl9QT1dFUjxicj4KICAgICAgICAgICAg ICAgICsmbmJzcDsmbmJzcDsmbmJzcDsgc2VsZWN0IEFWUl9HUElPPGJyPgogICAgICAgICAgICAg ICAgJm5ic3A7PGJyPgogICAgICAgICAgICAgICAgJm5ic3A7Y29uZmlnIEFSRFVJTk88YnI+CiAg ICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2VsZWN0IEFWUl9BVE1FR0Ff TUNVPGJyPgogICAgICAgICAgICAgICAgZGlmZiAtLWdpdCBhL2h3L2F2ci9hdG1lZ2EuYyBiL2h3 L2F2ci9hdG1lZ2EuYzxicj4KICAgICAgICAgICAgICAgIGluZGV4IDQ0YzZhZmViYmIuLmFkOTQy MDI4ZmQgMTAwNjQ0PGJyPgogICAgICAgICAgICAgICAgLS0tIGEvaHcvYXZyL2F0bWVnYS5jPGJy PgogICAgICAgICAgICAgICAgKysrIGIvaHcvYXZyL2F0bWVnYS5jPGJyPgogICAgICAgICAgICAg ICAgQEAgLTI4Myw4ICsyODMsMTEgQEAgc3RhdGljIHZvaWQKICAgICAgICAgICAgICAgIGF0bWVn YV9yZWFsaXplKERldmljZVN0YXRlICpkZXYsIEVycm9yICoqZXJycCk8YnI+CiAgICAgICAgICAg ICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgY29udGludWU7PGJyPgogICAgICAgICAgICAgICAgJm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAgICAgICAg ICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg ZGV2bmFtZSA9IGdfc3RyZHVwX3ByaW50ZigmcXVvdDthdG1lZ2EtZ3Bpby0lYyZxdW90OywgJ2En CiAgICAgICAgICAgICAgICArIChjaGFyKWkpOzxicj4KICAgICAgICAgICAgICAgIC0mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3JlYXRlX3VuaW1wbGVtZW50ZWRf ZGV2aWNlKGRldm5hbWUsPGJyPgogICAgICAgICAgICAgICAgLSZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyBPRkZTRVRfREFUQSArCiAgICAgICAgICAgICAgICBtYy0mZ3Q7 ZGV2W2lkeF0uYWRkciwgMyk7PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBvYmplY3RfaW5pdGlhbGl6ZV9jaGlsZChPQkpFQ1Qo ZGV2KSwgZGV2bmFtZSwKICAgICAgICAgICAgICAgICZhbXA7cy0mZ3Q7Z3Bpb1tpXSw8YnI+CiAg ICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRZUEVfQVZSX0dQSU8pOzxicj4KICAgICAg ICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKICAg ICAgICAgICAgICAgIHN5c2J1c19yZWFsaXplKFNZU19CVVNfREVWSUNFKCZhbXA7cy0mZ3Q7Z3Bp b1tpXSksCiAgICAgICAgICAgICAgICAmYW1wO2Vycm9yX2Fib3J0KTs8YnI+CiAgICAgICAgICAg ICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CiAgICAgICAg ICAgICAgICBzeXNidXNfbW1pb19tYXAoU1lTX0JVU19ERVZJQ0UoJmFtcDtzLSZndDtncGlvW2ld KSwgMCw8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IE9GRlNFVF9EQVRBICsgbWMtJmd0 O2RldltpZHhdLmFkZHIpOzxicj4KICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBnX2ZyZWUoZGV2bmFtZSk7PGJyPgogICAgICAg ICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAgICAgICAgICAgICAgICAm bmJzcDs8YnI+CiAgICAgICAgICAgICAgICBkaWZmIC0tZ2l0IGEvaHcvYXZyL2F0bWVnYS5oIGIv aHcvYXZyL2F0bWVnYS5oPGJyPgogICAgICAgICAgICAgICAgaW5kZXggYTk5ZWUxNWM3ZS4uZTIy ODlkNTc0NCAxMDA2NDQ8YnI+CiAgICAgICAgICAgICAgICAtLS0gYS9ody9hdnIvYXRtZWdhLmg8 YnI+CiAgICAgICAgICAgICAgICArKysgYi9ody9hdnIvYXRtZWdhLmg8YnI+CiAgICAgICAgICAg ICAgICBAQCAtMTMsNiArMTMsNyBAQDxicj4KICAgICAgICAgICAgICAgICZuYnNwOzxicj4KICAg ICAgICAgICAgICAgICZuYnNwOyNpbmNsdWRlICZxdW90O2h3L2NoYXIvYXZyX3VzYXJ0LmgmcXVv dDs8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDsjaW5jbHVkZSAmcXVvdDtody90aW1lci9hdnJf dGltZXIxNi5oJnF1b3Q7PGJyPgogICAgICAgICAgICAgICAgKyNpbmNsdWRlICZxdW90O2h3L2dw aW8vYXZyX2dwaW8uaCZxdW90Ozxicj4KICAgICAgICAgICAgICAgICZuYnNwOyNpbmNsdWRlICZx dW90O2h3L21pc2MvYXZyX3Bvd2VyLmgmcXVvdDs8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDsj aW5jbHVkZSAmcXVvdDt0YXJnZXQvYXZyL2NwdS5oJnF1b3Q7PGJyPgogICAgICAgICAgICAgICAg Jm5ic3A7I2luY2x1ZGUgJnF1b3Q7cW9tL29iamVjdC5oJnF1b3Q7PGJyPgogICAgICAgICAgICAg ICAgQEAgLTQ0LDYgKzQ1LDcgQEAgc3RydWN0IEF0bWVnYU1jdVN0YXRlIHs8YnI+CiAgICAgICAg ICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRGV2aWNlU3RhdGUgKmlvOzxicj4KICAg ICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBBVlJNYXNrU3RhdGUgcHdyW1BP V0VSX01BWF07PGJyPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEFW UlVzYXJ0U3RhdGUgdXNhcnRbVVNBUlRfTUFYXTs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7 Jm5ic3A7Jm5ic3A7IEFWUkdQSU9TdGF0ZSBncGlvW0dQSU9fTUFYXTs8YnI+CiAgICAgICAgICAg ICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQVZSVGltZXIxNlN0YXRlIHRpbWVyW1RJTUVS X01BWF07PGJyPgogICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHVpbnQ2 NF90IHh0YWxfZnJlcV9oejs8YnI+CiAgICAgICAgICAgICAgICAmbmJzcDt9Ozxicj4KICAgICAg ICAgICAgICAgIGRpZmYgLS1naXQgYS9ody9ncGlvL0tjb25maWcgYi9ody9ncGlvL0tjb25maWc8 YnI+CiAgICAgICAgICAgICAgICBpbmRleCBiNmZkYWEyNTg2Li4xNzUyZDBjZTU2IDEwMDY0NDxi cj4KICAgICAgICAgICAgICAgIC0tLSBhL2h3L2dwaW8vS2NvbmZpZzxicj4KICAgICAgICAgICAg ICAgICsrKyBiL2h3L2dwaW8vS2NvbmZpZzxicj4KICAgICAgICAgICAgICAgIEBAIC0xMCwzICsx MCw2IEBAIGNvbmZpZyBHUElPX0tFWTxicj4KICAgICAgICAgICAgICAgICZuYnNwOzxicj4KICAg ICAgICAgICAgICAgICZuYnNwO2NvbmZpZyBTSUZJVkVfR1BJTzxicj4KICAgICAgICAgICAgICAg ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBib29sPGJyPgogICAgICAgICAgICAgICAgKzxicj4K ICAgICAgICAgICAgICAgICtjb25maWcgQVZSX0dQSU88YnI+CiAgICAgICAgICAgICAgICArJm5i c3A7Jm5ic3A7Jm5ic3A7IGJvb2w8YnI+CiAgICAgICAgICAgICAgICBkaWZmIC0tZ2l0IGEvaHcv Z3Bpby9hdnJfZ3Bpby5jIGIvaHcvZ3Bpby9hdnJfZ3Bpby5jPGJyPgogICAgICAgICAgICAgICAg bmV3IGZpbGUgbW9kZSAxMDA2NDQ8YnI+CiAgICAgICAgICAgICAgICBpbmRleCAwMDAwMDAwMDAw Li42Y2E4ZTg3MDNhPGJyPgogICAgICAgICAgICAgICAgLS0tIC9kZXYvbnVsbDxicj4KICAgICAg ICAgICAgICAgICsrKyBiL2h3L2dwaW8vYXZyX2dwaW8uYzxicj4KICAgICAgICAgICAgICAgIEBA IC0wLDAgKzEsMTEyIEBAPGJyPgogICAgICAgICAgICAgICAgKy8qPGJyPgogICAgICAgICAgICAg ICAgKyAqIEFWUiBwcm9jZXNzb3JzIEdQSU8gcmVnaXN0ZXJzIGVtdWxhdGlvbi48YnI+CiAgICAg ICAgICAgICAgICArICo8YnI+CiAgICAgICAgICAgICAgICArICogQ29weXJpZ2h0IChDKSAyMDIw IEhlZWNoZW9sIFlhbmcKICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJtb3otdHh0LWxpbmstcmZj MjM5NkUiIGhyZWY9Im1haWx0bzpoZWVjaGVvbC55YW5nQG91dGxvb2suY29tIj4mbHQ7aGVlY2hl b2wueWFuZ0BvdXRsb29rLmNvbSZndDs8L2E+PGJyPgogICAgICAgICAgICAgICAgKyAqPGJyPgog ICAgICAgICAgICAgICAgKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZQogICAgICAgICAgICAgICAgaXQgYW5kL29yPGJyPgogICAgICAgICAgICAg ICAgKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YwogICAgICAgICAgICAgICAgTGljZW5zZSBhczxicj4KICAgICAgICAgICAgICAgICsgKiBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICAgICAgICAg ICAgICB2ZXJzaW9uIDIgb3I8YnI+CiAgICAgICAgICAgICAgICArICogKGF0IHlvdXIgb3B0aW9u KSB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UuPGJyPgogICAgICAgICAgICAgICAgKyAqPGJyPgog ICAgICAgICAgICAgICAgKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwKICAgICAgICAgICAgICAgIGJlIHVzZWZ1bCw8YnI+CiAgICAgICAgICAg ICAgICArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQKICAgICAgICAgICAgICAgIHdhcnJhbnR5IG9mPGJyPgogICAgICAgICAgICAgICAgKyAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAgICAgICAgICAgICAg IFBVUlBPU0UuJm5ic3A7IFNlZSB0aGU8YnI+CiAgICAgICAgICAgICAgICArICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy48YnI+CiAgICAgICAgICAgICAgICAr ICo8YnI+CiAgICAgICAgICAgICAgICArICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwKICAgICAgICAgICAgICAgIFB1YmxpYyBMaWNlbnNlIGFsb25n PGJyPgogICAgICAgICAgICAgICAgKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSAm bHQ7PGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyI+aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLzwvYT4mZ3Q7Ljxicj4KICAgICAgICAgICAgICAgICsgKi88YnI+CiAgICAg ICAgICAgICAgICArI2luY2x1ZGUgJnF1b3Q7cWVtdS9vc2RlcC5oJnF1b3Q7PGJyPgogICAgICAg ICAgICAgICAgKyNpbmNsdWRlICZxdW90O3FlbXUvbG9nLmgmcXVvdDs8YnI+CiAgICAgICAgICAg ICAgICArI2luY2x1ZGUgJnF1b3Q7cWVtdS9tb2R1bGUuaCZxdW90Ozxicj4KICAgICAgICAgICAg ICAgICsjaW5jbHVkZSAmcXVvdDtxYXBpL2Vycm9yLmgmcXVvdDs8YnI+CiAgICAgICAgICAgICAg ICArI2luY2x1ZGUgJnF1b3Q7aHcvc3lzYnVzLmgmcXVvdDs8YnI+CiAgICAgICAgICAgICAgICAr I2luY2x1ZGUgJnF1b3Q7aHcvaXJxLmgmcXVvdDs8YnI+CiAgICAgICAgICAgICAgICArI2luY2x1 ZGUgJnF1b3Q7aHcvZ3Bpby9hdnJfZ3Bpby5oJnF1b3Q7PGJyPgogICAgICAgICAgICAgICAgKyNp bmNsdWRlICZxdW90O2h3L3FkZXYtcHJvcGVydGllcy5oJnF1b3Q7PGJyPgogICAgICAgICAgICAg ICAgKzxicj4KICAgICAgICAgICAgICAgICtzdGF0aWMgdm9pZCBhdnJfZ3Bpb19yZXNldChEZXZp Y2VTdGF0ZSAqZGV2KTxicj4KICAgICAgICAgICAgICAgICt7PGJyPgogICAgICAgICAgICAgICAg KyZuYnNwOyZuYnNwOyZuYnNwOyBBVlJHUElPU3RhdGUgKmdwaW8gPSBBVlJfR1BJTyhkZXYpOzxi cj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsgZ3Bpby0mZ3Q7ZGRyX3ZhbCA9 IDB1Ozxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsgZ3Bpby0mZ3Q7cG9y dF92YWwgPSAwdTs8YnI+CiAgICAgICAgICAgICAgICArfTxicj4KICAgICAgICAgICAgICAgICtz dGF0aWMgdWludDY0X3QgYXZyX2dwaW9fcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkcgogICAgICAg ICAgICAgICAgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSk8YnI+CiAgICAgICAgICAgICAgICAr ezxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsgQVZSR1BJT1N0YXRlICpz ID0gKEFWUkdQSU9TdGF0ZSAqKW9wYXF1ZTs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5i c3A7Jm5ic3A7IHN3aXRjaCAob2Zmc2V0KSB7PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZu YnNwOyZuYnNwOyBjYXNlIEdQSU9fUElOOjxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLyogTm90IGltcGxlbWVudGVkIHlldCAq Lzxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgYnJlYWs7PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBj YXNlIEdQSU9fRERSOjxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIHMtJmd0O2Rkcl92YWw7PGJyPgogICAgICAgICAg ICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBicmVhazs8 YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IGNhc2UgR1BJT19QT1JUOjxi cj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgcmV0dXJuIHMtJmd0O3BvcnRfdmFsOzxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsm bmJzcDsmbmJzcDsgZGVmYXVsdDo8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGdfYXNzZXJ0X25vdF9yZWFjaGVkKCk7PGJyPgog ICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyBicmVhazs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiAg ICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiAwOzxicj4KICAgICAgICAg ICAgICAgICt9PGJyPgogICAgICAgICAgICAgICAgKzxicj4KICAgICAgICAgICAgICAgICtzdGF0 aWMgdm9pZCBhdnJfZ3Bpb193cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsCiAgICAg ICAgICAgICAgICB1aW50NjRfdCB2YWx1ZSw8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IHVuc2lnbmVkIGludCBzaXplKTxicj4KICAgICAgICAgICAgICAgICt7PGJyPgogICAg ICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBBVlJHUElPU3RhdGUgKnMgPSAoQVZSR1BJ T1N0YXRlICopb3BhcXVlOzxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsg c3dpdGNoIChvZmZzZXQpIHs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7 IGNhc2UgR1BJT19QSU46PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovPGJyPgogICAg ICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBi cmVhazs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IGNhc2UgR1BJT19E RFI6PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyBzLSZndDtkZHJfdmFsID0gdmFsdWUgJmFtcDsgMHhGOzxicj4KICAgICAgICAg ICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYnJlYWs7 PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBjYXNlIEdQSU9fUE9SVDo8 YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IHMtJmd0O3BvcnRfdmFsID0gdmFsdWUgJmFtcDsgMHhGOzxicj4KICAgICAgICAgICAg ICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYnJlYWs7PGJy PgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBkZWZhdWx0Ojxicj4KICAgICAg ICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZ19h c3NlcnRfbm90X3JlYWNoZWQoKTs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJyZWFrOzxicj4KICAgICAgICAgICAgICAgICsm bmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgICAgICAgICAgICt9PGJyPgogICAgICAgICAg ICAgICAgKzxicj4KICAgICAgICAgICAgICAgICtzdGF0aWMgY29uc3QgTWVtb3J5UmVnaW9uT3Bz IGF2cl9ncGlvX29wcyA9IHs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7 IC5yZWFkID0gYXZyX2dwaW9fcmVhZCw8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7 Jm5ic3A7IC53cml0ZSA9IGF2cl9ncGlvX3dyaXRlLDxicj4KICAgICAgICAgICAgICAgICsmbmJz cDsmbmJzcDsmbmJzcDsgLmVuZGlhbm5lc3MgPSBERVZJQ0VfTkFUSVZFX0VORElBTiw8YnI+CiAg ICAgICAgICAgICAgICArfTs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAgICAgICAg ICAgK3N0YXRpYyB2b2lkIGF2cl9ncGlvX2luaXQoT2JqZWN0ICpvYmopPGJyPgogICAgICAgICAg ICAgICAgK3s8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IEFWUkdQSU9T dGF0ZSAqcyA9IEFWUl9HUElPKG9iaik7PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNw OyZuYnNwOyBtZW1vcnlfcmVnaW9uX2luaXRfaW8oJmFtcDtzLSZndDttbWlvLCBvYmosCiAgICAg ICAgICAgICAgICAmYW1wO2F2cl9ncGlvX29wcywgcywgVFlQRV9BVlJfR1BJTywgMyk7PGJyPgog ICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBzeXNidXNfaW5pdF9tbWlvKFNZU19C VVNfREVWSUNFKG9iaiksCiAgICAgICAgICAgICAgICAmYW1wO3MtJmd0O21taW8pOzxicj4KICAg ICAgICAgICAgICAgICt9PGJyPgogICAgICAgICAgICAgICAgK3N0YXRpYyB2b2lkIGF2cl9ncGlv X3JlYWxpemUoRGV2aWNlU3RhdGUgKmRldiwgRXJyb3IKICAgICAgICAgICAgICAgICoqZXJycCk8 YnI+CiAgICAgICAgICAgICAgICArezxicj4KICAgICAgICAgICAgICAgICsmbmJzcDsmbmJzcDsm bmJzcDsgYXZyX2dwaW9fcmVzZXQoZGV2KTs8YnI+CiAgICAgICAgICAgICAgICArfTxicj4KICAg ICAgICAgICAgICAgICs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAgICAgICAgICAg K3N0YXRpYyB2b2lkIGF2cl9ncGlvX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLAogICAg ICAgICAgICAgICAgdm9pZCAqZGF0YSk8YnI+CiAgICAgICAgICAgICAgICArezxicj4KICAgICAg ICAgICAgICAgICsmbmJzcDsmbmJzcDsmbmJzcDsgRGV2aWNlQ2xhc3MgKmRjID0gREVWSUNFX0NM QVNTKGtsYXNzKTs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAgICAgICAgICAgKyZu YnNwOyZuYnNwOyZuYnNwOyBkYy0mZ3Q7cmVzZXQgPSBhdnJfZ3Bpb19yZXNldDs8YnI+CiAgICAg ICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IGRjLSZndDtyZWFsaXplID0gYXZyX2dwaW9f cmVhbGl6ZTs8YnI+CiAgICAgICAgICAgICAgICArfTxicj4KICAgICAgICAgICAgICAgICs8YnI+ CiAgICAgICAgICAgICAgICArc3RhdGljIGNvbnN0IFR5cGVJbmZvIGF2cl9ncGlvX2luZm8gPSB7 PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyAubmFtZSZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IFRZUEVfQVZSX0dQ SU8sPGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyAucGFyZW50Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0gVFlQRV9TWVNfQlVTX0RFVklD RSw8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IC5pbnN0YW5jZV9zaXpl ID0gc2l6ZW9mKEFWUkdQSU9TdGF0ZSksPGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNw OyZuYnNwOyAuaW5zdGFuY2VfaW5pdCA9IGF2cl9ncGlvX2luaXQsPGJyPgogICAgICAgICAgICAg ICAgKyZuYnNwOyZuYnNwOyZuYnNwOyAuY2xhc3NfaW5pdCZuYnNwOyZuYnNwOyZuYnNwOyA9IGF2 cl9ncGlvX2NsYXNzX2luaXQsPGJyPgogICAgICAgICAgICAgICAgK307PGJyPgogICAgICAgICAg ICAgICAgKzxicj4KICAgICAgICAgICAgICAgICtzdGF0aWMgdm9pZCBhdnJfZ3Bpb19yZWdpc3Rl cl90eXBlcyh2b2lkKTxicj4KICAgICAgICAgICAgICAgICt7PGJyPgogICAgICAgICAgICAgICAg KyZuYnNwOyZuYnNwOyZuYnNwOyB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmYW1wO2F2cl9ncGlvX2lu Zm8pOzxicj4KICAgICAgICAgICAgICAgICt9PGJyPgogICAgICAgICAgICAgICAgKzxicj4KICAg ICAgICAgICAgICAgICt0eXBlX2luaXQoYXZyX2dwaW9fcmVnaXN0ZXJfdHlwZXMpPGJyPgogICAg ICAgICAgICAgICAgZGlmZiAtLWdpdCBhL2h3L2dwaW8vbWVzb24uYnVpbGQgYi9ody9ncGlvL21l c29uLmJ1aWxkPGJyPgogICAgICAgICAgICAgICAgaW5kZXggODZjYWU5YTBmMy4uMjU4YmQ1ZGNm YyAxMDA2NDQ8YnI+CiAgICAgICAgICAgICAgICAtLS0gYS9ody9ncGlvL21lc29uLmJ1aWxkPGJy PgogICAgICAgICAgICAgICAgKysrIGIvaHcvZ3Bpby9tZXNvbi5idWlsZDxicj4KICAgICAgICAg ICAgICAgIEBAIC0xMSwzICsxMSw1IEBAIHNvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdfT01B UCcsCiAgICAgICAgICAgICAgICBpZl90cnVlOiBmaWxlcygnb21hcF9ncGlvLmMnKSk8YnI+CiAg ICAgICAgICAgICAgICAmbmJzcDtzb2Z0bW11X3NzLmFkZCh3aGVuOiAnQ09ORklHX1JBU1BJJywg aWZfdHJ1ZToKICAgICAgICAgICAgICAgIGZpbGVzKCdiY20yODM1X2dwaW8uYycpKTxicj4KICAg ICAgICAgICAgICAgICZuYnNwO3NvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdfQVNQRUVEX1NP QycsIGlmX3RydWU6CiAgICAgICAgICAgICAgICBmaWxlcygnYXNwZWVkX2dwaW8uYycpKTxicj4K ICAgICAgICAgICAgICAgICZuYnNwO3NvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdfU0lGSVZF X0dQSU8nLCBpZl90cnVlOgogICAgICAgICAgICAgICAgZmlsZXMoJ3NpZml2ZV9ncGlvLmMnKSk8 YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAgICAgICAgICAgK3NvZnRtbXVfc3MuYWRk KHdoZW46ICdDT05GSUdfQVZSX0dQSU8nLCBpZl90cnVlOgogICAgICAgICAgICAgICAgZmlsZXMo J2F2cl9ncGlvLmMnKSk8YnI+CiAgICAgICAgICAgICAgICBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9o dy9ncGlvL2F2cl9ncGlvLmgKICAgICAgICAgICAgICAgIGIvaW5jbHVkZS9ody9ncGlvL2F2cl9n cGlvLmg8YnI+CiAgICAgICAgICAgICAgICBuZXcgZmlsZSBtb2RlIDEwMDY0NDxicj4KICAgICAg ICAgICAgICAgIGluZGV4IDAwMDAwMDAwMDAuLjg0ZDc4M2Y4ZmM8YnI+CiAgICAgICAgICAgICAg ICAtLS0gL2Rldi9udWxsPGJyPgogICAgICAgICAgICAgICAgKysrIGIvaW5jbHVkZS9ody9ncGlv L2F2cl9ncGlvLmg8YnI+CiAgICAgICAgICAgICAgICBAQCAtMCwwICsxLDQ2IEBAPGJyPgogICAg ICAgICAgICAgICAgKy8qPGJyPgogICAgICAgICAgICAgICAgKyAqIEFWUiBwcm9jZXNzb3JzIEdQ SU8gcmVnaXN0ZXJzIGRlZmluaXRpb24uPGJyPgogICAgICAgICAgICAgICAgKyAqPGJyPgogICAg ICAgICAgICAgICAgKyAqIENvcHlyaWdodCAoQykgMjAyMCBIZWVjaGVvbCBZYW5nCiAgICAgICAg ICAgICAgICA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86aGVl Y2hlb2wueWFuZ0BvdXRsb29rLmNvbSI+Jmx0O2hlZWNoZW9sLnlhbmdAb3V0bG9vay5jb20mZ3Q7 PC9hPjxicj4KICAgICAgICAgICAgICAgICsgKjxicj4KICAgICAgICAgICAgICAgICsgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKICAgICAgICAg ICAgICAgIGl0IGFuZC9vcjxicj4KICAgICAgICAgICAgICAgICsgKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAgICAgICAgICAgICAgIExpY2Vu c2UgYXM8YnI+CiAgICAgICAgICAgICAgICArICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICAgICAgICAgICAgICAgdmVyc2lvbiAyIG9yPGJyPgog ICAgICAgICAgICAgICAgKyAqIChhdCB5b3VyIG9wdGlvbikgdmVyc2lvbiAzIG9mIHRoZSBMaWNl bnNlLjxicj4KICAgICAgICAgICAgICAgICsgKjxicj4KICAgICAgICAgICAgICAgICsgKiBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsCiAgICAgICAg ICAgICAgICBiZSB1c2VmdWwsPGJyPgogICAgICAgICAgICAgICAgKyAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCiAgICAgICAgICAgICAgICB3YXJy YW50eSBvZjxicj4KICAgICAgICAgICAgICAgICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSCiAgICAgICAgICAgICAgICBQVVJQT1NFLiZuYnNwOyBTZWUgdGhl PGJyPgogICAgICAgICAgICAgICAgKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuPGJyPgogICAgICAgICAgICAgICAgKyAqPGJyPgogICAgICAgICAgICAgICAg KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsCiAg ICAgICAgICAgICAgICBQdWJsaWMgTGljZW5zZSBhbG9uZzxicj4KICAgICAgICAgICAgICAgICsg KiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgJmx0OzxhIGhyZWY9Imh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8iPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy88L2E+Jmd0Oy48 YnI+CiAgICAgICAgICAgICAgICArICovPGJyPgogICAgICAgICAgICAgICAgKzxicj4KICAgICAg ICAgICAgICAgICsjaWZuZGVmIEFWUl9HUElPX0g8YnI+CiAgICAgICAgICAgICAgICArI2RlZmlu ZSBBVlJfR1BJT19IPGJyPgogICAgICAgICAgICAgICAgKzxicj4KICAgICAgICAgICAgICAgICsj aW5jbHVkZSAmcXVvdDtody9zeXNidXMuaCZxdW90Ozxicj4KICAgICAgICAgICAgICAgICsjaW5j bHVkZSAmcXVvdDtxb20vb2JqZWN0LmgmcXVvdDs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgog ICAgICAgICAgICAgICAgKy8qIE9mZnNldHMgb2YgcmVnaXN0ZXJzLiAqLzxicj4KICAgICAgICAg ICAgICAgICsjZGVmaW5lIEdQSU9fUElOJm5ic3A7Jm5ic3A7IDB4MDA8YnI+CiAgICAgICAgICAg ICAgICArI2RlZmluZSBHUElPX0REUiZuYnNwOyZuYnNwOyAweDAxPGJyPgogICAgICAgICAgICAg ICAgKyNkZWZpbmUgR1BJT19QT1JUJm5ic3A7IDB4MDI8YnI+CiAgICAgICAgICAgICAgICArPGJy PgogICAgICAgICAgICAgICAgKyNkZWZpbmUgVFlQRV9BVlJfR1BJTyAmcXVvdDthdnItZ3BpbyZx dW90Ozxicj4KICAgICAgICAgICAgICAgICtPQkpFQ1RfREVDTEFSRV9TSU1QTEVfVFlQRShBVlJH UElPU3RhdGUsIEFWUl9HUElPKTxicj4KICAgICAgICAgICAgICAgICs8YnI+CiAgICAgICAgICAg ICAgICArc3RydWN0IEFWUkdQSU9TdGF0ZSB7PGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZu YnNwOyZuYnNwOyAvKiZsdDsgcHJpdmF0ZSAmZ3Q7Ki88YnI+CiAgICAgICAgICAgICAgICArJm5i c3A7Jm5ic3A7Jm5ic3A7IFN5c0J1c0RldmljZSBwYXJlbnRfb2JqOzxicj4KICAgICAgICAgICAg ICAgICs8YnI+CiAgICAgICAgICAgICAgICArJm5ic3A7Jm5ic3A7Jm5ic3A7IC8qJmx0OyBwdWJs aWMgJmd0OyovPGJyPgogICAgICAgICAgICAgICAgKyZuYnNwOyZuYnNwOyZuYnNwOyBNZW1vcnlS ZWdpb24gbW1pbzs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAgICAgICAgICAgKyZu YnNwOyZuYnNwOyZuYnNwOyB1aW50OF90IGRkcl92YWw7PGJyPgogICAgICAgICAgICAgICAgKyZu YnNwOyZuYnNwOyZuYnNwOyB1aW50OF90IHBvcnRfdmFsOzxicj4KICAgICAgICAgICAgICAgICs8 YnI+CiAgICAgICAgICAgICAgICArfTs8YnI+CiAgICAgICAgICAgICAgICArPGJyPgogICAgICAg ICAgICAgICAgKyNlbmRpZiAvKiBBVlJfR1BJT19IICovPGJyPgogICAgICAgICAgICAgICAgLS0g PGJyPgogICAgICAgICAgICAgICAgMi4xNy4xPGJyPgogICAgICAgICAgICAgICAgPGJyPgogICAg ICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NwYW4+PC9mb250PjwvZGl2PgogICAgICA8 L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo= --------------019145E12CE2D065CBF1DE0C--