From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 03DF8169AD5 for ; Fri, 21 Jun 2024 20:20:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719001220; cv=none; b=KHNTCYLh+r4piZnhULwYR8lOhcm7UGeT5GQDsqxchCFpGNGNWxS1cWwLJsybyyI76JaCXFGvpSUFipYddHjZVmPpc8SGVonfHbQCR2vqLmTe0Q6MRHEZubIX/bWc8pKRSQpNWVbcLP9YCjG0j3QrFrDWV4js/mu+6vdYxtjLhrY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719001220; c=relaxed/simple; bh=wVRdsRmYyClPzTZ7YTDFFNxrA2ib4Edbp6kUI/9aXzo=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Flcs7Vb9F7YW5zb638akMuv4enW5Tx6KYVVbno/7UQln4sG8gjt2u281yVxr4IFjMnbh17mgxwEQtoW/sqCJHaQFMP6pv9MeKn/fkHo1iikGW75xPzOgEierBnqwm548rbe0NHdaEi42J0L/Mnmpi0XlMRpqdKPxq6YV7P/J3vE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=N9KBJFux; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="N9KBJFux" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-7041ed475acso2156953b3a.2 for ; Fri, 21 Jun 2024 13:20:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1719001216; x=1719606016; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=eMScHEDiuETUapNa1ev+6UoeG35GPtgtXtBbwoMnOlE=; b=N9KBJFuxKnjNZC4ejuOWvACIsOqZWv3abhiNUEmQ4LsNLS7DOfo7oDZ0BsXGA6Jsqg L/qZP8jyoZCQ12ODWE+tEKjKDf74BnxIAyOYgR6ZI1BqDQWNjX1FMqchoH4IiespwykF hnhnMjtKcnsJOGMqp0IRPIEOSWuWt4HrVYMPxgUZPyzsuOFEoStwe26zh4LlFdq/gkiH rjzHREltAzhqijE035dJimok8EHwDh/xpl+dVBzEs6az7JhiEULOp03CjgzduYQh6D9L joDqBpBtY6pVOJ4gD4cYp5amxRPXjoL3Znz9uF382TTPw1w4SnHg97kOqmEiJgXYRwre H4Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719001216; x=1719606016; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eMScHEDiuETUapNa1ev+6UoeG35GPtgtXtBbwoMnOlE=; b=OXbP5Cjo9BMOhpiDgkVlKKkY1zOg/KpF0Z02vtYmma7hj7OfGjseNyw1rn2ZiaBtg3 shrc03FkY3gwmfvh+VF/+R/GY5lhtkaGNccdn14YQi7KEpQCVtUwjQP8R06ei1I7eX2p njA7t15OuZ7AiyGnJekWR33X3jv57D2xfz0dOUpyPOA5pA1xrLySsFU+QuqOWhQ19YGR LPtwv28BB8I0hT+8dz9mryDTsNO1r5Ew1uEf5g39N6edKTH1xkeIcw2jj49nyDB1OJmT hxN8a5ychVXSeZqoYzgWio9t1vv0GEHZ+DbbehkmWfz+m6Jo7YfsLXq2+BTlIXKN7d1e kr/w== X-Forwarded-Encrypted: i=1; AJvYcCV00iVizzbUVMVhV7PIjVh9wunbC01K6eLMQejczD9anXUWrdQfqZpT0GQRdPo694uQPpbYQOqeCEQQk/vBiIocdiyt/Va0BTu84feATE1K X-Gm-Message-State: AOJu0Ywr/Cfo3sprz3Uusy31JtUtVXZAwn+Br7a8x0qOHZQYBjsSXqmJ muKdD3bzVrTRmYAfojBQ6zwcqtkfDlX1YenkMQ64cNbLfWFDuqCse9QA5ubu6I0= X-Google-Smtp-Source: AGHT+IFELYMosbM/aIHJsab5wUAdXuVXauVTmyZHCcalea2gidyqnYBx2eN3YzvtFdUJk86VPcPqZg== X-Received: by 2002:aa7:8b0f:0:b0:705:d9e3:6179 with SMTP id d2e1a72fcca58-7062bf98e16mr7964607b3a.26.1719001216053; Fri, 21 Jun 2024 13:20:16 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:e8dd:a296:71d5:2490]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7065119f2bfsm1812483b3a.81.2024.06.21.13.20.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Jun 2024 13:20:15 -0700 (PDT) Date: Fri, 21 Jun 2024 13:20:13 -0700 From: Charlie Jenkins To: Quan Zhou Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, oleg@redhat.com, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, andy.chiu@sifive.com, shuah@kernel.org Subject: Re: [RFC PATCH 2/2] riscv: selftests: Add a ptrace test to check a0 of restarted syscall Message-ID: References: <909f2c3d-9992-4515-996b-35a17725701b@iscas.ac.cn> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <909f2c3d-9992-4515-996b-35a17725701b@iscas.ac.cn> On Fri, Jun 21, 2024 at 02:29:07PM +0800, Quan Zhou wrote: > > > On 2024/6/20 10:55, Charlie Jenkins wrote: > > On Wed, Jun 19, 2024 at 10:01:47AM +0800, zhouquan@iscas.ac.cn wrote: > > > From: Quan Zhou > > > > > > This test creates two processes: a tracer and a tracee. The tracer actively > > > sends a SIGUSR1 signal in user mode to interrupt the read syscall being > > > executed by the tracee. We will reset a0/orig_a0 and then observe the value > > > of a0 held by the restarted read syscall. > > > > I don't quite follow what the goal of this test is. With orig_a0 being > > added to the previous patch for ptrace, a more constrained test could > > ensure that this value is respected. > > > > Sry, I may not have described the patch clearly enough. This patch provides > a channel for modifying a0 in user-space ptrace via orig_a0. Here, I will > try to outline the whole situation: > > 1、When the tracer calls ptrace to modify regs->a0, can the tracee's a0 be > correctly modified? > > Through testing, if the user only modifies regs->a0, it doesn't work. Why? > > The execution flow of the tracee in the test program is as follows.Prior to > this explanation: > > - PTRACE_SYSCALL can make the tracee block before and after executing > a syscall. > - The tracer sends SIGUSR1 to interrupt read, and the kernel will > restart it. > - Please note the point marked with (*), which I believe is the cause > of the issue. > > user kernel > | > | > | > read > | +-> regs->orig_a0 = regs->a0; //(*1) > | <=tracer:PTRACE_SYSCALL > | +-> syscall_enter_from_user_mode > +-> ptrace_report_syscall_entry > +-> ptrace_stop > | //stopped > | <= tracer:SIGUSR1 > | > | //resume <= tracer:PTRACE_SYSCALL > | syscall_handler... > | > | +-> syscall_exit_to_user_mode > +-> syscall_exit_to_user_mode_prepare > +-> ptrace_report_syscall_exit > +-> ptrace_stop > | //stopped > | > | /* Change a0/orig_a0 here and observe the restarted syscall */ > | regs->{a0/orig_a0} = fd_zero; //(*2) > | ptrace(PTRACE_SETREGSET, ...); > | <= tracer:PTRACE_SYSCALL > | //restarting..., skip SIGUSR1 > | > | +-> exit_to_user_mode_loop > +-> arch_do_signal_or_restart > +-> /* Settings for syscall restart */ > regs->a0 = regs->orig_a0; //(*3) > | //stopped > | //and block before the syscall again, get current regs->a0 > | *result = regs->a0; > | > | /* Now, Check regs->a0 of restarted syscall */ > | EXPECT_NE(0x5, result); //for PTRACE_SETREGSSET a0, failed > | EXPECT_EQ(0x5, result); //for PTRACE_SETREGSSET orig_a0, succeed > > If I'm wrong, please let me know. 🙂 > > 2、Actually, I discovered the issue while using the execve function. > When I tried to modify the first parameter of execve in the tracer, > I found it didn't work. > > As for why not use execve for testing, there are two reasons: > > 1) The root cause of this issue is that when a syscall is interrupted > and then resumed, it restarts with orig_a0 instead of a0, so modifying > a0 doesn't work. I want to focus the test on the "restarted syscall". > > 2) Compared to the current test scenario, execve is terminated by ptrace > earlier, so I chose a later point. In fact, setting regs->a0 in the path > between (*1) and (*3) is ineffective because it will eventually be > overwritten by orig_a0, correct? Thank you for the thorough explanation! I feel like a test case like the following achieves the same goal but without needing the pipes and the file. What do you think? >From 5f13cdf8f7312b2b3cc98fbfbb3c95fcef62c0f0 Mon Sep 17 00:00:00 2001 From: Charlie Jenkins Date: Fri, 21 Jun 2024 12:58:29 -0700 Subject: [PATCH] riscv: selftests: Add a ptrace test to check a0 of restarted syscall Add a riscv selftest that checks that a0 of syscalls are able to be replaced. When entering a syscall, a0 contains the first argument to the syscall and upon exiting, a0 contains the return value. To replace the a0 argument instead of the a0 return value with ptrace after halting the program with PTRACE_SYSCALL, orig_a0 must be used. This test checks that orig_a0 allows a syscall argument to be modified, and that changing a0 does not change the syscall argument. Signed-off-by: Charlie Jenkins --- .../riscv/abi/ptrace_restart_syscall.c | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c diff --git a/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c b/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c new file mode 100644 index 000000000000..e74ae02c6850 --- /dev/null +++ b/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../kselftest_harness.h" + +#define DEFAULT_A0 0x6 + +#define ORIG_A0_AFTER_MODIFIED 0x5 +#define MODIFY_A0 0x01 +#define MODIFY_ORIG_A0 0x02 + +#define perr_and_exit(fmt, ...) do { \ + char buf[256]; \ + snprintf(buf, sizeof(buf), "%s:%d: " fmt ": %m\n", \ + __func__, __LINE__, ##__VA_ARGS__); \ + perror(buf); \ + exit(-1); \ +} while (0) + +static inline void resume_and_wait_tracee(pid_t pid, int flag) +{ + int status; + + if (ptrace(flag, pid, 0, 0)) + perr_and_exit("failed to resume the tracee %d\n", pid); + + if (waitpid(pid, &status, 0) != pid) + perr_and_exit("failed to wait for the tracee %d\n", pid); +} + +static void ptrace_restart_syscall(int opt, int *result) +{ + int status; + pid_t pid; + + struct user_regs_struct regs; + struct iovec iov = { + .iov_base = ®s, + .iov_len = sizeof(regs), + }; + + pid = fork(); + if (pid == 0) { + /* Mark oneself being traced */ + long val = ptrace(PTRACE_TRACEME, 0, 0, 0); + if (val) + perr_and_exit("failed to request for tracer to trace me: %ld\n", val); + + kill(getpid(), SIGSTOP); + + /* Perform exit syscall that will be intercepted */ + exit(DEFAULT_A0); + } else if (pid < 0) { + exit(1); + } + + if (waitpid(pid, &status, 0) != pid) + perr_and_exit("failed to wait for the tracee %d\n", pid); + + /* Stop at the entry point of the restarted syscall */ + resume_and_wait_tracee(pid, PTRACE_SYSCALL); + + /* Now, check regs.a0 of the restarted syscall */ + if (ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov)) + perr_and_exit("failed to get tracee registers\n"); + + /* Modify a0/orig_a0 for the restarted syscall */ + switch (opt) { + case MODIFY_A0: + regs.a0 = ORIG_A0_AFTER_MODIFIED; + break; + case MODIFY_ORIG_A0: + regs.orig_a0 = ORIG_A0_AFTER_MODIFIED; + break; + } + + if (ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov)) + perr_and_exit("failed to set tracee registers\n"); + + /* Resume the tracee */ + ptrace(PTRACE_CONT, pid, 0, 0); + if (waitpid(pid, &status, 0) != pid) + perr_and_exit("failed to wait for the tracee\n"); + + *result = WEXITSTATUS(status); +} + +TEST(ptrace_modify_a0) +{ + int result; + + ptrace_restart_syscall(MODIFY_A0, &result); + + /* The tracer's modification of a0 cannot affect the restarted tracee */ + EXPECT_EQ(DEFAULT_A0, result); +} + +TEST(ptrace_modify_orig_a0) +{ + int result; + + ptrace_restart_syscall(MODIFY_ORIG_A0, &result); + + /* The tracer must modify orig_a0 to actually change the tracee's a0 */ + EXPECT_EQ(ORIG_A0_AFTER_MODIFIED, result); +} + +TEST_HARNESS_MAIN -- 2.44.0 > > The current test may not intuitively reflect the issue. If possible, I will > provide a more comprehensive test based on everyone's suggestions. > > Thanks, > Quan > > > > > > > Compared to the test program, a more common scenario is the use of the > > > exece syscall, which sends a signal in the kernel path to restart > > > the syscall. > > > > > > Signed-off-by: Quan Zhou > > > --- > > > tools/testing/selftests/riscv/Makefile | 2 +- > > > tools/testing/selftests/riscv/abi/.gitignore | 1 + > > > tools/testing/selftests/riscv/abi/Makefile | 12 ++ > > > .../riscv/abi/ptrace_restart_syscall.c | 148 ++++++++++++++++++ > > > 4 files changed, 162 insertions(+), 1 deletion(-) > > > create mode 100644 tools/testing/selftests/riscv/abi/.gitignore > > > create mode 100644 tools/testing/selftests/riscv/abi/Makefile > > > create mode 100644 tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c > > > > > > diff --git a/tools/testing/selftests/riscv/Makefile b/tools/testing/selftests/riscv/Makefile > > > index 7ce03d832b64..98541dc2f164 100644 > > > --- a/tools/testing/selftests/riscv/Makefile > > > +++ b/tools/testing/selftests/riscv/Makefile > > > @@ -5,7 +5,7 @@ > > > ARCH ?= $(shell uname -m 2>/dev/null || echo not) > > > ifneq (,$(filter $(ARCH),riscv)) > > > -RISCV_SUBTARGETS ?= hwprobe vector mm sigreturn > > > +RISCV_SUBTARGETS ?= hwprobe vector mm sigreturn abi > > > else > > > RISCV_SUBTARGETS := > > > endif > > > diff --git a/tools/testing/selftests/riscv/abi/.gitignore b/tools/testing/selftests/riscv/abi/.gitignore > > > new file mode 100644 > > > index 000000000000..e1e00ffb9db9 > > > --- /dev/null > > > +++ b/tools/testing/selftests/riscv/abi/.gitignore > > > @@ -0,0 +1 @@ > > > +abi > > > > The gitignore should contain a list of all of the generated binaries > > that should be ignored. Can you put ptrace_restart_syscall in here > > instead of abi? > > > > ...yeah, I will fix it later. > > > > diff --git a/tools/testing/selftests/riscv/abi/Makefile b/tools/testing/selftests/riscv/abi/Makefile > > > new file mode 100644 > > > index 000000000000..634fa7de74e6 > > > --- /dev/null > > > +++ b/tools/testing/selftests/riscv/abi/Makefile > > > @@ -0,0 +1,12 @@ > > > +# SPDX-License-Identifier: GPL-2.0 > > > +# Copyright (C) 2021 ARM Limited > > > +# Originally tools/testing/arm64/abi/Makefile > > > + > > > +CFLAGS += -I$(top_srcdir)/tools/include > > > + > > > +TEST_GEN_PROGS := ptrace_restart_syscall > > > + > > > +include ../../lib.mk > > > + > > > +$(OUTPUT)/ptrace_restart_syscall: ptrace_restart_syscall.c > > > + $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^ > > > diff --git a/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c b/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c > > > new file mode 100644 > > > index 000000000000..3e25548cb95e > > > --- /dev/null > > > +++ b/tools/testing/selftests/riscv/abi/ptrace_restart_syscall.c > > > @@ -0,0 +1,148 @@ > > > +// SPDX-License-Identifier: GPL-2.0-only > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#include "../../kselftest_harness.h" > > > + > > > +#define ORIG_A0_AFTER_MODIFIED 0x5 > > > +#define MODIFY_A0 0x01 > > > +#define MODIFY_ORIG_A0 0x02 > > > + > > > +#define perr_and_exit(fmt, ...) do { \ > > > + char buf[256]; \ > > > + snprintf(buf, sizeof(buf), "%s:%d: " fmt ": %m\n", \ > > > + __func__, __LINE__, ##__VA_ARGS__); \ > > > + perror(buf); \ > > > + exit(-1); \ > > > +} while (0) > > > + > > > +static inline void resume_and_wait_tracee(pid_t pid, int flag) > > > +{ > > > + int status; > > > + > > > + if (ptrace(flag, pid, 0, 0)) > > > + perr_and_exit("failed to resume the tracee %d", pid); > > > + > > > + if (waitpid(pid, &status, 0) != pid) > > > + perr_and_exit("failed to wait for the tracee %d", pid); > > > +} > > > + > > > +static void ptrace_restart_syscall(int opt, int *result) > > > +{ > > > + int status; > > > + int p[2], fd_zero; > > > + pid_t pid; > > > + > > > + struct user_regs_struct regs; > > > + struct iovec iov = { > > > + .iov_base = ®s, > > > + .iov_len = sizeof(regs), > > > + }; > > > + > > > + if (pipe(p)) > > > + perr_and_exit("failed to create a pipe"); > > > + > > > + fd_zero = open("/dev/zero", O_RDONLY); > > > + if (fd_zero < 0) > > > + perr_and_exit("failed to open /dev/zero"); > > > + > > > + pid = fork(); > > > + if (pid == 0) { > > > + char c; > > > + > > > + /* Mark oneself being traced */ > > > + if (ptrace(PTRACE_TRACEME, 0, 0, 0)) > > > + perr_and_exit("failed to request for tracer to trace me"); > > > + > > > + kill(getpid(), SIGSTOP); > > > + > > > + if (read(p[0], &c, 1) != 1) > > > + exit(1); > > > + > > > + exit(0); > > > + } else if (pid < 0) > > > + exit(1); > > > + > > > + if (waitpid(pid, &status, 0) != pid) > > > + perr_and_exit("failed to wait for the tracee %d\n", pid); > > > + > > > + /* Resume the tracee until the next syscall */ > > > + resume_and_wait_tracee(pid, PTRACE_SYSCALL); > > > + > > > + /* Deliver a signal to interrupt the syscall */ > > > + kill(pid, SIGUSR1); > > > + > > > + /* The tracee stops at syscall exit */ > > > + resume_and_wait_tracee(pid, PTRACE_SYSCALL); > > > + > > > + /* Check tracee orig_a0 before syscall restart */ > > > + if (ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov)) > > > + perr_and_exit("failed to get tracee registers"); > > > + if (regs.orig_a0 != p[0]) > > > + perr_and_exit("unexpected a0"); > > > + > > > + /* Modify a0/orig_a0 for the restarted syscall */ > > > + switch (opt) { > > > + case MODIFY_A0: > > > + regs.a0 = fd_zero; > > > + break; > > > + case MODIFY_ORIG_A0: > > > + regs.orig_a0 = fd_zero; > > > + break; > > > + } > > > + > > > + if (ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov)) > > > + perr_and_exit("failed to set tracee registers"); > > > + > > > + /* Ignore SIGUSR1 signal */ > > > + resume_and_wait_tracee(pid, PTRACE_SYSCALL); > > > + > > > + /* Stop at the entry point of the restarted syscall */ > > > + resume_and_wait_tracee(pid, PTRACE_SYSCALL); > > > + > > > + /* Now, check regs.a0 of the restarted syscall */ > > > + if (ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov)) > > > + perr_and_exit("failed to get tracee registers"); > > > + *result = regs.a0; > > > + > > > + /* Resume the tracee */ > > > + ptrace(PTRACE_CONT, pid, 0, 0); > > > + if (waitpid(pid, &status, 0) != pid) > > > + perr_and_exit("failed to wait for the tracee"); > > > +} > > > + > > > +TEST(ptrace_modify_a0) > > > +{ > > > + int result; > > > + > > > + ptrace_restart_syscall(MODIFY_A0, &result); > > > + > > > + /* The tracer's modification of a0 cannot affect the restarted tracee */ > > > + EXPECT_NE(ORIG_A0_AFTER_MODIFIED, result); > > > +} > > > + > > > +TEST(ptrace_modify_orig_a0) > > > +{ > > > + int result; > > > + > > > + ptrace_restart_syscall(MODIFY_ORIG_A0, &result); > > > + > > > + /* The tracer must modify orig_a0 to actually change the tracee's a0 */ > > > + EXPECT_EQ(ORIG_A0_AFTER_MODIFIED, result); > > > > How does the value end up being 5? > > > > - Charlie > > > > The tracer ultimately sets `fd_zero` to the restarted syscall. > > Since 0, 1, and 2 are standard input, output, and error, the file > descriptors will be allocated in this order: `p[0] -> p[1] -> fd_zero`. > Thus, fd_zero will be 5. > > > > +} > > > + > > > +TEST_HARNESS_MAIN > > > -- > > > 2.34.1 > > > > 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 F40FBC27C4F for ; Fri, 21 Jun 2024 20:20:27 +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:MIME-Version:References: Message-ID:Subject:Cc: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=qJN8/HTQ4vF+3ZpLOZ0w1JpiJ+37cEze8WGqJb6/hAY=; b=0hWHhrJuc1AJ3Q 1lQAWQ/hRXEmqw7aGCBgyVKT6x2nui9EUpXp/apr+FvFO3S5ExCJAs9E/SnfXmtmuxfUmtfTpFziV MGnX0EMuVUWyYdycQdae9TlHieGkYFj32T7GEHCj6jo9lS+OnUM71mRilcKagV/sR4g+K9DEOw0QW X4j38GJwyTkbgGuBYFeGdiu5p498scxeJK1gWN4melnprLvcaDtgubxBaFTvyi3MhbJggAAWtqcDK F9RAtNIxTDvC1LRaluo0JQvzXyGRyuMDaUcw8q7W7p3mB3Uj1xjMCBwbj7vVubryxqT70u5Qo+NK4 4+CUdUamZkmAhepuAz6g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKkk8-0000000AT9S-1Zr0; Fri, 21 Jun 2024 20:20:20 +0000 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKkk5-0000000AT91-0FWm for linux-riscv@lists.infradead.org; Fri, 21 Jun 2024 20:20:19 +0000 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-70661cd46d2so453761b3a.3 for ; Fri, 21 Jun 2024 13:20:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1719001216; x=1719606016; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=eMScHEDiuETUapNa1ev+6UoeG35GPtgtXtBbwoMnOlE=; b=Z5r4ZYzO0+XzbU34tbPihfudvZrfk1cWVTyNE7aNN0Fp54J5b6f09d2S3Efv8ZcXTN pjwjIHfw4/byo40Q/97knDugjD8FstmuQPC7S/uKtB8o9+RScyNECD556jnGf3T2SqXR CVj6jULVSEAcGt1r8sRZexpg4pdH1jbzkGyoxtLPBjaIQC71haF3YR95CVpKXXBErMS9 kR6qeBl2kqiLD/epqZepODE2kUj0lge3EbNvRCOexoJdRtzzOnL42xGuoHJjWquuUYNV F0clHB3CBt1NAoNRA5d3O03y1bPdVpwU9UUqyWS3LEsDx9SwiOPPTBAqBtP2/ugMnIO2 0Klg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719001216; x=1719606016; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eMScHEDiuETUapNa1ev+6UoeG35GPtgtXtBbwoMnOlE=; b=RdwmsbipySuACUziP+nXl4Fu6CBU8U+ija88OfOShtvFYVxKme3OZh38mdY7CdfBGM gbArMggpNQZfSkMhRu6LEpj2o8rXpCd0UvAo5JSjt42hRq9BBU/Uo1jhPQmsuJMPlUZk vZ9EATgJ/HmnSxAJ6ypBV5IEMKl2m1lfmJYLz/OROhTYEXucVB3NFRaz+hWbHhI4DVGg r20jAnLwTF/n06uC6LXqF1vOJQ/vIaF2fPGYpGrWFYhoCZVZBsiP1EbiS1lYsABbNOo/ j0CGRsHRvny3isA+nLNc7xBe5XWdl2tvVv7ejpYqTjE7WhonuKRb9B7ErCpDRp9DPDLL kGZg== X-Gm-Message-State: AOJu0YwbnyfqPWQNtzI7bips6kOYvfRvUqnqt4xjXWKhd2fh9YaqTpbF TefGhrqcUjv6/n7FVTPwb6lVwxFKpQag5FpaL+eTg6cJhf5b8gSxRClN9DmzrQU= X-Google-Smtp-Source: AGHT+IFELYMosbM/aIHJsab5wUAdXuVXauVTmyZHCcalea2gidyqnYBx2eN3YzvtFdUJk86VPcPqZg== X-Received: by 2002:aa7:8b0f:0:b0:705:d9e3:6179 with SMTP id d2e1a72fcca58-7062bf98e16mr7964607b3a.26.1719001216053; Fri, 21 Jun 2024 13:20:16 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:e8dd:a296:71d5:2490]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7065119f2bfsm1812483b3a.81.2024.06.21.13.20.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Jun 2024 13:20:15 -0700 (PDT) Date: Fri, 21 Jun 2024 13:20:13 -0700 From: Charlie Jenkins To: Quan Zhou Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, oleg@redhat.com, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, andy.chiu@sifive.com, shuah@kernel.org Subject: Re: [RFC PATCH 2/2] riscv: selftests: Add a ptrace test to check a0 of restarted syscall Message-ID: References: <909f2c3d-9992-4515-996b-35a17725701b@iscas.ac.cn> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <909f2c3d-9992-4515-996b-35a17725701b@iscas.ac.cn> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_132017_349592_955FECD5 X-CRM114-Status: GOOD ( 63.01 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gRnJpLCBKdW4gMjEsIDIwMjQgYXQgMDI6Mjk6MDdQTSArMDgwMCwgUXVhbiBaaG91IHdyb3Rl Ogo+IAo+IAo+IE9uIDIwMjQvNi8yMCAxMDo1NSwgQ2hhcmxpZSBKZW5raW5zIHdyb3RlOgo+ID4g T24gV2VkLCBKdW4gMTksIDIwMjQgYXQgMTA6MDE6NDdBTSArMDgwMCwgemhvdXF1YW5AaXNjYXMu YWMuY24gd3JvdGU6Cj4gPiA+IEZyb206IFF1YW4gWmhvdSA8emhvdXF1YW5AaXNjYXMuYWMuY24+ Cj4gPiA+IAo+ID4gPiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gcHJvY2Vzc2VzOiBhIHRyYWNlciBh bmQgYSB0cmFjZWUuIFRoZSB0cmFjZXIgYWN0aXZlbHkKPiA+ID4gc2VuZHMgYSBTSUdVU1IxIHNp Z25hbCBpbiB1c2VyIG1vZGUgdG8gaW50ZXJydXB0IHRoZSByZWFkIHN5c2NhbGwgYmVpbmcKPiA+ ID4gZXhlY3V0ZWQgYnkgdGhlIHRyYWNlZS4gV2Ugd2lsbCByZXNldCBhMC9vcmlnX2EwIGFuZCB0 aGVuIG9ic2VydmUgdGhlIHZhbHVlCj4gPiA+IG9mIGEwIGhlbGQgYnkgdGhlIHJlc3RhcnRlZCBy ZWFkIHN5c2NhbGwuCj4gPiAKPiA+IEkgZG9uJ3QgcXVpdGUgZm9sbG93IHdoYXQgdGhlIGdvYWwg b2YgdGhpcyB0ZXN0IGlzLiBXaXRoIG9yaWdfYTAgYmVpbmcKPiA+IGFkZGVkIHRvIHRoZSBwcmV2 aW91cyBwYXRjaCBmb3IgcHRyYWNlLCBhIG1vcmUgY29uc3RyYWluZWQgdGVzdCBjb3VsZAo+ID4g ZW5zdXJlIHRoYXQgdGhpcyB2YWx1ZSBpcyByZXNwZWN0ZWQuCj4gPiAKPiAKPiBTcnksIEkgbWF5 IG5vdCBoYXZlIGRlc2NyaWJlZCB0aGUgcGF0Y2ggY2xlYXJseSBlbm91Z2guIFRoaXMgcGF0Y2gg cHJvdmlkZXMKPiBhIGNoYW5uZWwgZm9yIG1vZGlmeWluZyBhMCBpbiB1c2VyLXNwYWNlIHB0cmFj ZSB2aWEgb3JpZ19hMC4gSGVyZSwgSSB3aWxsCj4gdHJ5IHRvIG91dGxpbmUgdGhlIHdob2xlIHNp dHVhdGlvbjoKPiAKPiAx44CBV2hlbiB0aGUgdHJhY2VyIGNhbGxzIHB0cmFjZSB0byBtb2RpZnkg cmVncy0+YTAsIGNhbiB0aGUgdHJhY2VlJ3MgYTAgYmUKPiBjb3JyZWN0bHkgbW9kaWZpZWQ/Cj4g Cj4gVGhyb3VnaCB0ZXN0aW5nLCBpZiB0aGUgdXNlciBvbmx5IG1vZGlmaWVzIHJlZ3MtPmEwLCBp dCBkb2Vzbid0IHdvcmsuIFdoeT8KPiAKPiBUaGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIHRyYWNl ZSBpbiB0aGUgdGVzdCBwcm9ncmFtIGlzIGFzIGZvbGxvd3MuUHJpb3IgdG8KPiB0aGlzIGV4cGxh bmF0aW9uOgo+IAo+IC0gUFRSQUNFX1NZU0NBTEwgY2FuIG1ha2UgdGhlIHRyYWNlZSBibG9jayBi ZWZvcmUgYW5kIGFmdGVyIGV4ZWN1dGluZwo+ICAgYSBzeXNjYWxsLgo+IC0gVGhlIHRyYWNlciBz ZW5kcyBTSUdVU1IxIHRvIGludGVycnVwdCByZWFkLCBhbmQgdGhlIGtlcm5lbCB3aWxsCj4gICBy ZXN0YXJ0IGl0Lgo+IC0gUGxlYXNlIG5vdGUgdGhlIHBvaW50IG1hcmtlZCB3aXRoICgqKSwgd2hp Y2ggSSBiZWxpZXZlIGlzIHRoZSBjYXVzZQo+ICAgb2YgdGhlIGlzc3VlLgo+IAo+IHVzZXIgICAg IGtlcm5lbAo+ICAgICB8Cj4gICAgIHwKPiAgICAgfAo+ICAgICAgcmVhZAo+ICAgICAgICAgfCAr LT4gcmVncy0+b3JpZ19hMCA9IHJlZ3MtPmEwOyAvLygqMSkKPiAgICAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PXRyYWNlcjpQVFJBQ0VfU1lTQ0FMTAo+ICAg ICAgICAgfCArLT4gc3lzY2FsbF9lbnRlcl9mcm9tX3VzZXJfbW9kZQo+ICAgICAgICAgICAgICAg Ky0+IHB0cmFjZV9yZXBvcnRfc3lzY2FsbF9lbnRyeQo+ICAgICAgICAgICAgICAgICAgICstPiBw dHJhY2Vfc3RvcAo+ICAgICAgICAgfCAvL3N0b3BwZWQKPiAgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8PSB0cmFjZXI6U0lHVVNSMQo+ICAgICAgICAgfAo+ ICAgICAgICAgfCAvL3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHRyYWNl cjpQVFJBQ0VfU1lTQ0FMTAo+ICAgICAgICAgfCBzeXNjYWxsX2hhbmRsZXIuLi4KPiAgICAgICAg IHwKPiAgICAgICAgIHwgKy0+IHN5c2NhbGxfZXhpdF90b191c2VyX21vZGUKPiAgICAgICAgICAg ICAgICstPiBzeXNjYWxsX2V4aXRfdG9fdXNlcl9tb2RlX3ByZXBhcmUKPiAgICAgICAgICAgICAg ICAgICArLT4gcHRyYWNlX3JlcG9ydF9zeXNjYWxsX2V4aXQKPiAgICAgICAgICAgICAgICAgICAg ICAgKy0+IHB0cmFjZV9zdG9wCj4gICAgIHwgLy9zdG9wcGVkCj4gICAgIHwKPiAgICAgfCAvKiBD aGFuZ2UgYTAvb3JpZ19hMCBoZXJlIGFuZCBvYnNlcnZlIHRoZSByZXN0YXJ0ZWQgc3lzY2FsbCAq Lwo+ICAgICB8IHJlZ3MtPnthMC9vcmlnX2EwfSA9IGZkX3plcm87IC8vKCoyKQo+ICAgICB8IHB0 cmFjZShQVFJBQ0VfU0VUUkVHU0VULCAuLi4pOwo+ICAgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPD0gdHJhY2VyOlBUUkFDRV9TWVNDQUxMCj4gICAgICAgICB8 IC8vcmVzdGFydGluZy4uLiwgc2tpcCBTSUdVU1IxCj4gICAgICAgICB8Cj4gICAgICAgICB8ICst PiBleGl0X3RvX3VzZXJfbW9kZV9sb29wCj4gICAgICAgICAgICAgICArLT4gYXJjaF9kb19zaWdu YWxfb3JfcmVzdGFydAo+ICAgICAgICAgICAgICAgICAgICstPiAvKiBTZXR0aW5ncyBmb3Igc3lz Y2FsbCByZXN0YXJ0ICovCj4gICAgICAgICAgICAgICAgICAgICAgIHJlZ3MtPmEwID0gcmVncy0+ b3JpZ19hMDsgLy8oKjMpCj4gICAgIHwgLy9zdG9wcGVkCj4gICAgIHwgLy9hbmQgYmxvY2sgYmVm b3JlIHRoZSBzeXNjYWxsIGFnYWluLCBnZXQgY3VycmVudCByZWdzLT5hMAo+ICAgICB8ICpyZXN1 bHQgPSByZWdzLT5hMDsKPiAgICAgfAo+ICAgICB8IC8qIE5vdywgQ2hlY2sgcmVncy0+YTAgb2Yg cmVzdGFydGVkIHN5c2NhbGwgKi8KPiAgICAgfCBFWFBFQ1RfTkUoMHg1LCByZXN1bHQpOyAvL2Zv ciBQVFJBQ0VfU0VUUkVHU1NFVCBhMCwgZmFpbGVkCj4gICAgIHwgRVhQRUNUX0VRKDB4NSwgcmVz dWx0KTsgLy9mb3IgUFRSQUNFX1NFVFJFR1NTRVQgb3JpZ19hMCwgc3VjY2VlZAo+IAo+IElmIEkn bSB3cm9uZywgcGxlYXNlIGxldCBtZSBrbm93LiDwn5mCCj4gCj4gMuOAgUFjdHVhbGx5LCBJIGRp c2NvdmVyZWQgdGhlIGlzc3VlIHdoaWxlIHVzaW5nIHRoZSBleGVjdmUgZnVuY3Rpb24uCj4gV2hl biBJIHRyaWVkIHRvIG1vZGlmeSB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGV4ZWN2ZSBpbiB0aGUg dHJhY2VyLAo+IEkgZm91bmQgaXQgZGlkbid0IHdvcmsuCj4gCj4gQXMgZm9yIHdoeSBub3QgdXNl IGV4ZWN2ZSBmb3IgdGVzdGluZywgdGhlcmUgYXJlIHR3byByZWFzb25zOgo+IAo+IDEpIFRoZSBy b290IGNhdXNlIG9mIHRoaXMgaXNzdWUgaXMgdGhhdCB3aGVuIGEgc3lzY2FsbCBpcyBpbnRlcnJ1 cHRlZAo+IGFuZCB0aGVuIHJlc3VtZWQsIGl0IHJlc3RhcnRzIHdpdGggb3JpZ19hMCBpbnN0ZWFk IG9mIGEwLCBzbyBtb2RpZnlpbmcKPiBhMCBkb2Vzbid0IHdvcmsuIEkgd2FudCB0byBmb2N1cyB0 aGUgdGVzdCBvbiB0aGUgInJlc3RhcnRlZCBzeXNjYWxsIi4KPiAKPiAyKSBDb21wYXJlZCB0byB0 aGUgY3VycmVudCB0ZXN0IHNjZW5hcmlvLCBleGVjdmUgaXMgdGVybWluYXRlZCBieSBwdHJhY2UK PiBlYXJsaWVyLCBzbyBJIGNob3NlIGEgbGF0ZXIgcG9pbnQuIEluIGZhY3QsIHNldHRpbmcgcmVn cy0+YTAgaW4gdGhlIHBhdGgKPiBiZXR3ZWVuICgqMSkgYW5kICgqMykgaXMgaW5lZmZlY3RpdmUg YmVjYXVzZSBpdCB3aWxsIGV2ZW50dWFsbHkgYmUKPiBvdmVyd3JpdHRlbiBieSBvcmlnX2EwLCBj b3JyZWN0PwoKVGhhbmsgeW91IGZvciB0aGUgdGhvcm91Z2ggZXhwbGFuYXRpb24hIEkgZmVlbCBs aWtlIGEgdGVzdCBjYXNlIGxpa2UgdGhlCmZvbGxvd2luZyBhY2hpZXZlcyB0aGUgc2FtZSBnb2Fs IGJ1dCB3aXRob3V0IG5lZWRpbmcgdGhlIHBpcGVzIGFuZCB0aGUKZmlsZS4gV2hhdCBkbyB5b3Ug dGhpbms/CgpGcm9tIDVmMTNjZGY4ZjczMTJiMmIzY2M5OGZiZmJiM2M5NWZjZWY2MmMwZjAgTW9u IFNlcCAxNyAwMDowMDowMCAyMDAxCkZyb206IENoYXJsaWUgSmVua2lucyA8Y2hhcmxpZUByaXZv c2luYy5jb20+CkRhdGU6IEZyaSwgMjEgSnVuIDIwMjQgMTI6NTg6MjkgLTA3MDAKU3ViamVjdDog W1BBVENIXSByaXNjdjogc2VsZnRlc3RzOiBBZGQgYSBwdHJhY2UgdGVzdCB0byBjaGVjayBhMCBv ZiByZXN0YXJ0ZWQKIHN5c2NhbGwKCkFkZCBhIHJpc2N2IHNlbGZ0ZXN0IHRoYXQgY2hlY2tzIHRo YXQgYTAgb2Ygc3lzY2FsbHMgYXJlIGFibGUgdG8gYmUKcmVwbGFjZWQuIFdoZW4gZW50ZXJpbmcg YSBzeXNjYWxsLCBhMCBjb250YWlucyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCnN5c2NhbGwg YW5kIHVwb24gZXhpdGluZywgYTAgY29udGFpbnMgdGhlIHJldHVybiB2YWx1ZS4gVG8gcmVwbGFj ZSB0aGUKYTAgYXJndW1lbnQgaW5zdGVhZCBvZiB0aGUgYTAgcmV0dXJuIHZhbHVlIHdpdGggcHRy YWNlIGFmdGVyIGhhbHRpbmcgdGhlCnByb2dyYW0gd2l0aCBQVFJBQ0VfU1lTQ0FMTCwgb3JpZ19h MCBtdXN0IGJlIHVzZWQuIFRoaXMgdGVzdCBjaGVja3MgdGhhdApvcmlnX2EwIGFsbG93cyBhIHN5 c2NhbGwgYXJndW1lbnQgdG8gYmUgbW9kaWZpZWQsIGFuZCB0aGF0IGNoYW5naW5nIGEwCmRvZXMg bm90IGNoYW5nZSB0aGUgc3lzY2FsbCBhcmd1bWVudC4KClNpZ25lZC1vZmYtYnk6IENoYXJsaWUg SmVua2lucyA8Y2hhcmxpZUByaXZvc2luYy5jb20+Ci0tLQogLi4uL3Jpc2N2L2FiaS9wdHJhY2Vf cmVzdGFydF9zeXNjYWxsLmMgICAgICAgIHwgMTIzICsrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDEyMyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvdGVz dGluZy9zZWxmdGVzdHMvcmlzY3YvYWJpL3B0cmFjZV9yZXN0YXJ0X3N5c2NhbGwuYwoKZGlmZiAt LWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jpc2N2L2FiaS9wdHJhY2VfcmVzdGFydF9z eXNjYWxsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvcHRyYWNlX3Jlc3Rh cnRfc3lzY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZTc0 YWUwMmM2ODUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmlz Y3YvYWJpL3B0cmFjZV9yZXN0YXJ0X3N5c2NhbGwuYwpAQCAtMCwwICsxLDEyMyBAQAorLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQorI2luY2x1ZGUgPHN0ZGlvLmg+Cisj aW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3Rk Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxl cnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4K KyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8 c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+ CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisj aW5jbHVkZSAiLi4vLi4va3NlbGZ0ZXN0X2hhcm5lc3MuaCIKKworI2RlZmluZSBERUZBVUxUX0Ew CQkweDYKKworI2RlZmluZSBPUklHX0EwX0FGVEVSX01PRElGSUVEICAweDUKKyNkZWZpbmUgTU9E SUZZX0EwICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNT0RJRllfT1JJR19BMCAgICAgICAg ICAweDAyCisKKyNkZWZpbmUgcGVycl9hbmRfZXhpdChmbXQsIC4uLikgZG8gewkJCVwKKwljaGFy IGJ1ZlsyNTZdOwkJCQkJXAorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczolZDogIiBm bXQgIjogJW1cbiIsCVwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7CVwK KwlwZXJyb3IoYnVmKTsJCQkJCQlcCisJZXhpdCgtMSk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKwor c3RhdGljIGlubGluZSB2b2lkIHJlc3VtZV9hbmRfd2FpdF90cmFjZWUocGlkX3QgcGlkLCBpbnQg ZmxhZykKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKHB0cmFjZShmbGFnLCBwaWQsIDAsIDApKQor CQlwZXJyX2FuZF9leGl0KCJmYWlsZWQgdG8gcmVzdW1lIHRoZSB0cmFjZWUgJWRcbiIsIHBpZCk7 CisKKwlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkKKwkJcGVycl9hbmRfZXhp dCgiZmFpbGVkIHRvIHdhaXQgZm9yIHRoZSB0cmFjZWUgJWRcbiIsIHBpZCk7Cit9CisKK3N0YXRp YyB2b2lkIHB0cmFjZV9yZXN0YXJ0X3N5c2NhbGwoaW50IG9wdCwgaW50ICpyZXN1bHQpCit7CisJ aW50IHN0YXR1czsKKwlwaWRfdCBwaWQ7CisKKwlzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCByZWdz OworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7CisJCS5pb3ZfYmFzZSA9ICZyZWdzLAorCQkuaW92X2xl biA9IHNpemVvZihyZWdzKSwKKwl9OworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkg eworCQkvKiBNYXJrIG9uZXNlbGYgYmVpbmcgdHJhY2VkICovCisJCWxvbmcgdmFsID0gcHRyYWNl KFBUUkFDRV9UUkFDRU1FLCAwLCAwLCAwKTsKKwkJaWYgKHZhbCkKKwkJCXBlcnJfYW5kX2V4aXQo ImZhaWxlZCB0byByZXF1ZXN0IGZvciB0cmFjZXIgdG8gdHJhY2UgbWU6ICVsZFxuIiwgdmFsKTsK KworCQlraWxsKGdldHBpZCgpLCBTSUdTVE9QKTsKKworCQkvKiBQZXJmb3JtIGV4aXQgc3lzY2Fs bCB0aGF0IHdpbGwgYmUgaW50ZXJjZXB0ZWQgKi8KKwkJZXhpdChERUZBVUxUX0EwKTsKKwl9IGVs c2UgaWYgKHBpZCA8IDApIHsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAod2FpdHBpZChwaWQsICZz dGF0dXMsIDApICE9IHBpZCkKKwkJcGVycl9hbmRfZXhpdCgiZmFpbGVkIHRvIHdhaXQgZm9yIHRo ZSB0cmFjZWUgJWRcbiIsIHBpZCk7CisKKwkvKiBTdG9wIGF0IHRoZSBlbnRyeSBwb2ludCBvZiB0 aGUgcmVzdGFydGVkIHN5c2NhbGwgKi8KKwlyZXN1bWVfYW5kX3dhaXRfdHJhY2VlKHBpZCwgUFRS QUNFX1NZU0NBTEwpOworCisJLyogTm93LCBjaGVjayByZWdzLmEwIG9mIHRoZSByZXN0YXJ0ZWQg c3lzY2FsbCAqLworCWlmIChwdHJhY2UoUFRSQUNFX0dFVFJFR1NFVCwgcGlkLCBOVF9QUlNUQVRV UywgJmlvdikpCisJCXBlcnJfYW5kX2V4aXQoImZhaWxlZCB0byBnZXQgdHJhY2VlIHJlZ2lzdGVy c1xuIik7CisKKwkvKiBNb2RpZnkgYTAvb3JpZ19hMCBmb3IgdGhlIHJlc3RhcnRlZCBzeXNjYWxs ICovCisJc3dpdGNoIChvcHQpIHsKKwljYXNlIE1PRElGWV9BMDoKKwkJcmVncy5hMCA9IE9SSUdf QTBfQUZURVJfTU9ESUZJRUQ7CisJCWJyZWFrOworCWNhc2UgTU9ESUZZX09SSUdfQTA6CisJCXJl Z3Mub3JpZ19hMCA9IE9SSUdfQTBfQUZURVJfTU9ESUZJRUQ7CisJCWJyZWFrOworCX0KKworCWlm IChwdHJhY2UoUFRSQUNFX1NFVFJFR1NFVCwgcGlkLCBOVF9QUlNUQVRVUywgJmlvdikpCisJCXBl cnJfYW5kX2V4aXQoImZhaWxlZCB0byBzZXQgdHJhY2VlIHJlZ2lzdGVyc1xuIik7CisKKwkvKiBS ZXN1bWUgdGhlIHRyYWNlZSAqLworCXB0cmFjZShQVFJBQ0VfQ09OVCwgcGlkLCAwLCAwKTsKKwlp ZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkKKwkJcGVycl9hbmRfZXhpdCgiZmFp bGVkIHRvIHdhaXQgZm9yIHRoZSB0cmFjZWVcbiIpOworCisJKnJlc3VsdCA9IFdFWElUU1RBVFVT KHN0YXR1cyk7Cit9CisKK1RFU1QocHRyYWNlX21vZGlmeV9hMCkKK3sKKwlpbnQgcmVzdWx0Owor CisJcHRyYWNlX3Jlc3RhcnRfc3lzY2FsbChNT0RJRllfQTAsICZyZXN1bHQpOworCisJLyogVGhl IHRyYWNlcidzIG1vZGlmaWNhdGlvbiBvZiBhMCBjYW5ub3QgYWZmZWN0IHRoZSByZXN0YXJ0ZWQg dHJhY2VlICovCisJRVhQRUNUX0VRKERFRkFVTFRfQTAsIHJlc3VsdCk7Cit9CisKK1RFU1QocHRy YWNlX21vZGlmeV9vcmlnX2EwKQoreworCWludCByZXN1bHQ7CisKKwlwdHJhY2VfcmVzdGFydF9z eXNjYWxsKE1PRElGWV9PUklHX0EwLCAmcmVzdWx0KTsKKworCS8qIFRoZSB0cmFjZXIgbXVzdCBt b2RpZnkgb3JpZ19hMCB0byBhY3R1YWxseSBjaGFuZ2UgdGhlIHRyYWNlZSdzIGEwICovCisJRVhQ RUNUX0VRKE9SSUdfQTBfQUZURVJfTU9ESUZJRUQsIHJlc3VsdCk7Cit9CisKK1RFU1RfSEFSTkVT U19NQUlOCi0tIAoyLjQ0LjAKCj4gCj4gVGhlIGN1cnJlbnQgdGVzdCBtYXkgbm90IGludHVpdGl2 ZWx5IHJlZmxlY3QgdGhlIGlzc3VlLiBJZiBwb3NzaWJsZSwgSSB3aWxsCj4gcHJvdmlkZSBhIG1v cmUgY29tcHJlaGVuc2l2ZSB0ZXN0IGJhc2VkIG9uIGV2ZXJ5b25lJ3Mgc3VnZ2VzdGlvbnMuCj4g Cj4gVGhhbmtzLAo+IFF1YW4KPiAKPiA+ID4gCj4gPiA+IENvbXBhcmVkIHRvIHRoZSB0ZXN0IHBy b2dyYW0sIGEgbW9yZSBjb21tb24gc2NlbmFyaW8gaXMgdGhlIHVzZSBvZiB0aGUKPiA+ID4gZXhl Y2Ugc3lzY2FsbCwgd2hpY2ggc2VuZHMgYSBzaWduYWwgaW4gdGhlIGtlcm5lbCBwYXRoIHRvIHJl c3RhcnQKPiA+ID4gdGhlIHN5c2NhbGwuCj4gPiA+IAo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBRdWFu IFpob3UgPHpob3VxdWFuQGlzY2FzLmFjLmNuPgo+ID4gPiAtLS0KPiA+ID4gICB0b29scy90ZXN0 aW5nL3NlbGZ0ZXN0cy9yaXNjdi9NYWtlZmlsZSAgICAgICAgfCAgIDIgKy0KPiA+ID4gICB0b29s cy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvLmdpdGlnbm9yZSAgfCAgIDEgKwo+ID4gPiAg IHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jpc2N2L2FiaS9NYWtlZmlsZSAgICB8ICAxMiArKwo+ ID4gPiAgIC4uLi9yaXNjdi9hYmkvcHRyYWNlX3Jlc3RhcnRfc3lzY2FsbC5jICAgICAgICB8IDE0 OCArKysrKysrKysrKysrKysrKysKPiA+ID4gICA0IGZpbGVzIGNoYW5nZWQsIDE2MiBpbnNlcnRp b25zKCspLCAxIGRlbGV0aW9uKC0pCj4gPiA+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3Rl c3Rpbmcvc2VsZnRlc3RzL3Jpc2N2L2FiaS8uZ2l0aWdub3JlCj4gPiA+ICAgY3JlYXRlIG1vZGUg MTAwNjQ0IHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jpc2N2L2FiaS9NYWtlZmlsZQo+ID4gPiAg IGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvcHRy YWNlX3Jlc3RhcnRfc3lzY2FsbC5jCj4gPiA+IAo+ID4gPiBkaWZmIC0tZ2l0IGEvdG9vbHMvdGVz dGluZy9zZWxmdGVzdHMvcmlzY3YvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9y aXNjdi9NYWtlZmlsZQo+ID4gPiBpbmRleCA3Y2UwM2Q4MzJiNjQuLjk4NTQxZGMyZjE2NCAxMDA2 NDQKPiA+ID4gLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmlzY3YvTWFrZWZpbGUKPiA+ ID4gKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmlzY3YvTWFrZWZpbGUKPiA+ID4gQEAg LTUsNyArNSw3IEBACj4gPiA+ICAgQVJDSCA/PSAkKHNoZWxsIHVuYW1lIC1tIDI+L2Rldi9udWxs IHx8IGVjaG8gbm90KQo+ID4gPiAgIGlmbmVxICgsJChmaWx0ZXIgJChBUkNIKSxyaXNjdikpCj4g PiA+IC1SSVNDVl9TVUJUQVJHRVRTID89IGh3cHJvYmUgdmVjdG9yIG1tIHNpZ3JldHVybgo+ID4g PiArUklTQ1ZfU1VCVEFSR0VUUyA/PSBod3Byb2JlIHZlY3RvciBtbSBzaWdyZXR1cm4gYWJpCj4g PiA+ICAgZWxzZQo+ID4gPiAgIFJJU0NWX1NVQlRBUkdFVFMgOj0KPiA+ID4gICBlbmRpZgo+ID4g PiBkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmlzY3YvYWJpLy5naXRpZ25v cmUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvLmdpdGlnbm9yZQo+ID4gPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLmUxZTAwZmZiOWRi OQo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3Rz L3Jpc2N2L2FiaS8uZ2l0aWdub3JlCj4gPiA+IEBAIC0wLDAgKzEgQEAKPiA+ID4gK2FiaQo+ID4g Cj4gPiBUaGUgZ2l0aWdub3JlIHNob3VsZCBjb250YWluIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGdl bmVyYXRlZCBiaW5hcmllcwo+ID4gdGhhdCBzaG91bGQgYmUgaWdub3JlZC4gQ2FuIHlvdSBwdXQg cHRyYWNlX3Jlc3RhcnRfc3lzY2FsbCBpbiBoZXJlCj4gPiBpbnN0ZWFkIG9mIGFiaT8KPiA+IAo+ IAo+IC4uLnllYWgsIEkgd2lsbCBmaXggaXQgbGF0ZXIuCj4gCj4gPiA+IGRpZmYgLS1naXQgYS90 b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvTWFrZWZpbGUgYi90b29scy90ZXN0aW5n L3NlbGZ0ZXN0cy9yaXNjdi9hYmkvTWFrZWZpbGUKPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiA+ID4gaW5kZXggMDAwMDAwMDAwMDAwLi42MzRmYTdkZTc0ZTYKPiA+ID4gLS0tIC9kZXYvbnVs bAo+ID4gPiArKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvTWFrZWZpbGUK PiA+ID4gQEAgLTAsMCArMSwxMiBAQAo+ID4gPiArIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMAo+ID4gPiArIyBDb3B5cmlnaHQgKEMpIDIwMjEgQVJNIExpbWl0ZWQKPiA+ID4gKyMg T3JpZ2luYWxseSB0b29scy90ZXN0aW5nL2FybTY0L2FiaS9NYWtlZmlsZQo+ID4gPiArCj4gPiA+ ICtDRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL3Rvb2xzL2luY2x1ZGUKPiA+ID4gKwo+ID4gPiAr VEVTVF9HRU5fUFJPR1MgOj0gcHRyYWNlX3Jlc3RhcnRfc3lzY2FsbAo+ID4gPiArCj4gPiA+ICtp bmNsdWRlIC4uLy4uL2xpYi5tawo+ID4gPiArCj4gPiA+ICskKE9VVFBVVCkvcHRyYWNlX3Jlc3Rh cnRfc3lzY2FsbDogcHRyYWNlX3Jlc3RhcnRfc3lzY2FsbC5jCj4gPiA+ICsJJChDQykgLXN0YXRp YyAtbyRAICQoQ0ZMQUdTKSAkKExERkxBR1MpICReCj4gPiA+IGRpZmYgLS1naXQgYS90b29scy90 ZXN0aW5nL3NlbGZ0ZXN0cy9yaXNjdi9hYmkvcHRyYWNlX3Jlc3RhcnRfc3lzY2FsbC5jIGIvdG9v bHMvdGVzdGluZy9zZWxmdGVzdHMvcmlzY3YvYWJpL3B0cmFjZV9yZXN0YXJ0X3N5c2NhbGwuYwo+ ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjNlMjU1 NDhjYjk1ZQo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2Vs ZnRlc3RzL3Jpc2N2L2FiaS9wdHJhY2VfcmVzdGFydF9zeXNjYWxsLmMKPiA+ID4gQEAgLTAsMCAr MSwxNDggQEAKPiA+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkK PiA+ID4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ID4gPiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ID4g PiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ID4gPiArI2luY2x1ZGUgPHVuaXN0ZC5oPgo+ID4gPiAr I2luY2x1ZGUgPGZjbnRsLmg+Cj4gPiA+ICsjaW5jbHVkZSA8c2lnbmFsLmg+Cj4gPiA+ICsjaW5j bHVkZSA8ZXJybm8uaD4KPiA+ID4gKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KPiA+ID4gKyNpbmNs dWRlIDxzeXMvcHRyYWNlLmg+Cj4gPiA+ICsjaW5jbHVkZSA8c3lzL3N0YXQuaD4KPiA+ID4gKyNp bmNsdWRlIDxzeXMvdXNlci5oPgo+ID4gPiArI2luY2x1ZGUgPHN5cy93YWl0Lmg+Cj4gPiA+ICsj aW5jbHVkZSA8c3lzL3Vpby5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgo+ID4gPiAr I2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgo+ID4gPiArI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4K PiA+ID4gKwo+ID4gPiArI2luY2x1ZGUgIi4uLy4uL2tzZWxmdGVzdF9oYXJuZXNzLmgiCj4gPiA+ ICsKPiA+ID4gKyNkZWZpbmUgT1JJR19BMF9BRlRFUl9NT0RJRklFRCAgMHg1Cj4gPiA+ICsjZGVm aW5lIE1PRElGWV9BMCAgICAgICAgICAgICAgIDB4MDEKPiA+ID4gKyNkZWZpbmUgTU9ESUZZX09S SUdfQTAgICAgICAgICAgMHgwMgo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIHBlcnJfYW5kX2V4aXQo Zm10LCAuLi4pIGRvIHsJCQlcCj4gPiA+ICsJY2hhciBidWZbMjU2XTsJCQkJCVwKPiA+ID4gKwlz bnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6JWQ6ICIgZm10ICI6ICVtXG4iLAlcCj4gPiA+ ICsJCQlfX2Z1bmNfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOwlcCj4gPiA+ICsJcGVycm9y KGJ1Zik7CQkJCQkJXAo+ID4gPiArCWV4aXQoLTEpOwkJCQkJCVwKPiA+ID4gK30gd2hpbGUgKDAp Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN1bWVfYW5kX3dhaXRfdHJhY2Vl KHBpZF90IHBpZCwgaW50IGZsYWcpCj4gPiA+ICt7Cj4gPiA+ICsJaW50IHN0YXR1czsKPiA+ID4g Kwo+ID4gPiArCWlmIChwdHJhY2UoZmxhZywgcGlkLCAwLCAwKSkKPiA+ID4gKwkJcGVycl9hbmRf ZXhpdCgiZmFpbGVkIHRvIHJlc3VtZSB0aGUgdHJhY2VlICVkIiwgcGlkKTsKPiA+ID4gKwo+ID4g PiArCWlmICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgIT0gcGlkKQo+ID4gPiArCQlwZXJyX2Fu ZF9leGl0KCJmYWlsZWQgdG8gd2FpdCBmb3IgdGhlIHRyYWNlZSAlZCIsIHBpZCk7Cj4gPiA+ICt9 Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyB2b2lkIHB0cmFjZV9yZXN0YXJ0X3N5c2NhbGwoaW50IG9w dCwgaW50ICpyZXN1bHQpCj4gPiA+ICt7Cj4gPiA+ICsJaW50IHN0YXR1czsKPiA+ID4gKwlpbnQg cFsyXSwgZmRfemVybzsKPiA+ID4gKwlwaWRfdCBwaWQ7Cj4gPiA+ICsKPiA+ID4gKwlzdHJ1Y3Qg dXNlcl9yZWdzX3N0cnVjdCByZWdzOwo+ID4gPiArCXN0cnVjdCBpb3ZlYyBpb3YgPSB7Cj4gPiA+ ICsJCS5pb3ZfYmFzZSA9ICZyZWdzLAo+ID4gPiArCQkuaW92X2xlbiA9IHNpemVvZihyZWdzKSwK PiA+ID4gKwl9Owo+ID4gPiArCj4gPiA+ICsJaWYgKHBpcGUocCkpCj4gPiA+ICsJCXBlcnJfYW5k X2V4aXQoImZhaWxlZCB0byBjcmVhdGUgYSBwaXBlIik7Cj4gPiA+ICsKPiA+ID4gKwlmZF96ZXJv ID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRE9OTFkpOwo+ID4gPiArCWlmIChmZF96ZXJvIDwgMCkK PiA+ID4gKwkJcGVycl9hbmRfZXhpdCgiZmFpbGVkIHRvIG9wZW4gL2Rldi96ZXJvIik7Cj4gPiA+ ICsKPiA+ID4gKwlwaWQgPSBmb3JrKCk7Cj4gPiA+ICsJaWYgKHBpZCA9PSAwKSB7Cj4gPiA+ICsJ CWNoYXIgYzsKPiA+ID4gKwo+ID4gPiArCQkvKiBNYXJrIG9uZXNlbGYgYmVpbmcgdHJhY2VkICov Cj4gPiA+ICsJCWlmIChwdHJhY2UoUFRSQUNFX1RSQUNFTUUsIDAsIDAsIDApKQo+ID4gPiArCQkJ cGVycl9hbmRfZXhpdCgiZmFpbGVkIHRvIHJlcXVlc3QgZm9yIHRyYWNlciB0byB0cmFjZSBtZSIp Owo+ID4gPiArCj4gPiA+ICsJCWtpbGwoZ2V0cGlkKCksIFNJR1NUT1ApOwo+ID4gPiArCj4gPiA+ ICsJCWlmIChyZWFkKHBbMF0sICZjLCAxKSAhPSAxKQo+ID4gPiArCQkJZXhpdCgxKTsKPiA+ID4g Kwo+ID4gPiArCQlleGl0KDApOwo+ID4gPiArCX0gZWxzZSBpZiAocGlkIDwgMCkKPiA+ID4gKwkJ ZXhpdCgxKTsKPiA+ID4gKwo+ID4gPiArCWlmICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgIT0g cGlkKQo+ID4gPiArCQlwZXJyX2FuZF9leGl0KCJmYWlsZWQgdG8gd2FpdCBmb3IgdGhlIHRyYWNl ZSAlZFxuIiwgcGlkKTsKPiA+ID4gKwo+ID4gPiArCS8qIFJlc3VtZSB0aGUgdHJhY2VlIHVudGls IHRoZSBuZXh0IHN5c2NhbGwgKi8KPiA+ID4gKwlyZXN1bWVfYW5kX3dhaXRfdHJhY2VlKHBpZCwg UFRSQUNFX1NZU0NBTEwpOwo+ID4gPiArCj4gPiA+ICsJLyogRGVsaXZlciBhIHNpZ25hbCB0byBp bnRlcnJ1cHQgdGhlIHN5c2NhbGwgKi8KPiA+ID4gKwlraWxsKHBpZCwgU0lHVVNSMSk7Cj4gPiA+ ICsKPiA+ID4gKwkvKiBUaGUgdHJhY2VlIHN0b3BzIGF0IHN5c2NhbGwgZXhpdCAqLwo+ID4gPiAr CXJlc3VtZV9hbmRfd2FpdF90cmFjZWUocGlkLCBQVFJBQ0VfU1lTQ0FMTCk7Cj4gPiA+ICsKPiA+ ID4gKwkvKiBDaGVjayB0cmFjZWUgb3JpZ19hMCBiZWZvcmUgc3lzY2FsbCByZXN0YXJ0ICovCj4g PiA+ICsJaWYgKHB0cmFjZShQVFJBQ0VfR0VUUkVHU0VULCBwaWQsIE5UX1BSU1RBVFVTLCAmaW92 KSkKPiA+ID4gKwkJcGVycl9hbmRfZXhpdCgiZmFpbGVkIHRvIGdldCB0cmFjZWUgcmVnaXN0ZXJz Iik7Cj4gPiA+ICsJaWYgKHJlZ3Mub3JpZ19hMCAhPSBwWzBdKQo+ID4gPiArCQlwZXJyX2FuZF9l eGl0KCJ1bmV4cGVjdGVkIGEwIik7Cj4gPiA+ICsKPiA+ID4gKwkvKiBNb2RpZnkgYTAvb3JpZ19h MCBmb3IgdGhlIHJlc3RhcnRlZCBzeXNjYWxsICovCj4gPiA+ICsJc3dpdGNoIChvcHQpIHsKPiA+ ID4gKwljYXNlIE1PRElGWV9BMDoKPiA+ID4gKwkJcmVncy5hMCA9IGZkX3plcm87Cj4gPiA+ICsJ CWJyZWFrOwo+ID4gPiArCWNhc2UgTU9ESUZZX09SSUdfQTA6Cj4gPiA+ICsJCXJlZ3Mub3JpZ19h MCA9IGZkX3plcm87Cj4gPiA+ICsJCWJyZWFrOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWlm IChwdHJhY2UoUFRSQUNFX1NFVFJFR1NFVCwgcGlkLCBOVF9QUlNUQVRVUywgJmlvdikpCj4gPiA+ ICsJCXBlcnJfYW5kX2V4aXQoImZhaWxlZCB0byBzZXQgdHJhY2VlIHJlZ2lzdGVycyIpOwo+ID4g PiArCj4gPiA+ICsJLyogSWdub3JlIFNJR1VTUjEgc2lnbmFsICovCj4gPiA+ICsJcmVzdW1lX2Fu ZF93YWl0X3RyYWNlZShwaWQsIFBUUkFDRV9TWVNDQUxMKTsKPiA+ID4gKwo+ID4gPiArCS8qIFN0 b3AgYXQgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSByZXN0YXJ0ZWQgc3lzY2FsbCAqLwo+ID4gPiAr CXJlc3VtZV9hbmRfd2FpdF90cmFjZWUocGlkLCBQVFJBQ0VfU1lTQ0FMTCk7Cj4gPiA+ICsKPiA+ ID4gKwkvKiBOb3csIGNoZWNrIHJlZ3MuYTAgb2YgdGhlIHJlc3RhcnRlZCBzeXNjYWxsICovCj4g PiA+ICsJaWYgKHB0cmFjZShQVFJBQ0VfR0VUUkVHU0VULCBwaWQsIE5UX1BSU1RBVFVTLCAmaW92 KSkKPiA+ID4gKwkJcGVycl9hbmRfZXhpdCgiZmFpbGVkIHRvIGdldCB0cmFjZWUgcmVnaXN0ZXJz Iik7Cj4gPiA+ICsJKnJlc3VsdCA9IHJlZ3MuYTA7Cj4gPiA+ICsKPiA+ID4gKwkvKiBSZXN1bWUg dGhlIHRyYWNlZSAqLwo+ID4gPiArCXB0cmFjZShQVFJBQ0VfQ09OVCwgcGlkLCAwLCAwKTsKPiA+ ID4gKwlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkKPiA+ID4gKwkJcGVycl9h bmRfZXhpdCgiZmFpbGVkIHRvIHdhaXQgZm9yIHRoZSB0cmFjZWUiKTsKPiA+ID4gK30KPiA+ID4g Kwo+ID4gPiArVEVTVChwdHJhY2VfbW9kaWZ5X2EwKQo+ID4gPiArewo+ID4gPiArCWludCByZXN1 bHQ7Cj4gPiA+ICsKPiA+ID4gKwlwdHJhY2VfcmVzdGFydF9zeXNjYWxsKE1PRElGWV9BMCwgJnJl c3VsdCk7Cj4gPiA+ICsKPiA+ID4gKwkvKiBUaGUgdHJhY2VyJ3MgbW9kaWZpY2F0aW9uIG9mIGEw IGNhbm5vdCBhZmZlY3QgdGhlIHJlc3RhcnRlZCB0cmFjZWUgKi8KPiA+ID4gKwlFWFBFQ1RfTkUo T1JJR19BMF9BRlRFUl9NT0RJRklFRCwgcmVzdWx0KTsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiAr VEVTVChwdHJhY2VfbW9kaWZ5X29yaWdfYTApCj4gPiA+ICt7Cj4gPiA+ICsJaW50IHJlc3VsdDsK PiA+ID4gKwo+ID4gPiArCXB0cmFjZV9yZXN0YXJ0X3N5c2NhbGwoTU9ESUZZX09SSUdfQTAsICZy ZXN1bHQpOwo+ID4gPiArCj4gPiA+ICsJLyogVGhlIHRyYWNlciBtdXN0IG1vZGlmeSBvcmlnX2Ew IHRvIGFjdHVhbGx5IGNoYW5nZSB0aGUgdHJhY2VlJ3MgYTAgKi8KPiA+ID4gKwlFWFBFQ1RfRVEo T1JJR19BMF9BRlRFUl9NT0RJRklFRCwgcmVzdWx0KTsKPiA+IAo+ID4gSG93IGRvZXMgdGhlIHZh bHVlIGVuZCB1cCBiZWluZyA1Pwo+ID4gCj4gPiAtIENoYXJsaWUKPiA+IAo+IAo+IFRoZSB0cmFj ZXIgdWx0aW1hdGVseSBzZXRzIGBmZF96ZXJvYCB0byB0aGUgcmVzdGFydGVkIHN5c2NhbGwuCj4g Cj4gU2luY2UgMCwgMSwgYW5kIDIgYXJlIHN0YW5kYXJkIGlucHV0LCBvdXRwdXQsIGFuZCBlcnJv ciwgdGhlIGZpbGUKPiBkZXNjcmlwdG9ycyB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIG9yZGVy OiBgcFswXSAtPiBwWzFdIC0+IGZkX3plcm9gLgo+IFRodXMsIGZkX3plcm8gd2lsbCBiZSA1Lgo+ IAo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtURVNUX0hBUk5FU1NfTUFJTgo+ID4gPiAtLSAKPiA+ ID4gMi4zNC4xCj4gPiA+IAo+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1yaXNjdgo=