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 X-Spam-Level: X-Spam-Status: No, score=-14.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 21B52C433E0 for ; Fri, 12 Feb 2021 13:21:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DAB5B64E70 for ; Fri, 12 Feb 2021 13:21:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230360AbhBLNVY (ORCPT ); Fri, 12 Feb 2021 08:21:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231290AbhBLNVX (ORCPT ); Fri, 12 Feb 2021 08:21:23 -0500 Received: from mail-pg1-x52a.google.com (mail-pg1-x52a.google.com [IPv6:2607:f8b0:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51E04C061574; Fri, 12 Feb 2021 05:20:42 -0800 (PST) Received: by mail-pg1-x52a.google.com with SMTP id t11so6228309pgu.8; Fri, 12 Feb 2021 05:20:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=cTQEqXBmnHB2EgizLse4tydi3im1uOQRvgvnrkN47J8=; b=c2m4BrFm6utQ8jG49ztsui33dIHmVYha/smSZZp6CdGbN7x9X8NAVvf3UAdn+H12Jf Bo/Kqyr9ttnxE0XM3TbkYTsU7JNjWd8TT3R+7hMNaxPGffGQATTAcoXgDnFLcimQO7zY 5zYQ3qsfhBtXcTRcs/ESmGyiydTjxZNKzG1rhh8VRoq6a9MfdkeUx7v83NhyFm9bCpyP lQcCy3UGYiCOgJAdMM9+YD2A0uiCRiHzXj9VwF/Kxu2cwhAqmwPxhWLLb1/FXUlCdi6T 9W6s4mawVTzuZtj2f/spx5VzYgK99wKtjIGGWARfmKrjt57/SpbfdLQ3W+Bj4lS1ife7 4wcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=cTQEqXBmnHB2EgizLse4tydi3im1uOQRvgvnrkN47J8=; b=R9U/fyBggk3SLeuVPHjKjVNCZ1AkkIOpU7kKfBifvBxDFR4GjojhaxjqLaRl6N8xnx yMei7Tnlm7n//oNG2FGyJFbZOQw84JaGrvsW4vfksV0qzpvIDPKy5YuVbCfJTPQ+H/7A Y7Q+FXHE9S7Ha/d/OfkmITkqRZPgxW/i8PDFnqgpFVIEpQ9ea5nQNZDYzcOZXQdzFBZk 7r9iqN2va7By3/Y2OO9xZ18XhJVYlI0xZ8mzAX5yaLuTRQZeF+n+WVKao4f6/NqBV36j G70quBi8i2wEjSxLJ47nnUrviKcfRFEekNJJ+Z8GamAKiDnz/Or9eyV2IQ4jqjxsz30z uYXQ== X-Gm-Message-State: AOAM533d3dc+QRVXRiJt0ItV2su2hPAKY4NdGOliZqGLr4bcJwrb4dKp JpTxp1f8SfsbCMSksOOMBks= X-Google-Smtp-Source: ABdhPJwwF+8ia0xQ32smGqMNWm3lJv4V7czNffAMHLs+siAu92CyuitiArgz+CfLeEAsLSE+LL7sZA== X-Received: by 2002:a65:6688:: with SMTP id b8mr3133522pgw.158.1613136041576; Fri, 12 Feb 2021 05:20:41 -0800 (PST) Received: from syed.domain.name ([103.201.127.1]) by smtp.gmail.com with ESMTPSA id w188sm7287592pfw.177.2021.02.12.05.20.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 Feb 2021 05:20:41 -0800 (PST) Date: Fri, 12 Feb 2021 18:50:20 +0530 From: Syed Nayyar Waris To: bgolaszewski@baylibre.com Cc: andriy.shevchenko@linux.intel.com, vilhelm.gray@gmail.com, michal.simek@xilinx.com, arnd@arndb.de, rrichter@marvell.com, linus.walleij@linaro.org, bgolaszewski@baylibre.com, yamada.masahiro@socionext.com, akpm@linux-foundation.org, rui.zhang@intel.com, daniel.lezcano@linaro.org, amit.kucheria@verdurent.com, linux-arch@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH v2 1/3] gpiolib: Introduce the for_each_set_clump macro Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org This macro iterates for each group of bits (clump) with set bits, within a bitmap memory region. For each iteration, "start" is set to the bit offset of the found clump, while the respective clump value is stored to the location pointed by "clump". Additionally, the bitmap_get_value() and bitmap_set_value() functions are introduced to respectively get and set a value of n-bits in a bitmap memory region. The n-bits can have any size from 1 to BITS_PER_LONG. size less than 1 or more than BITS_PER_LONG causes undefined behaviour. Moreover, during setting value of n-bit in bitmap, if a situation arise that the width of next n-bit is exceeding the word boundary, then it will divide itself such that some portion of it is stored in that word, while the remaining portion is stored in the next higher word. Similar situation occurs while retrieving the value from bitmap. Cc: Linus Walleij Cc: Bartosz Gołaszewski Cc: Arnd Bergmann Cc: William Breathitt Gray Cc: Andy Shevchenko Signed-off-by: Syed Nayyar Waris --- drivers/gpio/gpiolib.c | 90 ++++++++++++++++++++++++++++++++++++++++++ drivers/gpio/gpiolib.h | 28 +++++++++++++ 2 files changed, 118 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index b02cc2abd3b6..282ae599c143 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -4342,6 +4342,96 @@ static int gpiolib_seq_show(struct seq_file *s, void *v) return 0; } +/** + * bitmap_get_value - get a value of n-bits from the memory region + * @map: address to the bitmap memory region + * @start: bit offset of the n-bit value + * @nbits: size of value in bits (must be between 1 and BITS_PER_LONG inclusive). + * + * Returns value of nbits located at the @start bit offset within the @map + * memory region. + */ +unsigned long bitmap_get_value(const unsigned long *map, + unsigned long start, + unsigned long nbits) +{ + const size_t index = BIT_WORD(start); + const unsigned long offset = start % BITS_PER_LONG; + const unsigned long ceiling = round_up(start + 1, BITS_PER_LONG); + const unsigned long space = ceiling - start; + unsigned long value_low, value_high; + + if (space >= nbits) + return (map[index] >> offset) & GENMASK(nbits - 1, 0); + else { + value_low = map[index] & BITMAP_FIRST_WORD_MASK(start); + value_high = map[index + 1] & BITMAP_LAST_WORD_MASK(start + nbits); + return (value_low >> offset) | (value_high << space); + } +} +EXPORT_SYMBOL_GPL(bitmap_get_value); + +/** + * bitmap_set_value - set value within a memory region + * @map: address to the bitmap memory region + * @nbits: size of map in bits + * @value: value of clump + * @value_width: size of value in bits (must be between 1 and BITS_PER_LONG inclusive) + * @start: bit offset of the value + */ +void bitmap_set_value(unsigned long *map, unsigned long nbits, + unsigned long value, unsigned long value_width, + unsigned long start) +{ + const unsigned long index = BIT_WORD(start); + const unsigned long length = BIT_WORD(nbits); + const unsigned long offset = start % BITS_PER_LONG; + const unsigned long ceiling = round_up(start + 1, BITS_PER_LONG); + const unsigned long space = ceiling - start; + + value &= GENMASK(value_width - 1, 0); + + if (space >= value_width) { + map[index] &= ~(GENMASK(value_width - 1, 0) << offset); + map[index] |= value << offset; + } else { + map[index + 0] &= ~BITMAP_FIRST_WORD_MASK(start); + map[index + 0] |= value << offset; + + if (index + 1 >= length) + return; + + map[index + 1] &= ~BITMAP_LAST_WORD_MASK(start + value_width); + map[index + 1] |= value >> space; + } +} +EXPORT_SYMBOL_GPL(bitmap_set_value); + +/** + * find_next_clump - find next clump with set bits in a memory region + * @clump: location to store copy of found clump + * @addr: address to base the search on + * @size: bitmap size in number of bits + * @offset: bit offset at which to start searching + * @clump_size: clump size in bits + * + * Returns the bit offset for the next set clump; the found clump value is + * copied to the location pointed by @clump. If no bits are set, returns @size. + */ +unsigned long find_next_clump(unsigned long *clump, const unsigned long *addr, + unsigned long size, unsigned long offset, + unsigned long clump_size) +{ + offset = find_next_bit(addr, size, offset); + if (offset == size) + return size; + + offset = rounddown(offset, clump_size); + *clump = bitmap_get_value(addr, offset, clump_size); + return offset; +} +EXPORT_SYMBOL_GPL(find_next_clump); + static const struct seq_operations gpiolib_sops = { .start = gpiolib_seq_start, .next = gpiolib_seq_next, diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index 30bc3f80f83e..41c6b24d9842 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h @@ -141,6 +141,34 @@ int gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce); int gpiod_hog(struct gpio_desc *desc, const char *name, unsigned long lflags, enum gpiod_flags dflags); +unsigned long bitmap_get_value(const unsigned long *map, + unsigned long start, + unsigned long nbits); + +void bitmap_set_value(unsigned long *map, unsigned long nbits, + unsigned long value, unsigned long value_width, + unsigned long start); + +unsigned long find_next_clump(unsigned long *clump, const unsigned long *addr, + unsigned long size, unsigned long offset, + unsigned long clump_size); + +#define find_first_clump(clump, bits, size, clump_size) \ + find_next_clump((clump), (bits), (size), 0, (clump_size)) + +/** + * for_each_set_clump - iterate over bitmap for each clump with set bits + * @start: bit offset to start search and to store the current iteration offset + * @clump: location to store copy of current 8-bit clump + * @bits: bitmap address to base the search on + * @size: bitmap size in number of bits + * @clump_size: clump size in bits + */ +#define for_each_set_clump(start, clump, bits, size, clump_size) \ + for ((start) = find_first_clump(&(clump), (bits), (size), (clump_size)); \ + (start) < (size); \ + (start) = find_next_clump(&(clump), (bits), (size), (start) + (clump_size), (clump_size))) + /* * Return the GPIO number of the passed descriptor relative to its chip */ -- 2.29.0 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 X-Spam-Level: X-Spam-Status: No, score=-12.2 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C34FAC433DB for ; Fri, 12 Feb 2021 13:22:02 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7698C64E57 for ; Fri, 12 Feb 2021 13:22:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7698C64E57 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=NkdpLuabyNPlinjdRUAVw+TsEaGSAAEDPYiZxK8R/JI=; b=rCpr52cWr77Y/ZPoU94i7td6w RzqsNhpgMt6K/FgmpgDvqHwa8amyxETTq7nI27KG20qlpm1EwXQO1rvU98HWDxmStOj8paKIh05E/ gES+xSHLPhMiKK/DZP8DBh7fqeNh4ULQHKefQekpuAEAsl0LMQS3E51QgIcQhKx9FHz4Qg+JRLWOM zWgUySP4cWcBBXyvvJmlG3l3OeshKHcEXw0LciMQG0JNVX4yBz+D0QG35/v7C+78QMGM0tAcEAq0a cQpmKxcmhUgtBh4NYjfLyHIKWdpnH8KH55ZF18m6iih3XJjl3+UmBPFsoDQ6jQTC7cAfMEpvcE3kt xIwWu2d4g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lAYNK-0002Zw-GC; Fri, 12 Feb 2021 13:20:46 +0000 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lAYNH-0002Yd-MQ for linux-arm-kernel@lists.infradead.org; Fri, 12 Feb 2021 13:20:44 +0000 Received: by mail-pf1-x434.google.com with SMTP id 189so5814621pfy.6 for ; Fri, 12 Feb 2021 05:20:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=cTQEqXBmnHB2EgizLse4tydi3im1uOQRvgvnrkN47J8=; b=c2m4BrFm6utQ8jG49ztsui33dIHmVYha/smSZZp6CdGbN7x9X8NAVvf3UAdn+H12Jf Bo/Kqyr9ttnxE0XM3TbkYTsU7JNjWd8TT3R+7hMNaxPGffGQATTAcoXgDnFLcimQO7zY 5zYQ3qsfhBtXcTRcs/ESmGyiydTjxZNKzG1rhh8VRoq6a9MfdkeUx7v83NhyFm9bCpyP lQcCy3UGYiCOgJAdMM9+YD2A0uiCRiHzXj9VwF/Kxu2cwhAqmwPxhWLLb1/FXUlCdi6T 9W6s4mawVTzuZtj2f/spx5VzYgK99wKtjIGGWARfmKrjt57/SpbfdLQ3W+Bj4lS1ife7 4wcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=cTQEqXBmnHB2EgizLse4tydi3im1uOQRvgvnrkN47J8=; b=sLHLpiz129yLH7KdVMsdsOHee1aiS6SryFjxckSitYdltL0ITY6+O9onfzIN5Tim5o gHEOYrs2KFn5/TVoqW0QtCkASwRbaz+tw+oaK7s0TPNsVRY+hzIFGKqks0yX16qjTzzT Jh9uiF68sVpZCXvHO2+HBzEZehB5Loz+V+qmEsJ5btE+xW2WMuBzkLSoig0BrHbtgDC6 8YtG8gxS5F2t9PYi4dzGa5pxVmwDylWVGWccWiNXNoi9ZfJGWBxus/MNPCmGS6I+bLm2 1Ad3//AhOKrzBTqVH9Matbmk1ncfLB9lXJ454tsFrtr3f+jYsQ+a1DVvV87UO5zA5mzz qpvg== X-Gm-Message-State: AOAM530mnesuahLdhxYSZ2EnzJ1uG+wZjxEGsWtBjCOh+dAi+pI8CriS o4nQrjxmrfSL25q2+jz7skE= X-Google-Smtp-Source: ABdhPJwwF+8ia0xQ32smGqMNWm3lJv4V7czNffAMHLs+siAu92CyuitiArgz+CfLeEAsLSE+LL7sZA== X-Received: by 2002:a65:6688:: with SMTP id b8mr3133522pgw.158.1613136041576; Fri, 12 Feb 2021 05:20:41 -0800 (PST) Received: from syed.domain.name ([103.201.127.1]) by smtp.gmail.com with ESMTPSA id w188sm7287592pfw.177.2021.02.12.05.20.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 Feb 2021 05:20:41 -0800 (PST) Date: Fri, 12 Feb 2021 18:50:20 +0530 From: Syed Nayyar Waris To: bgolaszewski@baylibre.com Subject: [PATCH v2 1/3] gpiolib: Introduce the for_each_set_clump macro Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210212_082043_793691_CE725069 X-CRM114-Status: GOOD ( 23.80 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arch@vger.kernel.org, amit.kucheria@verdurent.com, arnd@arndb.de, yamada.masahiro@socionext.com, linux-kernel@vger.kernel.org, linus.walleij@linaro.org, daniel.lezcano@linaro.org, vilhelm.gray@gmail.com, michal.simek@xilinx.com, bgolaszewski@baylibre.com, rrichter@marvell.com, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, akpm@linux-foundation.org, andriy.shevchenko@linux.intel.com, rui.zhang@intel.com, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org VGhpcyBtYWNybyBpdGVyYXRlcyBmb3IgZWFjaCBncm91cCBvZiBiaXRzIChjbHVtcCkgd2l0aCBz ZXQgYml0cywKd2l0aGluIGEgYml0bWFwIG1lbW9yeSByZWdpb24uIEZvciBlYWNoIGl0ZXJhdGlv biwgInN0YXJ0IiBpcyBzZXQgdG8KdGhlIGJpdCBvZmZzZXQgb2YgdGhlIGZvdW5kIGNsdW1wLCB3 aGlsZSB0aGUgcmVzcGVjdGl2ZSBjbHVtcCB2YWx1ZSBpcwpzdG9yZWQgdG8gdGhlIGxvY2F0aW9u IHBvaW50ZWQgYnkgImNsdW1wIi4gQWRkaXRpb25hbGx5LCB0aGUKYml0bWFwX2dldF92YWx1ZSgp IGFuZCBiaXRtYXBfc2V0X3ZhbHVlKCkgZnVuY3Rpb25zIGFyZSBpbnRyb2R1Y2VkIHRvCnJlc3Bl Y3RpdmVseSBnZXQgYW5kIHNldCBhIHZhbHVlIG9mIG4tYml0cyBpbiBhIGJpdG1hcCBtZW1vcnkg cmVnaW9uLgpUaGUgbi1iaXRzIGNhbiBoYXZlIGFueSBzaXplIGZyb20gMSB0byBCSVRTX1BFUl9M T05HLiBzaXplIGxlc3MKdGhhbiAxIG9yIG1vcmUgdGhhbiBCSVRTX1BFUl9MT05HIGNhdXNlcyB1 bmRlZmluZWQgYmVoYXZpb3VyLgpNb3Jlb3ZlciwgZHVyaW5nIHNldHRpbmcgdmFsdWUgb2Ygbi1i aXQgaW4gYml0bWFwLCBpZiBhIHNpdHVhdGlvbiBhcmlzZQp0aGF0IHRoZSB3aWR0aCBvZiBuZXh0 IG4tYml0IGlzIGV4Y2VlZGluZyB0aGUgd29yZCBib3VuZGFyeSwgdGhlbiBpdAp3aWxsIGRpdmlk ZSBpdHNlbGYgc3VjaCB0aGF0IHNvbWUgcG9ydGlvbiBvZiBpdCBpcyBzdG9yZWQgaW4gdGhhdCB3 b3JkLAp3aGlsZSB0aGUgcmVtYWluaW5nIHBvcnRpb24gaXMgc3RvcmVkIGluIHRoZSBuZXh0IGhp Z2hlciB3b3JkLiBTaW1pbGFyCnNpdHVhdGlvbiBvY2N1cnMgd2hpbGUgcmV0cmlldmluZyB0aGUg dmFsdWUgZnJvbSBiaXRtYXAuCgpDYzogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5h cm8ub3JnPgpDYzogQmFydG9zeiBHb8WCYXN6ZXdza2kgPGJnb2xhc3pld3NraUBiYXlsaWJyZS5j b20+CkNjOiBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPgpDYzogV2lsbGlhbSBCcmVhdGhp dHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KQ2M6IEFuZHkgU2hldmNoZW5rbyA8YW5k cml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBTeWVkIE5heXlh ciBXYXJpcyA8c3llZG53YXJpc0BnbWFpbC5jb20+Ci0tLQogZHJpdmVycy9ncGlvL2dwaW9saWIu YyB8IDkwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncGlvL2dwaW9saWIuaCB8IDI4ICsrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTE4 IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJp dmVycy9ncGlvL2dwaW9saWIuYwppbmRleCBiMDJjYzJhYmQzYjYuLjI4MmFlNTk5YzE0MyAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xp Yi5jCkBAIC00MzQyLDYgKzQzNDIsOTYgQEAgc3RhdGljIGludCBncGlvbGliX3NlcV9zaG93KHN0 cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBiaXRt YXBfZ2V0X3ZhbHVlIC0gZ2V0IGEgdmFsdWUgb2Ygbi1iaXRzIGZyb20gdGhlIG1lbW9yeSByZWdp b24KKyAqIEBtYXA6IGFkZHJlc3MgdG8gdGhlIGJpdG1hcCBtZW1vcnkgcmVnaW9uCisgKiBAc3Rh cnQ6IGJpdCBvZmZzZXQgb2YgdGhlIG4tYml0IHZhbHVlCisgKiBAbmJpdHM6IHNpemUgb2YgdmFs dWUgaW4gYml0cyAobXVzdCBiZSBiZXR3ZWVuIDEgYW5kIEJJVFNfUEVSX0xPTkcgaW5jbHVzaXZl KS4KKyAqCisgKiBSZXR1cm5zIHZhbHVlIG9mIG5iaXRzIGxvY2F0ZWQgYXQgdGhlIEBzdGFydCBi aXQgb2Zmc2V0IHdpdGhpbiB0aGUgQG1hcAorICogbWVtb3J5IHJlZ2lvbi4KKyAqLwordW5zaWdu ZWQgbG9uZyBiaXRtYXBfZ2V0X3ZhbHVlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKm1hcCwKKwkJCQl1 bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCXVuc2lnbmVkIGxvbmcgbmJpdHMpCit7CisJY29uc3Qg c2l6ZV90IGluZGV4ID0gQklUX1dPUkQoc3RhcnQpOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgb2Zm c2V0ID0gc3RhcnQgJSBCSVRTX1BFUl9MT05HOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2VpbGlu ZyA9IHJvdW5kX3VwKHN0YXJ0ICsgMSwgQklUU19QRVJfTE9ORyk7CisJY29uc3QgdW5zaWduZWQg bG9uZyBzcGFjZSA9IGNlaWxpbmcgLSBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHZhbHVlX2xvdywg dmFsdWVfaGlnaDsKKworCWlmIChzcGFjZSA+PSBuYml0cykKKwkJcmV0dXJuIChtYXBbaW5kZXhd ID4+IG9mZnNldCkgJiBHRU5NQVNLKG5iaXRzIC0gMSwgMCk7CisJZWxzZSB7CisJCXZhbHVlX2xv dyA9IG1hcFtpbmRleF0gJiBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKwkJdmFsdWVf aGlnaCA9IG1hcFtpbmRleCArIDFdICYgQklUTUFQX0xBU1RfV09SRF9NQVNLKHN0YXJ0ICsgbmJp dHMpOworCQlyZXR1cm4gKHZhbHVlX2xvdyA+PiBvZmZzZXQpIHwgKHZhbHVlX2hpZ2ggPDwgc3Bh Y2UpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJpdG1hcF9nZXRfdmFsdWUpOworCisvKioK KyAqIGJpdG1hcF9zZXRfdmFsdWUgLSBzZXQgdmFsdWUgd2l0aGluIGEgbWVtb3J5IHJlZ2lvbgor ICogQG1hcDogYWRkcmVzcyB0byB0aGUgYml0bWFwIG1lbW9yeSByZWdpb24KKyAqIEBuYml0czog c2l6ZSBvZiBtYXAgaW4gYml0cworICogQHZhbHVlOiB2YWx1ZSBvZiBjbHVtcAorICogQHZhbHVl X3dpZHRoOiBzaXplIG9mIHZhbHVlIGluIGJpdHMgKG11c3QgYmUgYmV0d2VlbiAxIGFuZCBCSVRT X1BFUl9MT05HIGluY2x1c2l2ZSkKKyAqIEBzdGFydDogYml0IG9mZnNldCBvZiB0aGUgdmFsdWUK KyAqLwordm9pZCBiaXRtYXBfc2V0X3ZhbHVlKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQg bG9uZyBuYml0cywKKwkJCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgdmFsdWVf d2lkdGgsCisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcg aW5kZXggPSBCSVRfV09SRChzdGFydCk7CisJY29uc3QgdW5zaWduZWQgbG9uZyBsZW5ndGggPSBC SVRfV09SRChuYml0cyk7CisJY29uc3QgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBzdGFydCAlIEJJ VFNfUEVSX0xPTkc7CisJY29uc3QgdW5zaWduZWQgbG9uZyBjZWlsaW5nID0gcm91bmRfdXAoc3Rh cnQgKyAxLCBCSVRTX1BFUl9MT05HKTsKKwljb25zdCB1bnNpZ25lZCBsb25nIHNwYWNlID0gY2Vp bGluZyAtIHN0YXJ0OworCisJdmFsdWUgJj0gR0VOTUFTSyh2YWx1ZV93aWR0aCAtIDEsIDApOwor CisJaWYgKHNwYWNlID49IHZhbHVlX3dpZHRoKSB7CisJCW1hcFtpbmRleF0gJj0gfihHRU5NQVNL KHZhbHVlX3dpZHRoIC0gMSwgMCkgPDwgb2Zmc2V0KTsKKwkJbWFwW2luZGV4XSB8PSB2YWx1ZSA8 PCBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJbWFwW2luZGV4ICsgMF0gJj0gfkJJVE1BUF9GSVJTVF9X T1JEX01BU0soc3RhcnQpOworCQltYXBbaW5kZXggKyAwXSB8PSB2YWx1ZSA8PCBvZmZzZXQ7CisK KwkJaWYgKGluZGV4ICsgMSA+PSBsZW5ndGgpCisJCQlyZXR1cm47CisKKwkJbWFwW2luZGV4ICsg MV0gJj0gfkJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzdGFydCArIHZhbHVlX3dpZHRoKTsKKwkJbWFw W2luZGV4ICsgMV0gfD0gdmFsdWUgPj4gc3BhY2U7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwo Yml0bWFwX3NldF92YWx1ZSk7CisKKy8qKgorICogZmluZF9uZXh0X2NsdW1wIC0gZmluZCBuZXh0 IGNsdW1wIHdpdGggc2V0IGJpdHMgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAY2x1bXA6IGxvY2F0 aW9uIHRvIHN0b3JlIGNvcHkgb2YgZm91bmQgY2x1bXAKKyAqIEBhZGRyOiBhZGRyZXNzIHRvIGJh c2UgdGhlIHNlYXJjaCBvbgorICogQHNpemU6IGJpdG1hcCBzaXplIGluIG51bWJlciBvZiBiaXRz CisgKiBAb2Zmc2V0OiBiaXQgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZworICog QGNsdW1wX3NpemU6IGNsdW1wIHNpemUgaW4gYml0cworICoKKyAqIFJldHVybnMgdGhlIGJpdCBv ZmZzZXQgZm9yIHRoZSBuZXh0IHNldCBjbHVtcDsgdGhlIGZvdW5kIGNsdW1wIHZhbHVlIGlzCisg KiBjb3BpZWQgdG8gdGhlIGxvY2F0aW9uIHBvaW50ZWQgYnkgQGNsdW1wLiBJZiBubyBiaXRzIGFy ZSBzZXQsIHJldHVybnMgQHNpemUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgZmluZF9uZXh0X2NsdW1w KHVuc2lnbmVkIGxvbmcgKmNsdW1wLCBjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLAorCQkJCXVu c2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJdW5zaWduZWQgbG9u ZyBjbHVtcF9zaXplKQoreworCW9mZnNldCA9IGZpbmRfbmV4dF9iaXQoYWRkciwgc2l6ZSwgb2Zm c2V0KTsKKwlpZiAob2Zmc2V0ID09IHNpemUpCisJCXJldHVybiBzaXplOworCisJb2Zmc2V0ID0g cm91bmRkb3duKG9mZnNldCwgY2x1bXBfc2l6ZSk7CisJKmNsdW1wID0gYml0bWFwX2dldF92YWx1 ZShhZGRyLCBvZmZzZXQsIGNsdW1wX3NpemUpOworCXJldHVybiBvZmZzZXQ7Cit9CitFWFBPUlRf U1lNQk9MX0dQTChmaW5kX25leHRfY2x1bXApOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9v cGVyYXRpb25zIGdwaW9saWJfc29wcyA9IHsKIAkuc3RhcnQgPSBncGlvbGliX3NlcV9zdGFydCwK IAkubmV4dCA9IGdwaW9saWJfc2VxX25leHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bp b2xpYi5oIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuaAppbmRleCAzMGJjM2Y4MGY4M2UuLjQxYzZi MjRkOTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWIuaAorKysgYi9kcml2ZXJz L2dwaW8vZ3Bpb2xpYi5oCkBAIC0xNDEsNiArMTQxLDM0IEBAIGludCBncGlvX3NldF9kZWJvdW5j ZV90aW1lb3V0KHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGludCBkZWJvdW5jZSk7 CiBpbnQgZ3Bpb2RfaG9nKHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKm5hbWUs CiAJCXVuc2lnbmVkIGxvbmcgbGZsYWdzLCBlbnVtIGdwaW9kX2ZsYWdzIGRmbGFncyk7CiAKK3Vu c2lnbmVkIGxvbmcgYml0bWFwX2dldF92YWx1ZShjb25zdCB1bnNpZ25lZCBsb25nICptYXAsCisJ CQkJdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQl1bnNpZ25lZCBsb25nIG5iaXRzKTsKKwordm9p ZCBiaXRtYXBfc2V0X3ZhbHVlKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgbG9uZyBuYml0 cywKKwkJCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgdmFsdWVfd2lkdGgsCisJ CQl1bnNpZ25lZCBsb25nIHN0YXJ0KTsKKwordW5zaWduZWQgbG9uZyBmaW5kX25leHRfY2x1bXAo dW5zaWduZWQgbG9uZyAqY2x1bXAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCisJCQkJdW5z aWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQl1bnNpZ25lZCBsb25n IGNsdW1wX3NpemUpOworCisjZGVmaW5lIGZpbmRfZmlyc3RfY2x1bXAoY2x1bXAsIGJpdHMsIHNp emUsIGNsdW1wX3NpemUpIFwKKwlmaW5kX25leHRfY2x1bXAoKGNsdW1wKSwgKGJpdHMpLCAoc2l6 ZSksIDAsIChjbHVtcF9zaXplKSkKKworLyoqCisgKiBmb3JfZWFjaF9zZXRfY2x1bXAgLSBpdGVy YXRlIG92ZXIgYml0bWFwIGZvciBlYWNoIGNsdW1wIHdpdGggc2V0IGJpdHMKKyAqIEBzdGFydDog Yml0IG9mZnNldCB0byBzdGFydCBzZWFyY2ggYW5kIHRvIHN0b3JlIHRoZSBjdXJyZW50IGl0ZXJh dGlvbiBvZmZzZXQKKyAqIEBjbHVtcDogbG9jYXRpb24gdG8gc3RvcmUgY29weSBvZiBjdXJyZW50 IDgtYml0IGNsdW1wCisgKiBAYml0czogYml0bWFwIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNo IG9uCisgKiBAc2l6ZTogYml0bWFwIHNpemUgaW4gbnVtYmVyIG9mIGJpdHMKKyAqIEBjbHVtcF9z aXplOiBjbHVtcCBzaXplIGluIGJpdHMKKyAqLworI2RlZmluZSBmb3JfZWFjaF9zZXRfY2x1bXAo c3RhcnQsIGNsdW1wLCBiaXRzLCBzaXplLCBjbHVtcF9zaXplKSBcCisJZm9yICgoc3RhcnQpID0g ZmluZF9maXJzdF9jbHVtcCgmKGNsdW1wKSwgKGJpdHMpLCAoc2l6ZSksIChjbHVtcF9zaXplKSk7 IFwKKwkgICAgIChzdGFydCkgPCAoc2l6ZSk7IFwKKwkgICAgIChzdGFydCkgPSBmaW5kX25leHRf Y2x1bXAoJihjbHVtcCksIChiaXRzKSwgKHNpemUpLCAoc3RhcnQpICsgKGNsdW1wX3NpemUpLCAo Y2x1bXBfc2l6ZSkpKQorCiAvKgogICogUmV0dXJuIHRoZSBHUElPIG51bWJlciBvZiB0aGUgcGFz c2VkIGRlc2NyaXB0b3IgcmVsYXRpdmUgdG8gaXRzIGNoaXAKICAqLwotLSAKMi4yOS4wCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5l bAo=