From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d83LM-00036Z-0D for qemu-devel@nongnu.org; Tue, 09 May 2017 07:30:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d83LH-0001EY-Uf for qemu-devel@nongnu.org; Tue, 09 May 2017 07:30:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42644) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d83LH-0001Dt-LU for qemu-devel@nongnu.org; Tue, 09 May 2017 07:30:11 -0400 From: Markus Armbruster References: <20170505193810.2934-1-eblake@redhat.com> <20170505193810.2934-3-eblake@redhat.com> <87zien433w.fsf@dusky.pond.sub.org> Date: Tue, 09 May 2017 13:30:01 +0200 In-Reply-To: (Eric Blake's message of "Mon, 8 May 2017 13:33:41 -0500") Message-ID: <8737ceqnd2.fsf@dusky.pond.sub.org> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [PATCH v6 2/5] shutdown: Prepare for use of an enum in reset/shutdown_request List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eric Blake Cc: Stefano Stabellini , Eduardo Habkost , Juan Quintela , "Michael S. Tsirkin" , qemu-devel@nongnu.org, alistair.francis@xilinx.com, Paolo Bonzini , Anthony Perard , "open list:X86" , Richard Henderson , "Dr. David Alan Gilbert" , zhanghailiang Eric Blake writes: > On 05/08/2017 01:26 PM, Markus Armbruster wrote: >> Eric Blake writes: >> >>> We want to track why a guest was shutdown; in particular, being able >>> to tell the difference between a guest request (such as ACPI request) >>> and host request (such as SIGINT) will prove useful to libvirt. >>> Since all requests eventually end up changing shutdown_requested in >>> vl.c, the logical change is to make that value track the reason, >>> rather than its current 0/1 contents. >>> >>> Since command-line options control whether a reset request is turned >>> into a shutdown request instead, the same treatment is given to >>> reset_requested. >>> >>> This patch adds an internal enum ShutdownCause that describes reasons >>> that a shutdown can be requested, and changes qemu_system_reset() to >>> pass the reason through, although for now it is not reported. The >>> enum could be exported via QAPI at a later date, if deemed necessary, >>> but for now, there has not been a request to expose that much detail >>> to end clients. >>> >>> For now, we only populate the reason with HOST_ERROR, along with FIXME >>> comments that describe our plans for how to pass an actual correct >>> reason. >> >> In other words, replacing 0 by SHUTDOWN_CAUSE_NONE, and 1 by >> SHUTDOWN_CAUSE_HOST_ERROR. Makes sense. > > Maybe I could have ordered HOST_ERROR to actually be 1... Might be marginally worthwhile if you can split patches so that the one replacing int by ShutdownCause doesn't change anything but names. >>> +/* Enumeration of various causes for shutdown. */ >>> +typedef enum ShutdownCause ShutdownCause; >>> +enum ShutdownCause { >> >> Why define the typedef separately here? What's wrong with >> >> typedef enum ShutdownCause { >> ... >> } ShutdownCause; >> >> ? > > That would work too. I don't know if the code base has a strong > preference for one form over the other. I don't have numbers, but I think we use the split form pretty much only when there's a reason for the split, such as defining an incomplete type in a header, and completing it elsewhere. >>> + SHUTDOWN_CAUSE_NONE, /* No shutdown requested yet */ >> >> Comment is fine. Possible alternative: /* No shutdown request pending */ >> >>> + SHUTDOWN_CAUSE_HOST_QMP, /* Reaction to a QMP command, like 'quit' */ >>> + SHUTDOWN_CAUSE_HOST_SIGNAL, /* Reaction to a signal, such as SIGINT */ >>> + SHUTDOWN_CAUSE_HOST_UI, /* Reaction to UI event, like window close */ >>> + SHUTDOWN_CAUSE_HOST_ERROR, /* An error prevents further use of guest */ > > ...rather than 4. I don't know that it matters much. > > >>> -static int qemu_reset_requested(void) >>> +static ShutdownCause qemu_reset_requested(void) >>> { >>> - int r = reset_requested; >>> + ShutdownCause r = reset_requested; >> >> Good opportunity to insert a blank line here. >> > > Sure. > >>> if (r && replay_checkpoint(CHECKPOINT_RESET_REQUESTED)) { >>> - reset_requested = 0; >>> + reset_requested = SHUTDOWN_CAUSE_NONE; >>> return r; >>> } >>> - return false; >>> + return SHUTDOWN_CAUSE_NONE; >>> } >>> >>> static int qemu_suspend_requested(void) >>> @@ -1686,7 +1687,12 @@ static int qemu_debug_requested(void) >>> return r; >>> } >>> >>> -void qemu_system_reset(bool report) >>> +/* >>> + * Reset the VM. If @report is VMRESET_REPORT, issue an event, using >>> + * the @reason interpreted as ShutdownCause for details. Otherwise, >>> + * @report is VMRESET_SILENT and @reason is ignored. >>> + */ >> >> "interpreted as ShutdownCause"? It *is* a ShutdownCause. Leftover? > > Oh, yeah. In v5, the parameter was 'int'. Easy enough to clean up :) >>> +void qemu_system_reset(bool report, ShutdownCause reason) >>> { >>> MachineClass *mc; >>> >>> @@ -1700,6 +1706,7 @@ void qemu_system_reset(bool report) >>> qemu_devices_reset(); >>> } >>> if (report) { >>> + assert(reason); >>> qapi_event_send_reset(&error_abort); >>> } >>> cpu_synchronize_all_post_reset(); >> >> Looks like we're not using @reason "for details" just yet. > > Correct. I can add a FIXME (to be removed in the later patch where it is > used) if that is desired. Not necessary if the function comment refrains from claiming it *is* used. >>> @@ -1807,7 +1815,7 @@ void qemu_system_killed(int signal, pid_t pid) >>> /* Cannot call qemu_system_shutdown_request directly because >>> * we are in a signal handler. >>> */ >>> - shutdown_requested = 1; >>> + shutdown_requested = SHUTDOWN_CAUSE_HOST_SIGNAL; >> >> Should this be SHUTDOWN_CAUSE_HOST_ERROR, to be updated in the next >> patch? Alternatively, tweak this patch's commit message? > > This is the one case that we actually do have a strong cause affiliated > with the reason without having to resort to changing function > signatures. Commit message tweak is better. Works for me. >>> @@ -1846,13 +1855,16 @@ void qemu_system_debug_request(void) >>> static bool main_loop_should_exit(void) >>> { >>> RunState r; >>> + ShutdownCause request; >>> + >>> if (qemu_debug_requested()) { >>> vm_stop(RUN_STATE_DEBUG); >>> } >>> if (qemu_suspend_requested()) { >>> qemu_system_suspend(); >>> } >>> - if (qemu_shutdown_requested()) { >>> + request = qemu_shutdown_requested(); >>> + if (request) { >>> qemu_kill_report(); >>> qapi_event_send_shutdown(&error_abort); >>> if (no_shutdown) { >> >> The detour through @request appears isn't necessary here. Perhaps you >> do it for consistency with the next hunk. Do you? Just asking to make >> sure I get what you're doing. > > Consistency with the next hunk, AND because a later patch then uses > 'request' to pass an additional parameter to qapi_event_send_shutdown(). > >> >> Hmm, there's another one in xen-hvm.c, but consistency hardly applies >> there. If later patches add more uses, you might want delay the change >> until then. > > Can do, if it makes incremental reviews easier. Use your judgement. >>> +++ b/migration/savevm.c >>> @@ -2300,7 +2300,7 @@ int load_vmstate(const char *name) >>> return -EINVAL; >>> } >>> >>> - qemu_system_reset(VMRESET_SILENT); >>> + qemu_system_reset(VMRESET_SILENT, SHUTDOWN_CAUSE_NONE); >>> mis->from_src_file = f; >>> >>> aio_context_acquire(aio_context); >> >> You seem to be passing SHUTDOWN_CAUSE_NONE exactly with VMRESET_SILENT. >> Would it be possible to have SHUTDOWN_CAUSE_NONE imply !report, any >> other case imply report, and get rid of the first parameter? > > Indeed, and it would also get rid of the ugly > #define VMRESET_SILENT false I'd love that. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Markus Armbruster Subject: Re: [Qemu-devel] [PATCH v6 2/5] shutdown: Prepare for use of an enum in reset/shutdown_request Date: Tue, 09 May 2017 13:30:01 +0200 Message-ID: <8737ceqnd2.fsf@dusky.pond.sub.org> References: <20170505193810.2934-1-eblake@redhat.com> <20170505193810.2934-3-eblake@redhat.com> <87zien433w.fsf@dusky.pond.sub.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d83LJ-0002qI-T0 for xen-devel@lists.xenproject.org; Tue, 09 May 2017 11:30:14 +0000 In-Reply-To: (Eric Blake's message of "Mon, 8 May 2017 13:33:41 -0500") List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Eric Blake Cc: Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Juan Quintela , qemu-devel@nongnu.org, alistair.francis@xilinx.com, zhanghailiang , "open list:X86" , Anthony Perard , Paolo Bonzini , "Dr. David Alan Gilbert" , Richard Henderson List-Id: xen-devel@lists.xenproject.org RXJpYyBCbGFrZSA8ZWJsYWtlQHJlZGhhdC5jb20+IHdyaXRlczoKCj4gT24gMDUvMDgvMjAxNyAw MToyNiBQTSwgTWFya3VzIEFybWJydXN0ZXIgd3JvdGU6Cj4+IEVyaWMgQmxha2UgPGVibGFrZUBy ZWRoYXQuY29tPiB3cml0ZXM6Cj4+IAo+Pj4gV2Ugd2FudCB0byB0cmFjayB3aHkgYSBndWVzdCB3 YXMgc2h1dGRvd247IGluIHBhcnRpY3VsYXIsIGJlaW5nIGFibGUKPj4+IHRvIHRlbGwgdGhlIGRp ZmZlcmVuY2UgYmV0d2VlbiBhIGd1ZXN0IHJlcXVlc3QgKHN1Y2ggYXMgQUNQSSByZXF1ZXN0KQo+ Pj4gYW5kIGhvc3QgcmVxdWVzdCAoc3VjaCBhcyBTSUdJTlQpIHdpbGwgcHJvdmUgdXNlZnVsIHRv IGxpYnZpcnQuCj4+PiBTaW5jZSBhbGwgcmVxdWVzdHMgZXZlbnR1YWxseSBlbmQgdXAgY2hhbmdp bmcgc2h1dGRvd25fcmVxdWVzdGVkIGluCj4+PiB2bC5jLCB0aGUgbG9naWNhbCBjaGFuZ2UgaXMg dG8gbWFrZSB0aGF0IHZhbHVlIHRyYWNrIHRoZSByZWFzb24sCj4+PiByYXRoZXIgdGhhbiBpdHMg Y3VycmVudCAwLzEgY29udGVudHMuCj4+Pgo+Pj4gU2luY2UgY29tbWFuZC1saW5lIG9wdGlvbnMg Y29udHJvbCB3aGV0aGVyIGEgcmVzZXQgcmVxdWVzdCBpcyB0dXJuZWQKPj4+IGludG8gYSBzaHV0 ZG93biByZXF1ZXN0IGluc3RlYWQsIHRoZSBzYW1lIHRyZWF0bWVudCBpcyBnaXZlbiB0bwo+Pj4g cmVzZXRfcmVxdWVzdGVkLgo+Pj4KPj4+IFRoaXMgcGF0Y2ggYWRkcyBhbiBpbnRlcm5hbCBlbnVt IFNodXRkb3duQ2F1c2UgdGhhdCBkZXNjcmliZXMgcmVhc29ucwo+Pj4gdGhhdCBhIHNodXRkb3du IGNhbiBiZSByZXF1ZXN0ZWQsIGFuZCBjaGFuZ2VzIHFlbXVfc3lzdGVtX3Jlc2V0KCkgdG8KPj4+ IHBhc3MgdGhlIHJlYXNvbiB0aHJvdWdoLCBhbHRob3VnaCBmb3Igbm93IGl0IGlzIG5vdCByZXBv cnRlZC4gIFRoZQo+Pj4gZW51bSBjb3VsZCBiZSBleHBvcnRlZCB2aWEgUUFQSSBhdCBhIGxhdGVy IGRhdGUsIGlmIGRlZW1lZCBuZWNlc3NhcnksCj4+PiBidXQgZm9yIG5vdywgdGhlcmUgaGFzIG5v dCBiZWVuIGEgcmVxdWVzdCB0byBleHBvc2UgdGhhdCBtdWNoIGRldGFpbAo+Pj4gdG8gZW5kIGNs aWVudHMuCj4+Pgo+Pj4gRm9yIG5vdywgd2Ugb25seSBwb3B1bGF0ZSB0aGUgcmVhc29uIHdpdGgg SE9TVF9FUlJPUiwgYWxvbmcgd2l0aCBGSVhNRQo+Pj4gY29tbWVudHMgdGhhdCBkZXNjcmliZSBv dXIgcGxhbnMgZm9yIGhvdyB0byBwYXNzIGFuIGFjdHVhbCBjb3JyZWN0Cj4+PiByZWFzb24uCj4+ IAo+PiBJbiBvdGhlciB3b3JkcywgcmVwbGFjaW5nIDAgYnkgU0hVVERPV05fQ0FVU0VfTk9ORSwg YW5kIDEgYnkKPj4gU0hVVERPV05fQ0FVU0VfSE9TVF9FUlJPUi4gIE1ha2VzIHNlbnNlLgo+Cj4g TWF5YmUgSSBjb3VsZCBoYXZlIG9yZGVyZWQgSE9TVF9FUlJPUiB0byBhY3R1YWxseSBiZSAxLi4u CgpNaWdodCBiZSBtYXJnaW5hbGx5IHdvcnRod2hpbGUgaWYgeW91IGNhbiBzcGxpdCBwYXRjaGVz IHNvIHRoYXQgdGhlIG9uZQpyZXBsYWNpbmcgaW50IGJ5IFNodXRkb3duQ2F1c2UgZG9lc24ndCBj aGFuZ2UgYW55dGhpbmcgYnV0IG5hbWVzLgoKPj4+ICsvKiBFbnVtZXJhdGlvbiBvZiB2YXJpb3Vz IGNhdXNlcyBmb3Igc2h1dGRvd24uICovCj4+PiArdHlwZWRlZiBlbnVtIFNodXRkb3duQ2F1c2Ug U2h1dGRvd25DYXVzZTsKPj4+ICtlbnVtIFNodXRkb3duQ2F1c2Ugewo+PiAKPj4gV2h5IGRlZmlu ZSB0aGUgdHlwZWRlZiBzZXBhcmF0ZWx5IGhlcmU/ICBXaGF0J3Mgd3Jvbmcgd2l0aAo+PiAKPj4g ICAgIHR5cGVkZWYgZW51bSBTaHV0ZG93bkNhdXNlIHsKPj4gICAgICAgICAuLi4KPj4gICAgIH0g U2h1dGRvd25DYXVzZTsKPj4gCj4+ID8KPgo+IFRoYXQgd291bGQgd29yayB0b28uICBJIGRvbid0 IGtub3cgaWYgdGhlIGNvZGUgYmFzZSBoYXMgYSBzdHJvbmcKPiBwcmVmZXJlbmNlIGZvciBvbmUg Zm9ybSBvdmVyIHRoZSBvdGhlci4KCkkgZG9uJ3QgaGF2ZSBudW1iZXJzLCBidXQgSSB0aGluayB3 ZSB1c2UgdGhlIHNwbGl0IGZvcm0gcHJldHR5IG11Y2ggb25seQp3aGVuIHRoZXJlJ3MgYSByZWFz b24gZm9yIHRoZSBzcGxpdCwgc3VjaCBhcyBkZWZpbmluZyBhbiBpbmNvbXBsZXRlIHR5cGUKaW4g YSBoZWFkZXIsIGFuZCBjb21wbGV0aW5nIGl0IGVsc2V3aGVyZS4KCj4+PiArICAgIFNIVVRET1dO X0NBVVNFX05PTkUsICAgICAgICAgIC8qIE5vIHNodXRkb3duIHJlcXVlc3RlZCB5ZXQgKi8KPj4g Cj4+IENvbW1lbnQgaXMgZmluZS4gIFBvc3NpYmxlIGFsdGVybmF0aXZlOiAvKiBObyBzaHV0ZG93 biByZXF1ZXN0IHBlbmRpbmcgKi8KPj4gCj4+PiArICAgIFNIVVRET1dOX0NBVVNFX0hPU1RfUU1Q LCAgICAgIC8qIFJlYWN0aW9uIHRvIGEgUU1QIGNvbW1hbmQsIGxpa2UgJ3F1aXQnICovCj4+PiAr ICAgIFNIVVRET1dOX0NBVVNFX0hPU1RfU0lHTkFMLCAgIC8qIFJlYWN0aW9uIHRvIGEgc2lnbmFs LCBzdWNoIGFzIFNJR0lOVCAqLwo+Pj4gKyAgICBTSFVURE9XTl9DQVVTRV9IT1NUX1VJLCAgICAg ICAvKiBSZWFjdGlvbiB0byBVSSBldmVudCwgbGlrZSB3aW5kb3cgY2xvc2UgKi8KPj4+ICsgICAg U0hVVERPV05fQ0FVU0VfSE9TVF9FUlJPUiwgICAgLyogQW4gZXJyb3IgcHJldmVudHMgZnVydGhl ciB1c2Ugb2YgZ3Vlc3QgKi8KPgo+IC4uLnJhdGhlciB0aGFuIDQuICBJIGRvbid0IGtub3cgdGhh dCBpdCBtYXR0ZXJzIG11Y2guCj4KPgo+Pj4gLXN0YXRpYyBpbnQgcWVtdV9yZXNldF9yZXF1ZXN0 ZWQodm9pZCkKPj4+ICtzdGF0aWMgU2h1dGRvd25DYXVzZSBxZW11X3Jlc2V0X3JlcXVlc3RlZCh2 b2lkKQo+Pj4gIHsKPj4+IC0gICAgaW50IHIgPSByZXNldF9yZXF1ZXN0ZWQ7Cj4+PiArICAgIFNo dXRkb3duQ2F1c2UgciA9IHJlc2V0X3JlcXVlc3RlZDsKPj4gCj4+IEdvb2Qgb3Bwb3J0dW5pdHkg dG8gaW5zZXJ0IGEgYmxhbmsgbGluZSBoZXJlLgo+PiAKPgo+IFN1cmUuCj4KPj4+ICAgICAgaWYg KHIgJiYgcmVwbGF5X2NoZWNrcG9pbnQoQ0hFQ0tQT0lOVF9SRVNFVF9SRVFVRVNURUQpKSB7Cj4+ PiAtICAgICAgICByZXNldF9yZXF1ZXN0ZWQgPSAwOwo+Pj4gKyAgICAgICAgcmVzZXRfcmVxdWVz dGVkID0gU0hVVERPV05fQ0FVU0VfTk9ORTsKPj4+ICAgICAgICAgIHJldHVybiByOwo+Pj4gICAg ICB9Cj4+PiAtICAgIHJldHVybiBmYWxzZTsKPj4+ICsgICAgcmV0dXJuIFNIVVRET1dOX0NBVVNF X05PTkU7Cj4+PiAgfQo+Pj4KPj4+ICBzdGF0aWMgaW50IHFlbXVfc3VzcGVuZF9yZXF1ZXN0ZWQo dm9pZCkKPj4+IEBAIC0xNjg2LDcgKzE2ODcsMTIgQEAgc3RhdGljIGludCBxZW11X2RlYnVnX3Jl cXVlc3RlZCh2b2lkKQo+Pj4gICAgICByZXR1cm4gcjsKPj4+ICB9Cj4+Pgo+Pj4gLXZvaWQgcWVt dV9zeXN0ZW1fcmVzZXQoYm9vbCByZXBvcnQpCj4+PiArLyoKPj4+ICsgKiBSZXNldCB0aGUgVk0u IElmIEByZXBvcnQgaXMgVk1SRVNFVF9SRVBPUlQsIGlzc3VlIGFuIGV2ZW50LCB1c2luZwo+Pj4g KyAqIHRoZSBAcmVhc29uIGludGVycHJldGVkIGFzIFNodXRkb3duQ2F1c2UgZm9yIGRldGFpbHMu ICBPdGhlcndpc2UsCj4+PiArICogQHJlcG9ydCBpcyBWTVJFU0VUX1NJTEVOVCBhbmQgQHJlYXNv biBpcyBpZ25vcmVkLgo+Pj4gKyAqLwo+PiAKPj4gImludGVycHJldGVkIGFzIFNodXRkb3duQ2F1 c2UiPyAgSXQgKmlzKiBhIFNodXRkb3duQ2F1c2UuICBMZWZ0b3Zlcj8KPgo+IE9oLCB5ZWFoLiBJ biB2NSwgdGhlIHBhcmFtZXRlciB3YXMgJ2ludCcuCgpFYXN5IGVub3VnaCB0byBjbGVhbiB1cCA6 KQoKPj4+ICt2b2lkIHFlbXVfc3lzdGVtX3Jlc2V0KGJvb2wgcmVwb3J0LCBTaHV0ZG93bkNhdXNl IHJlYXNvbikKPj4+ICB7Cj4+PiAgICAgIE1hY2hpbmVDbGFzcyAqbWM7Cj4+Pgo+Pj4gQEAgLTE3 MDAsNiArMTcwNiw3IEBAIHZvaWQgcWVtdV9zeXN0ZW1fcmVzZXQoYm9vbCByZXBvcnQpCj4+PiAg ICAgICAgICBxZW11X2RldmljZXNfcmVzZXQoKTsKPj4+ICAgICAgfQo+Pj4gICAgICBpZiAocmVw b3J0KSB7Cj4+PiArICAgICAgICBhc3NlcnQocmVhc29uKTsKPj4+ICAgICAgICAgIHFhcGlfZXZl bnRfc2VuZF9yZXNldCgmZXJyb3JfYWJvcnQpOwo+Pj4gICAgICB9Cj4+PiAgICAgIGNwdV9zeW5j aHJvbml6ZV9hbGxfcG9zdF9yZXNldCgpOwo+PiAKPj4gTG9va3MgbGlrZSB3ZSdyZSBub3QgdXNp bmcgQHJlYXNvbiAiZm9yIGRldGFpbHMiIGp1c3QgeWV0Lgo+Cj4gQ29ycmVjdC4gSSBjYW4gYWRk IGEgRklYTUUgKHRvIGJlIHJlbW92ZWQgaW4gdGhlIGxhdGVyIHBhdGNoIHdoZXJlIGl0IGlzCj4g dXNlZCkgaWYgdGhhdCBpcyBkZXNpcmVkLgoKTm90IG5lY2Vzc2FyeSBpZiB0aGUgZnVuY3Rpb24g Y29tbWVudCByZWZyYWlucyBmcm9tIGNsYWltaW5nIGl0ICppcyoKdXNlZC4KCj4+PiBAQCAtMTgw Nyw3ICsxODE1LDcgQEAgdm9pZCBxZW11X3N5c3RlbV9raWxsZWQoaW50IHNpZ25hbCwgcGlkX3Qg cGlkKQo+Pj4gICAgICAvKiBDYW5ub3QgY2FsbCBxZW11X3N5c3RlbV9zaHV0ZG93bl9yZXF1ZXN0 IGRpcmVjdGx5IGJlY2F1c2UKPj4+ICAgICAgICogd2UgYXJlIGluIGEgc2lnbmFsIGhhbmRsZXIu Cj4+PiAgICAgICAqLwo+Pj4gLSAgICBzaHV0ZG93bl9yZXF1ZXN0ZWQgPSAxOwo+Pj4gKyAgICBz aHV0ZG93bl9yZXF1ZXN0ZWQgPSBTSFVURE9XTl9DQVVTRV9IT1NUX1NJR05BTDsKPj4gCj4+IFNo b3VsZCB0aGlzIGJlIFNIVVRET1dOX0NBVVNFX0hPU1RfRVJST1IsIHRvIGJlIHVwZGF0ZWQgaW4g dGhlIG5leHQKPj4gcGF0Y2g/ICBBbHRlcm5hdGl2ZWx5LCB0d2VhayB0aGlzIHBhdGNoJ3MgY29t bWl0IG1lc3NhZ2U/Cj4KPiBUaGlzIGlzIHRoZSBvbmUgY2FzZSB0aGF0IHdlIGFjdHVhbGx5IGRv IGhhdmUgYSBzdHJvbmcgY2F1c2UgYWZmaWxpYXRlZAo+IHdpdGggdGhlIHJlYXNvbiB3aXRob3V0 IGhhdmluZyB0byByZXNvcnQgdG8gY2hhbmdpbmcgZnVuY3Rpb24KPiBzaWduYXR1cmVzLiAgQ29t bWl0IG1lc3NhZ2UgdHdlYWsgaXMgYmV0dGVyLgoKV29ya3MgZm9yIG1lLgoKPj4+IEBAIC0xODQ2 LDEzICsxODU1LDE2IEBAIHZvaWQgcWVtdV9zeXN0ZW1fZGVidWdfcmVxdWVzdCh2b2lkKQo+Pj4g IHN0YXRpYyBib29sIG1haW5fbG9vcF9zaG91bGRfZXhpdCh2b2lkKQo+Pj4gIHsKPj4+ICAgICAg UnVuU3RhdGUgcjsKPj4+ICsgICAgU2h1dGRvd25DYXVzZSByZXF1ZXN0Owo+Pj4gKwo+Pj4gICAg ICBpZiAocWVtdV9kZWJ1Z19yZXF1ZXN0ZWQoKSkgewo+Pj4gICAgICAgICAgdm1fc3RvcChSVU5f U1RBVEVfREVCVUcpOwo+Pj4gICAgICB9Cj4+PiAgICAgIGlmIChxZW11X3N1c3BlbmRfcmVxdWVz dGVkKCkpIHsKPj4+ICAgICAgICAgIHFlbXVfc3lzdGVtX3N1c3BlbmQoKTsKPj4+ICAgICAgfQo+ Pj4gLSAgICBpZiAocWVtdV9zaHV0ZG93bl9yZXF1ZXN0ZWQoKSkgewo+Pj4gKyAgICByZXF1ZXN0 ID0gcWVtdV9zaHV0ZG93bl9yZXF1ZXN0ZWQoKTsKPj4+ICsgICAgaWYgKHJlcXVlc3QpIHsKPj4+ ICAgICAgICAgIHFlbXVfa2lsbF9yZXBvcnQoKTsKPj4+ICAgICAgICAgIHFhcGlfZXZlbnRfc2Vu ZF9zaHV0ZG93bigmZXJyb3JfYWJvcnQpOwo+Pj4gICAgICAgICAgaWYgKG5vX3NodXRkb3duKSB7 Cj4+IAo+PiBUaGUgZGV0b3VyIHRocm91Z2ggQHJlcXVlc3QgYXBwZWFycyBpc24ndCBuZWNlc3Nh cnkgaGVyZS4gIFBlcmhhcHMgeW91Cj4+IGRvIGl0IGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBu ZXh0IGh1bmsuICBEbyB5b3U/ICBKdXN0IGFza2luZyB0byBtYWtlCj4+IHN1cmUgSSBnZXQgd2hh dCB5b3UncmUgZG9pbmcuCj4KPiBDb25zaXN0ZW5jeSB3aXRoIHRoZSBuZXh0IGh1bmssIEFORCBi ZWNhdXNlIGEgbGF0ZXIgcGF0Y2ggdGhlbiB1c2VzCj4gJ3JlcXVlc3QnIHRvIHBhc3MgYW4gYWRk aXRpb25hbCBwYXJhbWV0ZXIgdG8gcWFwaV9ldmVudF9zZW5kX3NodXRkb3duKCkuCj4KPj4gCj4+ IEhtbSwgdGhlcmUncyBhbm90aGVyIG9uZSBpbiB4ZW4taHZtLmMsIGJ1dCBjb25zaXN0ZW5jeSBo YXJkbHkgYXBwbGllcwo+PiB0aGVyZS4gIElmIGxhdGVyIHBhdGNoZXMgYWRkIG1vcmUgdXNlcywg eW91IG1pZ2h0IHdhbnQgZGVsYXkgdGhlIGNoYW5nZQo+PiB1bnRpbCB0aGVuLgo+Cj4gQ2FuIGRv LCBpZiBpdCBtYWtlcyBpbmNyZW1lbnRhbCByZXZpZXdzIGVhc2llci4KClVzZSB5b3VyIGp1ZGdl bWVudC4KCj4+PiArKysgYi9taWdyYXRpb24vc2F2ZXZtLmMKPj4+IEBAIC0yMzAwLDcgKzIzMDAs NyBAQCBpbnQgbG9hZF92bXN0YXRlKGNvbnN0IGNoYXIgKm5hbWUpCj4+PiAgICAgICAgICByZXR1 cm4gLUVJTlZBTDsKPj4+ICAgICAgfQo+Pj4KPj4+IC0gICAgcWVtdV9zeXN0ZW1fcmVzZXQoVk1S RVNFVF9TSUxFTlQpOwo+Pj4gKyAgICBxZW11X3N5c3RlbV9yZXNldChWTVJFU0VUX1NJTEVOVCwg U0hVVERPV05fQ0FVU0VfTk9ORSk7Cj4+PiAgICAgIG1pcy0+ZnJvbV9zcmNfZmlsZSA9IGY7Cj4+ Pgo+Pj4gICAgICBhaW9fY29udGV4dF9hY3F1aXJlKGFpb19jb250ZXh0KTsKPj4gCj4+IFlvdSBz ZWVtIHRvIGJlIHBhc3NpbmcgU0hVVERPV05fQ0FVU0VfTk9ORSBleGFjdGx5IHdpdGggVk1SRVNF VF9TSUxFTlQuCj4+IFdvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIGhhdmUgU0hVVERPV05fQ0FVU0Vf Tk9ORSBpbXBseSAhcmVwb3J0LCBhbnkKPj4gb3RoZXIgY2FzZSBpbXBseSByZXBvcnQsIGFuZCBn ZXQgcmlkIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXI/Cj4KPiBJbmRlZWQsIGFuZCBpdCB3b3VsZCBh bHNvIGdldCByaWQgb2YgdGhlIHVnbHkKPiAgI2RlZmluZSBWTVJFU0VUX1NJTEVOVCBmYWxzZQoK SSdkIGxvdmUgdGhhdC4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0 cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=