From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 896BF1FB5; Mon, 18 Mar 2024 14:14:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710771285; cv=none; b=gF+SlWiCX2n3IyvBJ42j1kUsJpp8IL2EVJtU9lqycZ7J6EeT72+kq8cuLODuQya7ME7xUxDsuxJusRGY5iePb2SCVMkHilFqu0F6OWjbJGlvEySUN3gB/3FGuxCHRlH+ehQnce/fuCkJ9cudaXR0eFnQnyFcmL8YBX+Bf093l3E= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710771285; c=relaxed/simple; bh=UO+5wsSGymUVPt4vVeQZ8EDKQ64Wom2tgJ8iYeh7rSY=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=CVGaMUbC009+QGrJKfbbY5UoezHR5rwHizkhKUMjhOznuXXf3nAxS7cD+bnLEBUiDdGSgsCY6jt8LnjbQvjfM/Xslrtb1HRzbgUieiL1QlKXOtIETITKAeSQarrVtjcF9v4g0vVqdZ4IdtucSFyminYx8OupXOoy35eDo2024io= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C94DBDA7; Mon, 18 Mar 2024 07:15:17 -0700 (PDT) Received: from [10.57.12.69] (unknown [10.57.12.69]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8F1013F67D; Mon, 18 Mar 2024 07:14:39 -0700 (PDT) Message-ID: Date: Mon, 18 Mar 2024 14:14:40 +0000 Precedence: bulk X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH 12/28] KVM: arm64: Support timers in realm RECs Content-Language: en-GB To: Ganapatrao Kulkarni , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev References: <20230127112248.136810-1-suzuki.poulose@arm.com> <20230127112932.38045-1-steven.price@arm.com> <20230127112932.38045-13-steven.price@arm.com> <9ae4b453-4d5b-4537-b004-4db60183019a@os.amperecomputing.com> From: Steven Price In-Reply-To: <9ae4b453-4d5b-4537-b004-4db60183019a@os.amperecomputing.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 18/03/2024 11:28, Ganapatrao Kulkarni wrote: > > > On 27-01-2023 04:59 pm, Steven Price wrote: >> The RMM keeps track of the timer while the realm REC is running, but on >> exit to the normal world KVM is responsible for handling the timers. >> >> Signed-off-by: Steven Price >> --- >>   arch/arm64/kvm/arch_timer.c  | 53 ++++++++++++++++++++++++++++++++---- >>   include/kvm/arm_arch_timer.h |  2 ++ >>   2 files changed, 49 insertions(+), 6 deletions(-) >> >> diff --git a/arch/arm64/kvm/arch_timer.c b/arch/arm64/kvm/arch_timer.c >> index bb24a76b4224..d4af9ee58550 100644 >> --- a/arch/arm64/kvm/arch_timer.c >> +++ b/arch/arm64/kvm/arch_timer.c >> @@ -130,6 +130,11 @@ static void timer_set_offset(struct >> arch_timer_context *ctxt, u64 offset) >>   { >>       struct kvm_vcpu *vcpu = ctxt->vcpu; >>   +    if (kvm_is_realm(vcpu->kvm)) { >> +        WARN_ON(offset); >> +        return; >> +    } >> + >>       switch(arch_timer_ctx_index(ctxt)) { >>       case TIMER_VTIMER: >>           __vcpu_sys_reg(vcpu, CNTVOFF_EL2) = offset; >> @@ -411,6 +416,21 @@ static void kvm_timer_update_irq(struct kvm_vcpu >> *vcpu, bool new_level, >>       } >>   } >>   +void kvm_realm_timers_update(struct kvm_vcpu *vcpu) >> +{ >> +    struct arch_timer_cpu *arch_timer = &vcpu->arch.timer_cpu; >> +    int i; >> + >> +    for (i = 0; i < NR_KVM_TIMERS; i++) { > > Do we required to check for all timers, is realm/rmm uses hyp timers? Good point, the realm guest can't use the hyp timers, so this should be NR_KVM_EL0_TIMERS. The hyp timers are used by the host to interrupt the guest execution. I think this code was written before NV support added the extra timers. >> +        struct arch_timer_context *timer = &arch_timer->timers[i]; >> +        bool status = timer_get_ctl(timer) & ARCH_TIMER_CTRL_IT_STAT; >> +        bool level = kvm_timer_irq_can_fire(timer) && status; >> + >> +        if (level != timer->irq.level) >> +            kvm_timer_update_irq(vcpu, level, timer); >> +    } >> +} >> + >>   /* Only called for a fully emulated timer */ >>   static void timer_emulate(struct arch_timer_context *ctx) >>   { >> @@ -621,6 +641,11 @@ void kvm_timer_vcpu_load(struct kvm_vcpu *vcpu) >>       if (unlikely(!timer->enabled)) >>           return; >>   +    kvm_timer_unblocking(vcpu); >> + >> +    if (vcpu_is_rec(vcpu)) >> +        return; >> + > > For realm, timer->enabled is not set, load returns before this check. True, this can be simplified. Thanks. Steve >>       get_timer_map(vcpu, &map); >>         if (static_branch_likely(&has_gic_active_state)) { >> @@ -633,8 +658,6 @@ void kvm_timer_vcpu_load(struct kvm_vcpu *vcpu) >>         set_cntvoff(timer_get_offset(map.direct_vtimer)); >>   -    kvm_timer_unblocking(vcpu); >> - >>       timer_restore_state(map.direct_vtimer); >>       if (map.direct_ptimer) >>           timer_restore_state(map.direct_ptimer); >> @@ -668,6 +691,9 @@ void kvm_timer_vcpu_put(struct kvm_vcpu *vcpu) >>       if (unlikely(!timer->enabled)) >>           return; >>   +    if (vcpu_is_rec(vcpu)) >> +        goto out; >> + >>       get_timer_map(vcpu, &map); >>         timer_save_state(map.direct_vtimer); >> @@ -686,9 +712,6 @@ void kvm_timer_vcpu_put(struct kvm_vcpu *vcpu) >>       if (map.emul_ptimer) >>           soft_timer_cancel(&map.emul_ptimer->hrtimer); >>   -    if (kvm_vcpu_is_blocking(vcpu)) >> -        kvm_timer_blocking(vcpu); >> - >>       /* >>        * The kernel may decide to run userspace after calling >> vcpu_put, so >>        * we reset cntvoff to 0 to ensure a consistent read between user >> @@ -697,6 +720,11 @@ void kvm_timer_vcpu_put(struct kvm_vcpu *vcpu) >>        * virtual offset of zero, so no need to zero CNTVOFF_EL2 register. >>        */ >>       set_cntvoff(0); >> + >> +out: >> +    if (kvm_vcpu_is_blocking(vcpu)) >> +        kvm_timer_blocking(vcpu); >> + >>   } >>     /* >> @@ -785,12 +813,18 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu) >>       struct arch_timer_cpu *timer = vcpu_timer(vcpu); >>       struct arch_timer_context *vtimer = vcpu_vtimer(vcpu); >>       struct arch_timer_context *ptimer = vcpu_ptimer(vcpu); >> +    u64 cntvoff; >>         vtimer->vcpu = vcpu; >>       ptimer->vcpu = vcpu; >>   +    if (kvm_is_realm(vcpu->kvm)) >> +        cntvoff = 0; >> +    else >> +        cntvoff = kvm_phys_timer_read(); >> + >>       /* Synchronize cntvoff across all vtimers of a VM. */ >> -    update_vtimer_cntvoff(vcpu, kvm_phys_timer_read()); >> +    update_vtimer_cntvoff(vcpu, cntvoff); >>       timer_set_offset(ptimer, 0); >>         hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, >> HRTIMER_MODE_ABS_HARD); >> @@ -1265,6 +1299,13 @@ int kvm_timer_enable(struct kvm_vcpu *vcpu) >>           return -EINVAL; >>       } >>   +    /* >> +     * We don't use mapped IRQs for Realms because the RMI doesn't allow >> +     * us setting the LR.HW bit in the VGIC. >> +     */ >> +    if (vcpu_is_rec(vcpu)) >> +        return 0; >> + >>       get_timer_map(vcpu, &map); >>         ret = kvm_vgic_map_phys_irq(vcpu, >> diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h >> index cd6d8f260eab..158280e15a33 100644 >> --- a/include/kvm/arm_arch_timer.h >> +++ b/include/kvm/arm_arch_timer.h >> @@ -76,6 +76,8 @@ int kvm_arm_timer_set_attr(struct kvm_vcpu *vcpu, >> struct kvm_device_attr *attr); >>   int kvm_arm_timer_get_attr(struct kvm_vcpu *vcpu, struct >> kvm_device_attr *attr); >>   int kvm_arm_timer_has_attr(struct kvm_vcpu *vcpu, struct >> kvm_device_attr *attr); >>   +void kvm_realm_timers_update(struct kvm_vcpu *vcpu); >> + >>   u64 kvm_phys_timer_read(void); >>     void kvm_timer_vcpu_load(struct kvm_vcpu *vcpu); > > Thanks, > Ganapat 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 94520C54E5D for ; Mon, 18 Mar 2024 14:15:00 +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=Z5gKXC9p5QDKZWrvLiCj2awpbeAfbuDlhYDOziytS9g=; b=4MvxC08GtOwQAU 0VVDf7f+EAC+gbzGMyEDaif6iLj+VUQCHVii00RNQU5xZ6LM6hDcmD3LzLO1UWD94R/F6hbG2bUg+ IiR2U+u2Z9uNwOPxyUJ28uUYHO/w9N5irEBddJDMWXXePlTG5Cy9cKpqAe+TsqWwRDSHOp75evlZW 8rNnCZJC4Fkh6+Sdb39+VOPLMWj+qPkbw9MXRDmlf0KjpHYAUH/U3sMT3iMn8i8Uco+eOFUh1dIhs SjrYxj6xypl+B+u33aJifjwNS4veP/fcXC+vnxnUunT8g6TnWP8YtZeGsCMntEjzLNhi5kcQ8PyWl 1s13SxK70sqaQJzYWQxA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmDlI-00000008laW-1X2X; Mon, 18 Mar 2024 14:14:48 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rmDlF-00000008lZs-0OO9 for linux-arm-kernel@lists.infradead.org; Mon, 18 Mar 2024 14:14:46 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C94DBDA7; Mon, 18 Mar 2024 07:15:17 -0700 (PDT) Received: from [10.57.12.69] (unknown [10.57.12.69]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8F1013F67D; Mon, 18 Mar 2024 07:14:39 -0700 (PDT) Message-ID: Date: Mon, 18 Mar 2024 14:14:40 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH 12/28] KVM: arm64: Support timers in realm RECs Content-Language: en-GB To: Ganapatrao Kulkarni , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev References: <20230127112248.136810-1-suzuki.poulose@arm.com> <20230127112932.38045-1-steven.price@arm.com> <20230127112932.38045-13-steven.price@arm.com> <9ae4b453-4d5b-4537-b004-4db60183019a@os.amperecomputing.com> From: Steven Price In-Reply-To: <9ae4b453-4d5b-4537-b004-4db60183019a@os.amperecomputing.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240318_071445_251393_C4E6AE50 X-CRM114-Status: GOOD ( 23.41 ) 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 T24gMTgvMDMvMjAyNCAxMToyOCwgR2FuYXBhdHJhbyBLdWxrYXJuaSB3cm90ZToKPiAKPiAKPiBP biAyNy0wMS0yMDIzIDA0OjU5IHBtLCBTdGV2ZW4gUHJpY2Ugd3JvdGU6Cj4+IFRoZSBSTU0ga2Vl cHMgdHJhY2sgb2YgdGhlIHRpbWVyIHdoaWxlIHRoZSByZWFsbSBSRUMgaXMgcnVubmluZywgYnV0 IG9uCj4+IGV4aXQgdG8gdGhlIG5vcm1hbCB3b3JsZCBLVk0gaXMgcmVzcG9uc2libGUgZm9yIGhh bmRsaW5nIHRoZSB0aW1lcnMuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFN0ZXZlbiBQcmljZSA8c3Rl dmVuLnByaWNlQGFybS5jb20+Cj4+IC0tLQo+PiDCoCBhcmNoL2FybTY0L2t2bS9hcmNoX3RpbWVy LmPCoCB8IDUzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQo+PiDCoCBpbmNs dWRlL2t2bS9hcm1fYXJjaF90aW1lci5oIHzCoCAyICsrCj4+IMKgIDIgZmlsZXMgY2hhbmdlZCwg NDkgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2FyY2gv YXJtNjQva3ZtL2FyY2hfdGltZXIuYyBiL2FyY2gvYXJtNjQva3ZtL2FyY2hfdGltZXIuYwo+PiBp bmRleCBiYjI0YTc2YjQyMjQuLmQ0YWY5ZWU1ODU1MCAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02 NC9rdm0vYXJjaF90aW1lci5jCj4+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2FyY2hfdGltZXIuYwo+ PiBAQCAtMTMwLDYgKzEzMCwxMSBAQCBzdGF0aWMgdm9pZCB0aW1lcl9zZXRfb2Zmc2V0KHN0cnVj dAo+PiBhcmNoX3RpbWVyX2NvbnRleHQgKmN0eHQsIHU2NCBvZmZzZXQpCj4+IMKgIHsKPj4gwqDC oMKgwqDCoCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBjdHh0LT52Y3B1Owo+PiDCoCArwqDCoMKg IGlmIChrdm1faXNfcmVhbG0odmNwdS0+a3ZtKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgV0FSTl9P TihvZmZzZXQpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArwqDCoMKgIH0KPj4gKwo+ PiDCoMKgwqDCoMKgIHN3aXRjaChhcmNoX3RpbWVyX2N0eF9pbmRleChjdHh0KSkgewo+PiDCoMKg wqDCoMKgIGNhc2UgVElNRVJfVlRJTUVSOgo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgX192Y3B1X3N5 c19yZWcodmNwdSwgQ05UVk9GRl9FTDIpID0gb2Zmc2V0Owo+PiBAQCAtNDExLDYgKzQxNiwyMSBA QCBzdGF0aWMgdm9pZCBrdm1fdGltZXJfdXBkYXRlX2lycShzdHJ1Y3Qga3ZtX3ZjcHUKPj4gKnZj cHUsIGJvb2wgbmV3X2xldmVsLAo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgfQo+PiDCoCArdm9pZCBr dm1fcmVhbG1fdGltZXJzX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4+ICt7Cj4+ICvC oMKgwqAgc3RydWN0IGFyY2hfdGltZXJfY3B1ICphcmNoX3RpbWVyID0gJnZjcHUtPmFyY2gudGlt ZXJfY3B1Owo+PiArwqDCoMKgIGludCBpOwo+PiArCj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8 IE5SX0tWTV9USU1FUlM7IGkrKykgewo+IAo+IERvIHdlIHJlcXVpcmVkIHRvIGNoZWNrIGZvciBh bGwgdGltZXJzLCBpcyByZWFsbS9ybW0gdXNlcyBoeXAgdGltZXJzPwoKR29vZCBwb2ludCwgdGhl IHJlYWxtIGd1ZXN0IGNhbid0IHVzZSB0aGUgaHlwIHRpbWVycywgc28gdGhpcyBzaG91bGQgYmUK TlJfS1ZNX0VMMF9USU1FUlMuIFRoZSBoeXAgdGltZXJzIGFyZSB1c2VkIGJ5IHRoZSBob3N0IHRv IGludGVycnVwdCB0aGUKZ3Vlc3QgZXhlY3V0aW9uLiBJIHRoaW5rIHRoaXMgY29kZSB3YXMgd3Jp dHRlbiBiZWZvcmUgTlYgc3VwcG9ydCBhZGRlZAp0aGUgZXh0cmEgdGltZXJzLgoKPj4gK8KgwqDC oMKgwqDCoMKgIHN0cnVjdCBhcmNoX3RpbWVyX2NvbnRleHQgKnRpbWVyID0gJmFyY2hfdGltZXIt PnRpbWVyc1tpXTsKPj4gK8KgwqDCoMKgwqDCoMKgIGJvb2wgc3RhdHVzID0gdGltZXJfZ2V0X2N0 bCh0aW1lcikgJiBBUkNIX1RJTUVSX0NUUkxfSVRfU1RBVDsKPj4gK8KgwqDCoMKgwqDCoMKgIGJv b2wgbGV2ZWwgPSBrdm1fdGltZXJfaXJxX2Nhbl9maXJlKHRpbWVyKSAmJiBzdGF0dXM7Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChsZXZlbCAhPSB0aW1lci0+aXJxLmxldmVsKQo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBrdm1fdGltZXJfdXBkYXRlX2lycSh2Y3B1LCBsZXZlbCwgdGlt ZXIpOwo+PiArwqDCoMKgIH0KPj4gK30KPj4gKwo+PiDCoCAvKiBPbmx5IGNhbGxlZCBmb3IgYSBm dWxseSBlbXVsYXRlZCB0aW1lciAqLwo+PiDCoCBzdGF0aWMgdm9pZCB0aW1lcl9lbXVsYXRlKHN0 cnVjdCBhcmNoX3RpbWVyX2NvbnRleHQgKmN0eCkKPj4gwqAgewo+PiBAQCAtNjIxLDYgKzY0MSwx MSBAQCB2b2lkIGt2bV90aW1lcl92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiDC oMKgwqDCoMKgIGlmICh1bmxpa2VseSghdGltZXItPmVuYWJsZWQpKQo+PiDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0dXJuOwo+PiDCoCArwqDCoMKgIGt2bV90aW1lcl91bmJsb2NraW5nKHZjcHUpOwo+ PiArCj4+ICvCoMKgwqAgaWYgKHZjcHVfaXNfcmVjKHZjcHUpKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuOwo+PiArCj4gCj4gRm9yIHJlYWxtLCB0aW1lci0+ZW5hYmxlZCBpcyBub3Qgc2V0LCBs b2FkIHJldHVybnMgYmVmb3JlIHRoaXMgY2hlY2suCgpUcnVlLCB0aGlzIGNhbiBiZSBzaW1wbGlm aWVkLiBUaGFua3MuCgpTdGV2ZQoKPj4gwqDCoMKgwqDCoCBnZXRfdGltZXJfbWFwKHZjcHUsICZt YXApOwo+PiDCoCDCoMKgwqDCoMKgIGlmIChzdGF0aWNfYnJhbmNoX2xpa2VseSgmaGFzX2dpY19h Y3RpdmVfc3RhdGUpKSB7Cj4+IEBAIC02MzMsOCArNjU4LDYgQEAgdm9pZCBrdm1fdGltZXJfdmNw dV9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKPj4gwqAgwqDCoMKgwqDCoCBzZXRfY250dm9m Zih0aW1lcl9nZXRfb2Zmc2V0KG1hcC5kaXJlY3RfdnRpbWVyKSk7Cj4+IMKgIC3CoMKgwqAga3Zt X3RpbWVyX3VuYmxvY2tpbmcodmNwdSk7Cj4+IC0KPj4gwqDCoMKgwqDCoCB0aW1lcl9yZXN0b3Jl X3N0YXRlKG1hcC5kaXJlY3RfdnRpbWVyKTsKPj4gwqDCoMKgwqDCoCBpZiAobWFwLmRpcmVjdF9w dGltZXIpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB0aW1lcl9yZXN0b3JlX3N0YXRlKG1hcC5kaXJl Y3RfcHRpbWVyKTsKPj4gQEAgLTY2OCw2ICs2OTEsOSBAQCB2b2lkIGt2bV90aW1lcl92Y3B1X3B1 dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4+IMKgwqDCoMKgwqAgaWYgKHVubGlrZWx5KCF0aW1l ci0+ZW5hYmxlZCkpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+IMKgICvCoMKgwqAg aWYgKHZjcHVfaXNfcmVjKHZjcHUpKQo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4+ICsK Pj4gwqDCoMKgwqDCoCBnZXRfdGltZXJfbWFwKHZjcHUsICZtYXApOwo+PiDCoCDCoMKgwqDCoMKg IHRpbWVyX3NhdmVfc3RhdGUobWFwLmRpcmVjdF92dGltZXIpOwo+PiBAQCAtNjg2LDkgKzcxMiw2 IEBAIHZvaWQga3ZtX3RpbWVyX3ZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKPj4gwqDC oMKgwqDCoCBpZiAobWFwLmVtdWxfcHRpbWVyKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgc29mdF90 aW1lcl9jYW5jZWwoJm1hcC5lbXVsX3B0aW1lci0+aHJ0aW1lcik7Cj4+IMKgIC3CoMKgwqAgaWYg KGt2bV92Y3B1X2lzX2Jsb2NraW5nKHZjcHUpKQo+PiAtwqDCoMKgwqDCoMKgwqAga3ZtX3RpbWVy X2Jsb2NraW5nKHZjcHUpOwo+PiAtCj4+IMKgwqDCoMKgwqAgLyoKPj4gwqDCoMKgwqDCoMKgICog VGhlIGtlcm5lbCBtYXkgZGVjaWRlIHRvIHJ1biB1c2Vyc3BhY2UgYWZ0ZXIgY2FsbGluZwo+PiB2 Y3B1X3B1dCwgc28KPj4gwqDCoMKgwqDCoMKgICogd2UgcmVzZXQgY250dm9mZiB0byAwIHRvIGVu c3VyZSBhIGNvbnNpc3RlbnQgcmVhZCBiZXR3ZWVuIHVzZXIKPj4gQEAgLTY5Nyw2ICs3MjAsMTEg QEAgdm9pZCBrdm1fdGltZXJfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiDCoMKg wqDCoMKgwqAgKiB2aXJ0dWFsIG9mZnNldCBvZiB6ZXJvLCBzbyBubyBuZWVkIHRvIHplcm8gQ05U Vk9GRl9FTDIgcmVnaXN0ZXIuCj4+IMKgwqDCoMKgwqDCoCAqLwo+PiDCoMKgwqDCoMKgIHNldF9j bnR2b2ZmKDApOwo+PiArCj4+ICtvdXQ6Cj4+ICvCoMKgwqAgaWYgKGt2bV92Y3B1X2lzX2Jsb2Nr aW5nKHZjcHUpKQo+PiArwqDCoMKgwqDCoMKgwqAga3ZtX3RpbWVyX2Jsb2NraW5nKHZjcHUpOwo+ PiArCj4+IMKgIH0KPj4gwqAgwqAgLyoKPj4gQEAgLTc4NSwxMiArODEzLDE4IEBAIHZvaWQga3Zt X3RpbWVyX3ZjcHVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4+IMKgwqDCoMKgwqAgc3Ry dWN0IGFyY2hfdGltZXJfY3B1ICp0aW1lciA9IHZjcHVfdGltZXIodmNwdSk7Cj4+IMKgwqDCoMKg wqAgc3RydWN0IGFyY2hfdGltZXJfY29udGV4dCAqdnRpbWVyID0gdmNwdV92dGltZXIodmNwdSk7 Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGFyY2hfdGltZXJfY29udGV4dCAqcHRpbWVyID0gdmNwdV9w dGltZXIodmNwdSk7Cj4+ICvCoMKgwqAgdTY0IGNudHZvZmY7Cj4+IMKgIMKgwqDCoMKgwqAgdnRp bWVyLT52Y3B1ID0gdmNwdTsKPj4gwqDCoMKgwqDCoCBwdGltZXItPnZjcHUgPSB2Y3B1Owo+PiDC oCArwqDCoMKgIGlmIChrdm1faXNfcmVhbG0odmNwdS0+a3ZtKSkKPj4gK8KgwqDCoMKgwqDCoMKg IGNudHZvZmYgPSAwOwo+PiArwqDCoMKgIGVsc2UKPj4gK8KgwqDCoMKgwqDCoMKgIGNudHZvZmYg PSBrdm1fcGh5c190aW1lcl9yZWFkKCk7Cj4+ICsKPj4gwqDCoMKgwqDCoCAvKiBTeW5jaHJvbml6 ZSBjbnR2b2ZmIGFjcm9zcyBhbGwgdnRpbWVycyBvZiBhIFZNLiAqLwo+PiAtwqDCoMKgIHVwZGF0 ZV92dGltZXJfY250dm9mZih2Y3B1LCBrdm1fcGh5c190aW1lcl9yZWFkKCkpOwo+PiArwqDCoMKg IHVwZGF0ZV92dGltZXJfY250dm9mZih2Y3B1LCBjbnR2b2ZmKTsKPj4gwqDCoMKgwqDCoCB0aW1l cl9zZXRfb2Zmc2V0KHB0aW1lciwgMCk7Cj4+IMKgIMKgwqDCoMKgwqAgaHJ0aW1lcl9pbml0KCZ0 aW1lci0+YmdfdGltZXIsIENMT0NLX01PTk9UT05JQywKPj4gSFJUSU1FUl9NT0RFX0FCU19IQVJE KTsKPj4gQEAgLTEyNjUsNiArMTI5OSwxMyBAQCBpbnQga3ZtX3RpbWVyX2VuYWJsZShzdHJ1Y3Qg a3ZtX3ZjcHUgKnZjcHUpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPj4g wqDCoMKgwqDCoCB9Cj4+IMKgICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogV2UgZG9uJ3QgdXNl IG1hcHBlZCBJUlFzIGZvciBSZWFsbXMgYmVjYXVzZSB0aGUgUk1JIGRvZXNuJ3QgYWxsb3cKPj4g K8KgwqDCoMKgICogdXMgc2V0dGluZyB0aGUgTFIuSFcgYml0IGluIHRoZSBWR0lDLgo+PiArwqDC oMKgwqAgKi8KPj4gK8KgwqDCoCBpZiAodmNwdV9pc19yZWModmNwdSkpCj4+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm4gMDsKPj4gKwo+PiDCoMKgwqDCoMKgIGdldF90aW1lcl9tYXAodmNwdSwgJm1h cCk7Cj4+IMKgIMKgwqDCoMKgwqAgcmV0ID0ga3ZtX3ZnaWNfbWFwX3BoeXNfaXJxKHZjcHUsCj4+ IGRpZmYgLS1naXQgYS9pbmNsdWRlL2t2bS9hcm1fYXJjaF90aW1lci5oIGIvaW5jbHVkZS9rdm0v YXJtX2FyY2hfdGltZXIuaAo+PiBpbmRleCBjZDZkOGYyNjBlYWIuLjE1ODI4MGUxNWEzMyAxMDA2 NDQKPj4gLS0tIGEvaW5jbHVkZS9rdm0vYXJtX2FyY2hfdGltZXIuaAo+PiArKysgYi9pbmNsdWRl L2t2bS9hcm1fYXJjaF90aW1lci5oCj4+IEBAIC03Niw2ICs3Niw4IEBAIGludCBrdm1fYXJtX3Rp bWVyX3NldF9hdHRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKPj4gc3RydWN0IGt2bV9kZXZpY2Vf YXR0ciAqYXR0cik7Cj4+IMKgIGludCBrdm1fYXJtX3RpbWVyX2dldF9hdHRyKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSwgc3RydWN0Cj4+IGt2bV9kZXZpY2VfYXR0ciAqYXR0cik7Cj4+IMKgIGludCBr dm1fYXJtX3RpbWVyX2hhc19hdHRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0Cj4+IGt2 bV9kZXZpY2VfYXR0ciAqYXR0cik7Cj4+IMKgICt2b2lkIGt2bV9yZWFsbV90aW1lcnNfdXBkYXRl KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cj4+ICsKPj4gwqAgdTY0IGt2bV9waHlzX3RpbWVyX3Jl YWQodm9pZCk7Cj4+IMKgIMKgIHZvaWQga3ZtX3RpbWVyX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3Zj cHUgKnZjcHUpOwo+IAo+IFRoYW5rcywKPiBHYW5hcGF0CgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QK bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=