From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 960324596F for ; Thu, 30 May 2024 17:21:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717089662; cv=none; b=ff9pmRaHV89I6xYfH3f/d6yLRIK1Oy69UovoGmJPQsj6/AtBtm6f2OiSvZAT55vqK7vTt07R4Vp/2APeUXfSpLISSfndp3Wg1phxsab/7vEK7adZCypiU6OUV5zAm/2UOE+AMzKvE4gheQ/RTOB2lFF4KGp+xGdHjl1TSKG/Fo8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717089662; c=relaxed/simple; bh=Ab40fFziNTCR3bIRbRFkfjAS+VLoC1PKr4P45quh/K4=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=qnlvYTT/w+7V+fi6DBJNU2Pasuhc9gJi48YQ2Yksl2rdyZz/y9lR7lCEodo5kyeIz27tnslu0EjoZqzSnfVUDcLrhdWLhS/twL8E/7lOrqG6C31CKKnMeh0464o+DbMWC0oaWTHo0xa9xYTbmKO55D0F4/qMi9NF7H6Cr9V4xcs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=e4On2IBu; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="e4On2IBu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1717089659; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5KuYwrlXvy2N8LV4iq+ZSNoKmsKOKbU0DyIuxTd5sy0=; b=e4On2IBudx8E3wWTxlRW9iE6t6N5dM+LQZh9teBX4aFNwo73whPYWsEyFbcl9DY+HaYLI7 Xv4AReLnc+M/tFxtUh2bPB01c4kuurcRi4z2J9zVp5zVJhtXk8IfGxsQrCXBawi6bxyQrx znY1yTcRldKq6X3pKtth5LJ2sgN5epU= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-256-2lnwGTolMg-SFA1NpTLEwg-1; Thu, 30 May 2024 13:20:58 -0400 X-MC-Unique: 2lnwGTolMg-SFA1NpTLEwg-1 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-358f9dffbedso628368f8f.3 for ; Thu, 30 May 2024 10:20:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717089656; x=1717694456; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5KuYwrlXvy2N8LV4iq+ZSNoKmsKOKbU0DyIuxTd5sy0=; b=rIX42zVKFEUV4QSMzq5U+1Am3cJQv2oLJ6VDNVkzyG3MxUfwgYwrg4gG2DvmS1HHee ol+PPKNKMHdUwxFSGsFup2a1pwlj1jYk/eyowjDpgAuMCYAwAhKFMY+9KSjP1SCDt3M3 emReFhTI9H94g7jZEYH9sOqbNmjQes4vWQr+rn1Hu/JYhQcyFoTrawDYX8UhFnhBbl7K 7VCX2KtBP4XTPn6Y5h60wKpGDFJaoniv44SeFnpKNX739qOrNuFuvnjzfcxF7K/vcjU3 rb02QhNY2zGMxBD8HLzTocevlX01e3+UEVgYsylWOMeLkAeQ7Ign9PjJyLdVsdRGOwvG DihA== X-Forwarded-Encrypted: i=1; AJvYcCVItsYeF3MZHpJPEkS8fXtf93hwruhHeIm3BU0WIO98bCCa4NF/a+Nfmyr/GxDSMO7rGMbgVIqp7TcXQQwLvMqbT2N0PVp8 X-Gm-Message-State: AOJu0Yxd7gbqS4wPmDXj0cOu24ctTWPyJnDpJ3cToH6nG7FYNWDC071Y D2yGi3CCUqtjzJSrisVopw2M2kQOQdm+PPC8rGU5pEbj2WwYzTTYXvR2CI8MB/e4dAoJdyIITwY TuCHuwr6OpHfZkIJatK4lLMMNX/e4L65Fg+yB0FT9Hoj7P+23tRoQ7A4f6JSIhg== X-Received: by 2002:adf:ef50:0:b0:354:f44d:a020 with SMTP id ffacd0b85a97d-35dc00bf084mr2986434f8f.48.1717089655808; Thu, 30 May 2024 10:20:55 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFBHht46/0aHH98H3F2Btkvz/+IBrdTIlSs6v8sQAHIKqk2hS+lTqMGvUepjWfHpzCCT8C1Fg== X-Received: by 2002:adf:ef50:0:b0:354:f44d:a020 with SMTP id ffacd0b85a97d-35dc00bf084mr2986414f8f.48.1717089655287; Thu, 30 May 2024 10:20:55 -0700 (PDT) Received: from ?IPV6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-35dd04d94e6sm17916f8f.51.2024.05.30.10.20.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 30 May 2024 10:20:54 -0700 (PDT) Message-ID: Date: Thu, 30 May 2024 19:20:52 +0200 Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 3/6] KVM: arm64: add emulation for CTR_EL0 register To: Sebastian Ott Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Catalin Marinas , Will Deacon References: <20240514072252.5657-1-sebott@redhat.com> <20240514072252.5657-4-sebott@redhat.com> <312fd3cf-2eb9-4a38-8c50-e3b7639c3cbc@redhat.com> From: Eric Auger In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 5/30/24 14:56, Sebastian Ott wrote: > Hej Eric, > > On Wed, 29 May 2024, Eric Auger wrote: >> On 5/14/24 09:22, Sebastian Ott wrote: >>> +static int validate_clidr_el1(u64 clidr_el1, u64 ctr_el0) >>> +{ >>> +    u64 idc = !CLIDR_LOC(clidr_el1) || >>> +          (!CLIDR_LOUIS(clidr_el1) && !CLIDR_LOUU(clidr_el1)); >> This actually computes: >> CLIDR_EL1.LoC == 0b000 or (CLIDR_EL1.LoUIS == 0b000 && >> CLIDR_EL1.LoUU == 0b000) >> >> refering to ARM ARM >> Terminology for Clean, Invalidate, and Clean and Invalidate instructions >> >> 1) If the LoC field value is 0x0, this means that no levels of cache >> need to cleaned or invalidated >> when cleaning or invalidating to the Point of Coherency. >> >> 2) If the LoUU field value is 0x0, this means that no levels of data >> cache need to be cleaned or >> invalidated when cleaning or invalidating to the Point of Unification. >> >> 3) If the LoUIS field value is 0x0, this means that no levels of data or >> unified cache need to >> cleaned or invalidated when cleaning or invalidating to the Point of >> Unification for the Inner Shareable shareability domain. >> >> so to me if above computation is true this means who have no level of >> cache to take care of, so although CTR_EL0.IDC = 0 would normally mean >> you must "Data cache clean to the Point of Unification" that is not >> needed in that case. >> >> But the spec does not really state that IDC=0 and >> no_level_of_cache_to_clean_inv are incompatible as far as I see > > This is just existing code moved to a helper.. agreed this comment/question is not related to your patch > >>> +    if ((clidr_el1 & CLIDR_EL1_RES0) || (!(ctr_el0 & CTR_EL0_IDC) && >>> idc))> +        return -EINVAL; >> >> Isn't (clidr_el1 & CLIDR_EL1_RES0) already checked by >> >>        { SYS_DESC(SYS_CLIDR_EL1), access_clidr, reset_clidr, CLIDR_EL1, >>          .set_user = set_clidr, .val = ~CLIDR_EL1_RES0 }, >> > > Nope, that would only be the case when arm64_check_features() > is used (by having set_id_reg() for the .set_user callback). OK > >>> +static int validate_cache_top(struct kvm_vcpu *vcpu, u64 ctr_el0) >> s/top/topology? > > Hm, that name is already quiet long. yes but top does not mean much > >>> +{ >>> +    const struct sys_reg_desc *clidr_el1; >>> +    unsigned int i; >>> +    int ret; >>> + >>> +    clidr_el1 = get_sys_reg_desc(SYS_CLIDR_EL1); >>> +    if (!clidr_el1) >>> +        return -ENOENT; >>> + >>> +    ret = validate_clidr_el1(__vcpu_sys_reg(vcpu, clidr_el1->reg), >>> ctr_el0); >>> +    if (ret) >>> +        return ret; >>> + >>> +    if (!vcpu->arch.ccsidr) >>> +        return 0; >>> + >> worth to add a comment about what this does as this is not >> straighforward ;-) > > Hm, "check for validity of the cache topology" - that's kinda the > functions name, so no added value. "Make sure the cache line size > per level obeys the minimum cache line setting" - would this help? > Can't think of smth else right now, sry. Suggestions? yes the latter is fine to me > >>> +    for (i = 0; i < CSSELR_MAX; i++) { >>> +        if ((FIELD_GET(CCSIDR_EL1_LineSize, get_ccsidr(vcpu, i)) + 4) >> maybe use a local variable such as log2_cache_bytes >>> +            < __get_min_cache_line_size(ctr_el0, i & CSSELR_EL1_InD)) >> I don't get i & CSSELR_EL1_InD, please can you explain? > > It flags the cache at this level as a data or instruction cache (see also > get_ccsidr()). OK I understand the principle now. thank you > >>> +static int set_ctr(struct kvm_vcpu *vcpu, const struct sys_reg_desc >>> *rd, >>> +           u64 val) >>> +{ >> don't you need to take the config_lock earlier as in set_id_reg()? isn't >> it racy versus has_ran_once? > > I was about to write that this is not the case since that's an rcu > accessed pointer not guarded by the config lock but I confused this > with the vcpu_has_run_once() .... again :-( > > I'm not a 100% sure we really need that but I'll just move the lock up - > it definitely doesn't hurt. yup Eric > >>> +    u64 ctr = vcpu->kvm->arch.ctr_el0; >>> +    u64 writable_mask = rd->val; >>> +    int ret; >>> + >>> +    if (val == ctr) >>> +        return 0; >>> + >>> +    if (kvm_vm_has_ran_once(vcpu->kvm))> +        return -EBUSY;> + >>> +    if ((ctr & ~writable_mask) != (val & ~writable_mask)) >>> +        return -EINVAL; >>> + >>> +    if (((ctr & CTR_EL0_DIC_MASK) < (val & CTR_EL0_DIC_MASK)) || >>> +        ((ctr & CTR_EL0_IDC_MASK) < (val & CTR_EL0_IDC_MASK)) || >>> +        ((ctr & CTR_EL0_DminLine_MASK) < (val & >>> CTR_EL0_DminLine_MASK)) || >>> +        ((ctr & CTR_EL0_IminLine_MASK) < (val & >>> CTR_EL0_IminLine_MASK))) { >>> +        return -EINVAL; >>> +    } >>> + >>> +    mutex_lock(&vcpu->kvm->arch.config_lock); >>> +    ret = validate_cache_top(vcpu, val); >>> +    if (ret) { >>> +        mutex_unlock(&vcpu->kvm->arch.config_lock); >>> +        return ret; >> nit use a goto out > > Thanks, > Sebastian > 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 8C0A3C25B7E for ; Thu, 30 May 2024 17:21:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+3EczrP+Hn+McjjsrKN0BY7sYe059tCv7djxVg/skvA=; b=HAsQK76HoLM4NJ x6EHl36gK0kzV3dYrnnQTy6/X2mplLoWggSuqg2cDSB0eIBbxfKQHdSJX+JkRsOJG0qDJVc2pkOpd QTO+zDlmXY9fhKXNQW+wuZpq6BsOJIUJVtqWQAlFQAE0nE6SrNyFqrKf5jEDAg9bMS4DOPJEDWeLG EYSqgxHuVNaptz+XBxAIbyLhAoGvYV7cMo7ZEzn3bzrdCcScLacOYaoPv9ZwkLLdMwkoVGQJwoEgL bSZJm0d2WopDAzWZzWKTjRJ1JuPh+kjpTqNQmhRNW4NBtU1gHmDjIfsDl5R+qJLaNXrnGhzL0EIly UwbochNghAu6e5BynPfQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCjSb-00000007yZn-0jt9; Thu, 30 May 2024 17:21:05 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sCjSY-00000007yZL-3iJ8 for linux-arm-kernel@lists.infradead.org; Thu, 30 May 2024 17:21:04 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1717089661; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5KuYwrlXvy2N8LV4iq+ZSNoKmsKOKbU0DyIuxTd5sy0=; b=UcXpJ2FK5vZ4SbzGcb1G5jqmorIE6py3FtXfBS4dMNBqMsrU+WoQRlFPcCpdHR4ZqmL8wZ WtllZgo2uoTlTUkhQhP27S137ymU04bS88+/r8wKYBALx6IHmb7D7tcnwJa0MiAhGW24ua M+Rvxdjdkn2/8CoCZHBTM2fn/loUYlY= Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-454-ETWTdEEVOZGkg1e1OjicWw-1; Thu, 30 May 2024 13:20:57 -0400 X-MC-Unique: ETWTdEEVOZGkg1e1OjicWw-1 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-358f9dffbedso628358f8f.3 for ; Thu, 30 May 2024 10:20:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717089656; x=1717694456; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5KuYwrlXvy2N8LV4iq+ZSNoKmsKOKbU0DyIuxTd5sy0=; b=cz/6sKEgGIewNW2kutaophyIxHe1Lff87A/o/zEMZ35MsnQaWtfh9ZnYPB5shwbEl5 NzMQ20Dpep7rXBhwtijLqFWx1uYzVGIshdC6xrCeAV8k2cO3AS/HC9kbRTIb3mWZxqfq bfY+ElG8bDRt9owj0gW2DQBLJxxLk3r9eGHuYxYfElS1Bd9uZo25rfzH+18qxBYQZfsA xVZzRTMHcDNCvXmnOW+byxyZmxr6X7/K7QtLj+9nOArGuDMwyCVJZUASzdrwOTXzWxtc pHSH/3RwQG6VK3OM/15rqW1x2MVq9yeFTNc+XoOTU22FbAtLhOxDIUcZrMVnAJQK4VPi ppVg== X-Gm-Message-State: AOJu0YxXUSxn94uR1Jt+6mrcAIm1OwJp1UENf2iX2y0l0u05yPuZE/e8 t6kADth/CDaRr424pkkHB7YdrLoripFdpuPJmaKJ+c6s4H6i1CQOaJ916zO05NzdZY8a5GkKVSl 4LgDZ+ApYZU3VHuaASucn4L7RGk1SYzP4sJtISthZGyOqQxdQ52ac2KdUE3fba8zJH1MDWDQ5 X-Received: by 2002:adf:ef50:0:b0:354:f44d:a020 with SMTP id ffacd0b85a97d-35dc00bf084mr2986433f8f.48.1717089655807; Thu, 30 May 2024 10:20:55 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFBHht46/0aHH98H3F2Btkvz/+IBrdTIlSs6v8sQAHIKqk2hS+lTqMGvUepjWfHpzCCT8C1Fg== X-Received: by 2002:adf:ef50:0:b0:354:f44d:a020 with SMTP id ffacd0b85a97d-35dc00bf084mr2986414f8f.48.1717089655287; Thu, 30 May 2024 10:20:55 -0700 (PDT) Received: from ?IPV6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-35dd04d94e6sm17916f8f.51.2024.05.30.10.20.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 30 May 2024 10:20:54 -0700 (PDT) Message-ID: Date: Thu, 30 May 2024 19:20:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 3/6] KVM: arm64: add emulation for CTR_EL0 register To: Sebastian Ott Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Catalin Marinas , Will Deacon References: <20240514072252.5657-1-sebott@redhat.com> <20240514072252.5657-4-sebott@redhat.com> <312fd3cf-2eb9-4a38-8c50-e3b7639c3cbc@redhat.com> From: Eric Auger In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240530_102103_047132_6958C3B4 X-CRM114-Status: GOOD ( 34.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 CgpPbiA1LzMwLzI0IDE0OjU2LCBTZWJhc3RpYW4gT3R0IHdyb3RlOgo+IEhlaiBFcmljLAo+IAo+ IE9uIFdlZCwgMjkgTWF5IDIwMjQsIEVyaWMgQXVnZXIgd3JvdGU6Cj4+IE9uIDUvMTQvMjQgMDk6 MjIsIFNlYmFzdGlhbiBPdHQgd3JvdGU6Cj4+PiArc3RhdGljIGludCB2YWxpZGF0ZV9jbGlkcl9l bDEodTY0IGNsaWRyX2VsMSwgdTY0IGN0cl9lbDApCj4+PiArewo+Pj4gK8KgwqDCoCB1NjQgaWRj ID0gIUNMSURSX0xPQyhjbGlkcl9lbDEpIHx8Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgICghQ0xJ RFJfTE9VSVMoY2xpZHJfZWwxKSAmJiAhQ0xJRFJfTE9VVShjbGlkcl9lbDEpKTsKPj4gVGhpcyBh Y3R1YWxseSBjb21wdXRlczoKPj4gQ0xJRFJfRUwxLkxvQyA9PSAwYjAwMCBvciAoQ0xJRFJfRUwx LkxvVUlTID09IDBiMDAwICYmCj4+IENMSURSX0VMMS5Mb1VVID09IDBiMDAwKQo+Pgo+PiByZWZl cmluZyB0byBBUk0gQVJNCj4+IFRlcm1pbm9sb2d5IGZvciBDbGVhbiwgSW52YWxpZGF0ZSwgYW5k IENsZWFuIGFuZCBJbnZhbGlkYXRlIGluc3RydWN0aW9ucwo+Pgo+PiAxKSBJZiB0aGUgTG9DIGZp ZWxkIHZhbHVlIGlzIDB4MCwgdGhpcyBtZWFucyB0aGF0IG5vIGxldmVscyBvZiBjYWNoZQo+PiBu ZWVkIHRvIGNsZWFuZWQgb3IgaW52YWxpZGF0ZWQKPj4gd2hlbiBjbGVhbmluZyBvciBpbnZhbGlk YXRpbmcgdG8gdGhlIFBvaW50IG9mIENvaGVyZW5jeS4KPj4KPj4gMikgSWYgdGhlIExvVVUgZmll bGQgdmFsdWUgaXMgMHgwLCB0aGlzIG1lYW5zIHRoYXQgbm8gbGV2ZWxzIG9mIGRhdGEKPj4gY2Fj aGUgbmVlZCB0byBiZSBjbGVhbmVkIG9yCj4+IGludmFsaWRhdGVkIHdoZW4gY2xlYW5pbmcgb3Ig aW52YWxpZGF0aW5nIHRvIHRoZSBQb2ludCBvZiBVbmlmaWNhdGlvbi4KPj4KPj4gMykgSWYgdGhl IExvVUlTIGZpZWxkIHZhbHVlIGlzIDB4MCwgdGhpcyBtZWFucyB0aGF0IG5vIGxldmVscyBvZiBk YXRhIG9yCj4+IHVuaWZpZWQgY2FjaGUgbmVlZCB0bwo+PiBjbGVhbmVkIG9yIGludmFsaWRhdGVk IHdoZW4gY2xlYW5pbmcgb3IgaW52YWxpZGF0aW5nIHRvIHRoZSBQb2ludCBvZgo+PiBVbmlmaWNh dGlvbiBmb3IgdGhlIElubmVyIFNoYXJlYWJsZSBzaGFyZWFiaWxpdHkgZG9tYWluLgo+Pgo+PiBz byB0byBtZSBpZiBhYm92ZSBjb21wdXRhdGlvbiBpcyB0cnVlIHRoaXMgbWVhbnMgd2hvIGhhdmUg bm8gbGV2ZWwgb2YKPj4gY2FjaGUgdG8gdGFrZSBjYXJlIG9mLCBzbyBhbHRob3VnaCBDVFJfRUww LklEQyA9IDAgd291bGQgbm9ybWFsbHkgbWVhbgo+PiB5b3UgbXVzdCAiRGF0YSBjYWNoZSBjbGVh biB0byB0aGUgUG9pbnQgb2YgVW5pZmljYXRpb24iIHRoYXQgaXMgbm90Cj4+IG5lZWRlZCBpbiB0 aGF0IGNhc2UuCj4+Cj4+IEJ1dCB0aGUgc3BlYyBkb2VzIG5vdCByZWFsbHkgc3RhdGUgdGhhdCBJ REM9MCBhbmQKPj4gbm9fbGV2ZWxfb2ZfY2FjaGVfdG9fY2xlYW5faW52IGFyZSBpbmNvbXBhdGli bGUgYXMgZmFyIGFzIEkgc2VlCj4gCj4gVGhpcyBpcyBqdXN0IGV4aXN0aW5nIGNvZGUgbW92ZWQg dG8gYSBoZWxwZXIuLgphZ3JlZWQgdGhpcyBjb21tZW50L3F1ZXN0aW9uIGlzIG5vdCByZWxhdGVk IHRvIHlvdXIgcGF0Y2gKCj4gCj4+PiArwqDCoMKgIGlmICgoY2xpZHJfZWwxICYgQ0xJRFJfRUwx X1JFUzApIHx8ICghKGN0cl9lbDAgJiBDVFJfRUwwX0lEQykgJiYKPj4+IGlkYykpPiArwqDCoMKg wqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+Cj4+IElzbid0IChjbGlkcl9lbDEgJiBDTElEUl9F TDFfUkVTMCkgYWxyZWFkeSBjaGVja2VkIGJ5Cj4+Cj4+IMKgwqDCoMKgwqDCoCB7IFNZU19ERVND KFNZU19DTElEUl9FTDEpLCBhY2Nlc3NfY2xpZHIsIHJlc2V0X2NsaWRyLCBDTElEUl9FTDEsCj4+ IMKgwqDCoMKgwqDCoMKgwqAgLnNldF91c2VyID0gc2V0X2NsaWRyLCAudmFsID0gfkNMSURSX0VM MV9SRVMwIH0sCj4+Cj4gCj4gTm9wZSwgdGhhdCB3b3VsZCBvbmx5IGJlIHRoZSBjYXNlIHdoZW4g YXJtNjRfY2hlY2tfZmVhdHVyZXMoKQo+IGlzIHVzZWQgKGJ5IGhhdmluZyBzZXRfaWRfcmVnKCkg Zm9yIHRoZSAuc2V0X3VzZXIgY2FsbGJhY2spLgpPSwo+IAo+Pj4gK3N0YXRpYyBpbnQgdmFsaWRh dGVfY2FjaGVfdG9wKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGN0cl9lbDApCj4+IHMvdG9w L3RvcG9sb2d5Pwo+IAo+IEhtLCB0aGF0IG5hbWUgaXMgYWxyZWFkeSBxdWlldCBsb25nLgp5ZXMg YnV0IHRvcCBkb2VzIG5vdCBtZWFuIG11Y2gKPiAKPj4+ICt7Cj4+PiArwqDCoMKgIGNvbnN0IHN0 cnVjdCBzeXNfcmVnX2Rlc2MgKmNsaWRyX2VsMTsKPj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGk7 Cj4+PiArwqDCoMKgIGludCByZXQ7Cj4+PiArCj4+PiArwqDCoMKgIGNsaWRyX2VsMSA9IGdldF9z eXNfcmVnX2Rlc2MoU1lTX0NMSURSX0VMMSk7Cj4+PiArwqDCoMKgIGlmICghY2xpZHJfZWwxKQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PRU5UOwo+Pj4gKwo+Pj4gK8KgwqDCoCByZXQg PSB2YWxpZGF0ZV9jbGlkcl9lbDEoX192Y3B1X3N5c19yZWcodmNwdSwgY2xpZHJfZWwxLT5yZWcp LAo+Pj4gY3RyX2VsMCk7Cj4+PiArwqDCoMKgIGlmIChyZXQpCj4+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIHJldDsKPj4+ICsKPj4+ICvCoMKgwqAgaWYgKCF2Y3B1LT5hcmNoLmNjc2lkcikKPj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+ICsKPj4gd29ydGggdG8gYWRkIGEgY29tbWVu dCBhYm91dCB3aGF0IHRoaXMgZG9lcyBhcyB0aGlzIGlzIG5vdAo+PiBzdHJhaWdoZm9yd2FyZCA7 LSkKPiAKPiBIbSwgImNoZWNrIGZvciB2YWxpZGl0eSBvZiB0aGUgY2FjaGUgdG9wb2xvZ3kiIC0g dGhhdCdzIGtpbmRhIHRoZQo+IGZ1bmN0aW9ucyBuYW1lLCBzbyBubyBhZGRlZCB2YWx1ZS4gIk1h a2Ugc3VyZSB0aGUgY2FjaGUgbGluZSBzaXplCj4gcGVyIGxldmVsIG9iZXlzIHRoZSBtaW5pbXVt IGNhY2hlIGxpbmUgc2V0dGluZyIgLSB3b3VsZCB0aGlzIGhlbHA/Cj4gQ2FuJ3QgdGhpbmsgb2Yg c210aCBlbHNlIHJpZ2h0IG5vdywgc3J5LiBTdWdnZXN0aW9ucz8KeWVzIHRoZSBsYXR0ZXIgaXMg ZmluZSB0byBtZQo+IAo+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgQ1NTRUxSX01BWDsgaSsr KSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKChGSUVMRF9HRVQoQ0NTSURSX0VMMV9MaW5lU2l6 ZSwgZ2V0X2Njc2lkcih2Y3B1LCBpKSkgKyA0KQo+PiBtYXliZSB1c2UgYSBsb2NhbCB2YXJpYWJs ZSBzdWNoIGFzIGxvZzJfY2FjaGVfYnl0ZXMKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDwg X19nZXRfbWluX2NhY2hlX2xpbmVfc2l6ZShjdHJfZWwwLCBpICYgQ1NTRUxSX0VMMV9JbkQpKQo+ PiBJIGRvbid0IGdldCBpICYgQ1NTRUxSX0VMMV9JbkQsIHBsZWFzZSBjYW4geW91IGV4cGxhaW4/ Cj4gCj4gSXQgZmxhZ3MgdGhlIGNhY2hlIGF0IHRoaXMgbGV2ZWwgYXMgYSBkYXRhIG9yIGluc3Ry dWN0aW9uIGNhY2hlIChzZWUgYWxzbwo+IGdldF9jY3NpZHIoKSkuCk9LIEkgdW5kZXJzdGFuZCB0 aGUgcHJpbmNpcGxlIG5vdy4gdGhhbmsgeW91Cj4gCj4+PiArc3RhdGljIGludCBzZXRfY3RyKHN0 cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYwo+Pj4gKnJkLAo+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIHU2NCB2YWwpCj4+PiArewo+PiBkb24ndCB5b3UgbmVl ZCB0byB0YWtlIHRoZSBjb25maWdfbG9jayBlYXJsaWVyIGFzIGluIHNldF9pZF9yZWcoKT8gaXNu J3QKPj4gaXQgcmFjeSB2ZXJzdXMgaGFzX3Jhbl9vbmNlPwo+IAo+IEkgd2FzIGFib3V0IHRvIHdy aXRlIHRoYXQgdGhpcyBpcyBub3QgdGhlIGNhc2Ugc2luY2UgdGhhdCdzIGFuIHJjdQo+IGFjY2Vz c2VkIHBvaW50ZXIgbm90IGd1YXJkZWQgYnkgdGhlIGNvbmZpZyBsb2NrIGJ1dCBJIGNvbmZ1c2Vk IHRoaXMKPiB3aXRoIHRoZSB2Y3B1X2hhc19ydW5fb25jZSgpIC4uLi4gYWdhaW4gOi0oCj4gCj4g SSdtIG5vdCBhIDEwMCUgc3VyZSB3ZSByZWFsbHkgbmVlZCB0aGF0IGJ1dCBJJ2xsIGp1c3QgbW92 ZSB0aGUgbG9jayB1cCAtCj4gaXQgZGVmaW5pdGVseSBkb2Vzbid0IGh1cnQuCnl1cAoKRXJpYwo+ IAo+Pj4gK8KgwqDCoCB1NjQgY3RyID0gdmNwdS0+a3ZtLT5hcmNoLmN0cl9lbDA7Cj4+PiArwqDC oMKgIHU2NCB3cml0YWJsZV9tYXNrID0gcmQtPnZhbDsKPj4+ICvCoMKgwqAgaW50IHJldDsKPj4+ ICsKPj4+ICvCoMKgwqAgaWYgKHZhbCA9PSBjdHIpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IDA7Cj4+PiArCj4+PiArwqDCoMKgIGlmIChrdm1fdm1faGFzX3Jhbl9vbmNlKHZjcHUtPmt2bSkp PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FQlVTWTs+ICsKPj4+ICvCoMKgwqAgaWYgKChjdHIg JiB+d3JpdGFibGVfbWFzaykgIT0gKHZhbCAmIH53cml0YWJsZV9tYXNrKSkKPj4+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPj4+ICsKPj4+ICvCoMKgwqAgaWYgKCgoY3RyICYgQ1RS X0VMMF9ESUNfTUFTSykgPCAodmFsICYgQ1RSX0VMMF9ESUNfTUFTSykpIHx8Cj4+PiArwqDCoMKg wqDCoMKgwqAgKChjdHIgJiBDVFJfRUwwX0lEQ19NQVNLKSA8ICh2YWwgJiBDVFJfRUwwX0lEQ19N QVNLKSkgfHwKPj4+ICvCoMKgwqDCoMKgwqDCoCAoKGN0ciAmIENUUl9FTDBfRG1pbkxpbmVfTUFT SykgPCAodmFsICYKPj4+IENUUl9FTDBfRG1pbkxpbmVfTUFTSykpIHx8Cj4+PiArwqDCoMKgwqDC oMKgwqAgKChjdHIgJiBDVFJfRUwwX0ltaW5MaW5lX01BU0spIDwgKHZhbCAmCj4+PiBDVFJfRUww X0ltaW5MaW5lX01BU0spKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+ Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKgIG11dGV4X2xvY2soJnZjcHUtPmt2bS0+YXJj aC5jb25maWdfbG9jayk7Cj4+PiArwqDCoMKgIHJldCA9IHZhbGlkYXRlX2NhY2hlX3RvcCh2Y3B1 LCB2YWwpOwo+Pj4gK8KgwqDCoCBpZiAocmV0KSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgbXV0ZXhf dW5sb2NrKCZ2Y3B1LT5rdm0tPmFyY2guY29uZmlnX2xvY2spOwo+Pj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiByZXQ7Cj4+IG5pdCB1c2UgYSBnb3RvIG91dAo+IAo+IFRoYW5rcywKPiBTZWJhc3Rp YW4KPiAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==