From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) (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 75347321426 for ; Wed, 27 Aug 2025 08:04:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756281896; cv=none; b=l2h8m/wOlOZShWY4i2XLpJkdkPor3IkJrT29AtlHZlfrl8SR3b3vtNesQ9mjM29km5/Z41q8I8W7g79DU/HaZeHD63A+1kUQGNRSH6W83KsLwHscQ3iYHb8T4X2EHaBmVgSg78rDJr0spej1C+Ws3lV1SS/QqL8vCdpk8zgHZ/Q= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756281896; c=relaxed/simple; bh=gbcLll/AnyN4KW9wexFQ+zB4uHl2kSWRwMWKLL+G/5E=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=Zsy6q1zPCEzNxKizd4gEWx3RcKEWXuji5wTkKxGJmIA0Bvi/hT+o4/OBC6euaAZHCtaqfeUAhYJB/rjSLIwYG/RrfAsFKelquVKazUHZXwbMDjHKtUy+oF3eWOyXkTRIdkt5eRp2tMTgXy7g49KrAuDxiKSAvZjop0KtxxmZ4zU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc.com header.i=@rivosinc.com header.b=JY6Qh7AL; arc=none smtp.client-ip=209.85.216.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (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 header.i=@rivosinc.com header.b="JY6Qh7AL" Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-3253f0c8788so5432526a91.0 for ; Wed, 27 Aug 2025 01:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc.com; s=google; t=1756281893; x=1756886693; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:message-id:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to; bh=zjK51+2A52fHet//FxjRNjwkcJGNCioQhxdhxLuT9Eg=; b=JY6Qh7ALDARDMDq5mhQDsBmWmGpzjlml1fR/cZ2TdkRkoLWBG7J5qmlnlihRp3sCNK xgMYNFAXTdZ7TO9gbm+TWFd2uFFAyAUsqEvPu4wtapE6oV8iCt30Tg/HKxV+hSpzQx/C hTKGVXr4ltHRv8cOHua+ETQHSbVCu3rCf07b2KUj6fC6cd764va+uo1SdtKosMhDbUNF hIkf6V38j81C0jrqrJkJQ9l+RXaNGeXPLdlTkWWiF0d15dSaTUgxIXBp5Fo2okGVIbCI nfbuGY/C7tiP/5DoesvwD05ge8o8WatwaFreLcrm20VnCzT6/C+74zV6JMIAnDi5z3+S 6JoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756281893; x=1756886693; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:message-id:subject:cc:to:from:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=zjK51+2A52fHet//FxjRNjwkcJGNCioQhxdhxLuT9Eg=; b=v0S4TTVYnKKNzXj+6DTdmYzRi0jRQait0oHHUU2TZM/n3Uo8wUq7WwWqkQ9gUfAMaF JiXs9Hp26JkOO5XV9wBJXyGWVVPTioo+paXsfYEhEEwEM2SXHVqFG432XWQmQpiNYXQp W+OlqOLOkDZ4NksYLnRSpVXmxLam9wEtlhcWKbI77hTUILldD5kf6iwGmQMRKgGiDVQ0 twrqRnh93Awfp+/WyJ1CdmIPuEH9z/lsX6Ts5Nbv1nVeJxZUr1xdsPfoPAyCRH7LlxSS JtOey53LXIp5H+L2SwaNA7HOhwm0SJmiXyPasHZeoI98EoP+nAkvYa9KE+ItRdMjdevT OV8Q== X-Forwarded-Encrypted: i=1; AJvYcCWUP/QAfqmnQi/+gZPZdNVHhjCkiQiGi0ENRhBrcUafyiZ7KI35Jg02RNLv9I85QgTMk1Nl3o/I5bBYZWNhleM=@vger.kernel.org X-Gm-Message-State: AOJu0YzO5Vtsfr1+IbsvyhtdjWKn1AeoFE+MsEOjjqM4sVMDPB/o7xw9 nemNFKmvPeZBZHUvnhC1vrDxpuogh0hj8nwgAy0D7THZ589F0h+n3DcIH+ci0zL/Nuo= X-Gm-Gg: ASbGnctI48L1mN8mfjYnj0Ak32aCYBWr5S98Z+INISkTKnKf8vAlcbOtx5qvlhimQ9O AioyCPe//rEVQwRrDj9rBKnUyllNT27g4/Wph5XCg/gtW7YrzH6bWdl0B14C0V1rmh+B14QAoTt 0hLSIDAdj/3iNok7pqIFkJ82IQGqHeI5XOUbg9EIKv7iRX4kJYHQGL6SGmALi8cyx7esmFb1QPY QJmdJ4IS07f+ID3517EdNkQGAijUaI/4Da+3cAk3Cc1gSzJQTL/5TEQtZgb36ArEQHYcaZZcq/S gihNdZBuN7lZU6cv2WITMjZ2e2ILdZ3EOCuimo1Q7eduexsoZ71zs5q0DYEj+t+5R5n8HYd3sD1 3lrGzWk3iTI4gkyGfdA== X-Google-Smtp-Source: AGHT+IFmLVeBhKzJEqSUf1IlkeKSrgzItqcCx7zQbQCgDi+N7L9pd7Nncg0iDwIKNaLuKX3UWq7WIQ== X-Received: by 2002:a17:90b:4fd0:b0:325:c92:4a89 with SMTP id 98e67ed59e1d1-32515e3cad8mr20990981a91.5.1756281892340; Wed, 27 Aug 2025 01:04:52 -0700 (PDT) Received: from ghost ([2601:647:6700:64d0:c960:881a:73ea:37d7]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3276f6b7458sm1367809a91.12.2025.08.27.01.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Aug 2025 01:04:51 -0700 (PDT) Date: Wed, 27 Aug 2025 01:04:48 -0700 From: Charlie Jenkins To: Himanshu Chauhan , Jesse Taube Cc: linux-riscv@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Oleg Nesterov , Kees Cook , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Liang Kan , Shuah Khan , Samuel Holland , Conor Dooley , Deepak Gupta , Andrew Jones , Atish Patra , Anup Patel , Mayuresh Chitale , WangYuli , Huacai Chen , Arnd Bergmann , Andrew Morton , Luis Chamberlain , "Mike Rapoport (Microsoft)" , Nam Cao , Yunhui Cui , Joel Granados , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Sebastian Andrzej Siewior , Celeste Liu , Chunyan Zhang , Nylon Chen , Thomas Gleixner , Thomas =?iso-8859-1?Q?Wei=DFschuh?= , Vincenzo Frascino , Joey Gouly , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-perf-users@vger.kernel.org, linux-kselftest@vger.kernel.org, Joel Stanley Subject: Re: [PATCH 5/8] riscv: hw_breakpoint: Use icount for single stepping Message-ID: 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: On Tue, Aug 26, 2025 at 10:08:04AM +0530, Himanshu Chauhan wrote: > On Fri, Aug 22, 2025 at 11:17 PM Jesse Taube wrote: > > > > The Sdtrig RISC-V ISA extension does not have a resume flag for > > returning to and executing the instruction at the breakpoint. > > To avoid skipping the instruction or looping, it is necessary to remove > > the hardware breakpoint and single step. Use the icount feature of > > Sdtrig to accomplish this. Use icount as default with an option to allow > > software-based single stepping when hardware or SBI does not have > > icount functionality, as it may cause unwanted side effects when reading > > the instruction from memory. > > Can you please elaborate on this? I remember noticing the absence of > the resume flag which was causing loops. Thank you for your feedback. Jesse's internship came to an end last Friday (August 22nd) so I will be picking up these patches, but I have also added her personal email onto this thread. When a breakpoint is triggered and the kernel gains control, the last instruction to execute was the instruction before the instruction where the breakpoint is installed. If execution was to be resumed at this stage, the same breakpoint would be triggered again. So single stepping requires a careful dance of enabling and disabling breakpoints. However, we can avoid this overhead and code complexity can be reduced by using the icount trigger which allows a direct method for single stepping. > > > > > Signed-off-by: Jesse Taube > > --- > > OpenSBI implementation of sbi_debug_read_triggers does not return the > > updated CSR values. There needs to be a check for working > > sbi_debug_read_triggers before this works. > > > > https://lists.riscv.org/g/tech-prs/message/1476 > > > > RFC -> V1: > > - Add dbtr_mode to rv_init_icount_trigger > > - Add icount_triggered to check which breakpoint was triggered > > - Fix typo: s/affects/effects > > - Move HW_BREAKPOINT_COMPUTE_STEP to Platform type > > V1 -> V2: > > - Remove HW_BREAKPOINT_COMPUTE_STEP kconfig option > > --- > > arch/riscv/kernel/hw_breakpoint.c | 173 ++++++++++++++++++++++++++---- > > 1 file changed, 155 insertions(+), 18 deletions(-) > > > > diff --git a/arch/riscv/kernel/hw_breakpoint.c b/arch/riscv/kernel/hw_breakpoint.c > > index 3f96e744a711..f12306247436 100644 > > --- a/arch/riscv/kernel/hw_breakpoint.c > > +++ b/arch/riscv/kernel/hw_breakpoint.c > > @@ -20,6 +20,7 @@ > > #define DBTR_TDATA1_DMODE BIT_UL(__riscv_xlen - 5) > > > > #define DBTR_TDATA1_TYPE_MCONTROL (2UL << DBTR_TDATA1_TYPE_SHIFT) > > +#define DBTR_TDATA1_TYPE_ICOUNT (3UL << DBTR_TDATA1_TYPE_SHIFT) > > #define DBTR_TDATA1_TYPE_MCONTROL6 (6UL << DBTR_TDATA1_TYPE_SHIFT) > > > > #define DBTR_TDATA1_MCONTROL6_LOAD BIT(0) > > @@ -62,6 +63,14 @@ > > (FIELD_PREP(DBTR_TDATA1_MCONTROL_SIZELO_FIELD, lo) | \ > > FIELD_PREP(DBTR_TDATA1_MCONTROL_SIZEHI_FIELD, hi)) > > > > +#define DBTR_TDATA1_ICOUNT_U BIT(6) > > +#define DBTR_TDATA1_ICOUNT_S BIT(7) > > +#define DBTR_TDATA1_ICOUNT_PENDING BIT(8) > > +#define DBTR_TDATA1_ICOUNT_M BIT(9) > > +#define DBTR_TDATA1_ICOUNT_COUNT_FIELD GENMASK(23, 10) > > +#define DBTR_TDATA1_ICOUNT_VU BIT(25) > > +#define DBTR_TDATA1_ICOUNT_VS BIT(26) > > + > > enum dbtr_mode { > > DBTR_MODE_U = 0, > > DBTR_MODE_S, > > @@ -79,6 +88,7 @@ static DEFINE_PER_CPU(union sbi_dbtr_shmem_entry, sbi_dbtr_shmem); > > > > /* number of debug triggers on this cpu . */ > > static int dbtr_total_num __ro_after_init; > > +static bool have_icount __ro_after_init; > > static unsigned long dbtr_type __ro_after_init; > > static unsigned long dbtr_init __ro_after_init; > > > > @@ -129,6 +139,7 @@ static int arch_smp_teardown_sbi_shmem(unsigned int cpu) > > static void init_sbi_dbtr(void) > > { > > struct sbiret ret; > > + unsigned long dbtr_count = 0; > > > > /* > > * Called by hw_breakpoint_slots and arch_hw_breakpoint_init. > > @@ -143,6 +154,19 @@ static void init_sbi_dbtr(void) > > return; > > } > > > > + ret = sbi_ecall(SBI_EXT_DBTR, SBI_EXT_DBTR_NUM_TRIGGERS, > > + DBTR_TDATA1_TYPE_ICOUNT, 0, 0, 0, 0, 0); > > + if (ret.error) { > > + pr_warn("%s: failed to detect icount triggers. error: %ld.\n", > > + __func__, ret.error); > > + } else if (!ret.value) { > > + pr_warn("%s: No icount triggers available. " > > + "Falling-back to computing single step address.\n", __func__); > > + } else { > > + dbtr_count = ret.value; > > + have_icount = true; > > + } > > + > > ret = sbi_ecall(SBI_EXT_DBTR, SBI_EXT_DBTR_NUM_TRIGGERS, > > DBTR_TDATA1_TYPE_MCONTROL6, 0, 0, 0, 0, 0); > > if (ret.error) { > > @@ -151,7 +175,7 @@ static void init_sbi_dbtr(void) > > } else if (!ret.value) { > > pr_warn("%s: No mcontrol6 triggers available.\n", __func__); > > } else { > > - dbtr_total_num = ret.value; > > + dbtr_total_num = min_not_zero((unsigned long)ret.value, dbtr_count); > > dbtr_type = DBTR_TDATA1_TYPE_MCONTROL6; > > return; > > } > > @@ -166,7 +190,7 @@ static void init_sbi_dbtr(void) > > pr_err("%s: No mcontrol triggers available.\n", __func__); > > dbtr_total_num = 0; > > } else { > > - dbtr_total_num = ret.value; > > + dbtr_total_num = min_not_zero((unsigned long)ret.value, dbtr_count); > > dbtr_type = DBTR_TDATA1_TYPE_MCONTROL; > > } > > } > > @@ -320,6 +344,36 @@ static int rv_init_mcontrol6_trigger(const struct perf_event_attr *attr, > > return 0; > > } > > > > +static int rv_init_icount_trigger(struct arch_hw_breakpoint *hw, enum dbtr_mode mode) > > +{ > > + unsigned long tdata1 = DBTR_TDATA1_TYPE_ICOUNT; > > + > > + /* Step one instruction */ > > + tdata1 |= FIELD_PREP(DBTR_TDATA1_ICOUNT_COUNT_FIELD, 1); > > + > > + switch (mode) { > > + case DBTR_MODE_U: > > + tdata1 |= DBTR_TDATA1_ICOUNT_U; > > + break; > > + case DBTR_MODE_S: > > + tdata1 |= DBTR_TDATA1_ICOUNT_S; > > + break; > > + case DBTR_MODE_VS: > > + tdata1 |= DBTR_TDATA1_ICOUNT_VS; > > + break; > > + case DBTR_MODE_VU: > > + tdata1 |= DBTR_TDATA1_ICOUNT_VU; > > + break; > > + default: > > + return -EINVAL; > > + } > > + > > + hw->tdata1 = tdata1; > > + hw->tdata2 = 0; > > + > > + return 0; > > +} > > + > > int hw_breakpoint_arch_parse(struct perf_event *bp, > > const struct perf_event_attr *attr, > > struct arch_hw_breakpoint *hw) > > @@ -372,24 +426,28 @@ static int setup_singlestep(struct perf_event *event, struct pt_regs *regs) > > /* Remove breakpoint even if return error as not to loop */ > > arch_uninstall_hw_breakpoint(event); > > > > - ret = get_insn_nofault(regs, regs->epc, &insn); > > - if (ret < 0) > > - return ret; > > + if (have_icount) { > > + rv_init_icount_trigger(bp, DBTR_MODE_U); > > + } else { > > + ret = get_insn_nofault(regs, regs->epc, &insn); > > + if (ret < 0) > > + return ret; > > > > - next_addr = get_step_address(regs, insn); > > + next_addr = get_step_address(regs, insn); > > > > - ret = get_insn_nofault(regs, next_addr, &insn); > > - if (ret < 0) > > - return ret; > > + ret = get_insn_nofault(regs, next_addr, &insn); > > + if (ret < 0) > > + return ret; > > > > - bp_insn.bp_type = HW_BREAKPOINT_X; > > - bp_insn.bp_addr = next_addr; > > - /* Get the size of the intruction */ > > - bp_insn.bp_len = GET_INSN_LENGTH(insn); > > + bp_insn.bp_type = HW_BREAKPOINT_X; > > + bp_insn.bp_addr = next_addr; > > + /* Get the size of the intruction */ > > + bp_insn.bp_len = GET_INSN_LENGTH(insn); > > > > - ret = hw_breakpoint_arch_parse(NULL, &bp_insn, bp); > > - if (ret) > > - return ret; > > + ret = hw_breakpoint_arch_parse(NULL, &bp_insn, bp); > > + if (ret) > > + return ret; > > + } > > > > ret = arch_install_hw_breakpoint(event); > > if (ret) > > @@ -400,6 +458,79 @@ static int setup_singlestep(struct perf_event *event, struct pt_regs *regs) > > return 0; > > } > > > > +/** > > + * icount_triggered - Check if event's icount was triggered. > > + * @event: Perf event to check > > + * > > + * Check the given perf event's icount breakpoint was triggered. > > + * > > + * Returns: 1 if icount was triggered. > > + * 0 if icount was not triggered. > > + * negative on failure. > > + */ > > +static int icount_triggered(struct perf_event *event) > > +{ > > + union sbi_dbtr_shmem_entry *shmem = this_cpu_ptr(&sbi_dbtr_shmem); > > + struct sbiret ret; > > + struct perf_event **slot; > > + unsigned long tdata1; > > + int i; > > + > > + for (i = 0; i < dbtr_total_num; i++) { > > + slot = this_cpu_ptr(&pcpu_hw_bp_events[i]); > > + > > + if (*slot == event) > > + break; > > + } > > + > > + if (i == dbtr_total_num) { > > + pr_warn("%s: Breakpoint not installed.\n", __func__); > > + return -ENOENT; > > + } > > + > > + raw_spin_lock_irqsave(this_cpu_ptr(&ecall_lock), > > + *this_cpu_ptr(&ecall_lock_flags)); > > + > > + ret = sbi_ecall(SBI_EXT_DBTR, SBI_EXT_DBTR_TRIG_READ, > > + i, 1, 0, 0, 0, 0); > > + tdata1 = shmem->data.tdata1; > > + > > + raw_spin_unlock_irqrestore(this_cpu_ptr(&ecall_lock), > > + *this_cpu_ptr(&ecall_lock_flags)); > > + if (ret.error) { > > + pr_warn("%s: failed to read trigger. error: %ld\n", __func__, ret.error); > > + return sbi_err_map_linux_errno(ret.error); > > To avoid a flurry of events or messages, it would probably be good to > disable the trigger. That is a good point. > > > + } > > + > > + /* > > + * The RISC-V Debug Specification > > + * Tim Newsome, Paul Donahue (Ventana Micro Systems) > > + * Version 1.0, Revised 2025-02-21: Ratified > I think mentioning the version number and section would be enough. Agreed. > > > + * 5.7.13. Instruction Count (icount, at 0x7a1) > > + * When count is 1 and the trigger matches, then pending becomes set. > > + * In addition count will become 0 unless it is hard-wired to 1. > > + * When pending is set, the trigger fires just before any further > > + * instructions are executed in a mode where the trigger is enabled. > > + * As the trigger fires, pending is cleared. In addition, if count is > > + * hard-wired to 1 then m, s, u, vs, and vu are all cleared. > > + */ > > + if (FIELD_GET(DBTR_TDATA1_ICOUNT_COUNT_FIELD, tdata1) == 0) > > + return 1; > > + > > + if (FIELD_GET(DBTR_TDATA1_ICOUNT_COUNT_FIELD, tdata1) != 1) > > + return 0; > > + > > + if (tdata1 & DBTR_TDATA1_ICOUNT_U) > > + return 0; > > + if (tdata1 & DBTR_TDATA1_ICOUNT_S) > > + return 0; > > + if (tdata1 & DBTR_TDATA1_ICOUNT_VU) > > + return 0; > > + if (tdata1 & DBTR_TDATA1_ICOUNT_VU) > > + return 0; > > + return 1; > > +} > > + > > /* > > * HW Breakpoint/watchpoint handler > > */ > > @@ -460,7 +591,10 @@ static int hw_breakpoint_handler(struct pt_regs *regs) > > > > if (bp->in_callback) { > > expecting_callback = true; > > - if (regs->epc != bp->next_addr) { > > + if (have_icount) { > > + if (icount_triggered(event) != 1) > > + continue; > > + } else if (regs->epc != bp->next_addr) { > > continue; > > } > > > > @@ -477,7 +611,10 @@ static int hw_breakpoint_handler(struct pt_regs *regs) > > > > } > > > > - if (expecting_callback) { > > + if (expecting_callback && have_icount) { > > + pr_err("%s: in_callback was set, but icount was not triggered, epc (%lx).\n", > > + __func__, regs->epc); > > + } else if (expecting_callback) { > > pr_err("%s: in_callback was set, but epc (%lx) was not at next address(%lx).\n", > > __func__, regs->epc, bp->next_addr); > > } > > Is this just for debugging or do you want to commit it? I believe this was intentional, but perhaps it is not a useful print. - Charlie > > Regards > Himanshu > > -- > > 2.43.0 > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org 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 25D3ACA0EFF for ; Wed, 27 Aug 2025 08:05:05 +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: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:References: List-Owner; bh=3nzIddGeTsU0E4ysMquva622otlgWkh5hW1mdhuhBk0=; b=pW/co+6U/jvo0i Kserr1CyNu/Ef64grUt+vMfYjwERord3IWaOnb7aAi5gu6exBZu81d4ze7WMD8QP8k79WExvaF8dn Z72k++dM10nXSl3cicMpwfws5K1P1ZzGnmrrjQeL6IAqFIji4nVL/CCYQavB+Lqm4NZFLpAQUF0nr Wp2BXjSeWbx305iCFbWLxzEUj600A/wS65ghuwnAy+6RxhUJv/foprspnRLyL7mXCNAZukyA9t0eY IdcCpODlAu4NUJPOYInl/2oz1mhufVO1V6eceHT3Z1YadkKQMz1fahVH/Vd7yzHB13ilH6DiDL1D9 U7ec5MQDvv/Q85m1GmTg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1urB9N-0000000Ea7U-1mkh; Wed, 27 Aug 2025 08:04:57 +0000 Received: from mail-pg1-x52a.google.com ([2607:f8b0:4864:20::52a]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1urB9J-0000000Ea50-3cjg for linux-riscv@lists.infradead.org; Wed, 27 Aug 2025 08:04:55 +0000 Received: by mail-pg1-x52a.google.com with SMTP id 41be03b00d2f7-b4755f37c3eso5685700a12.3 for ; Wed, 27 Aug 2025 01:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc.com; s=google; t=1756281893; x=1756886693; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:message-id:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to; bh=zjK51+2A52fHet//FxjRNjwkcJGNCioQhxdhxLuT9Eg=; b=fRuAODKuisdtiw0oEW/BjCOIQMLNrEasXS12o1Y/DDqWzEbJb2iy9oIRb4b8Wv9OlY 9nEXVjos2enDZRPN0qhwxlU4RhBESUGA7NReBcNjllpSJLrczG2wqkOoos5AtwOAsvEZ W7GddqVDjYorkj3gvvULMFre5+ee+khxmjLWu/cp4s63gbfa60QeAodZoorDt0YJH0YS lBy1+CuVjNGW2w8UUU7A4YG1OzFDSksun1Jpoy2mkqVxmQCMga2+pUtPIOX+xTPKq4pi pCbZYUp/eBkcpqZpnPW8mi4IxRaiiGIsTRpYq31HMTCESid639FCZbfessVdazj/Y+Qm mgiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756281893; x=1756886693; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:message-id:subject:cc:to:from:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=zjK51+2A52fHet//FxjRNjwkcJGNCioQhxdhxLuT9Eg=; b=dIBdQCJ+LRC0g/0rKAoUU0ArXO9kMICR8HvucVwvNhPlKgjoUo82YuZrznbfgZpGH/ dUGTZjszw6q+1mn+6OPoCG7tnkom8E5YmiSVrZMMCV20I4engFl3cm7b2gdokAZdhPhQ Uk6Ve207+vyhBq4aYjD4JuGALGBPxWurdkx6HXk8I+jK4myMMp5c0WlJbZ9GfBJ6Qai6 4lDuw3cXtfPiqweHgKJ14/mjderyLdNEfmggkSYWNcg8pv/jmKBzBtQXWWOkOyQT3V5I WfwdNmIYzb1SmQVxfEzgwHl1oEJLe5SeQv3oPxl0HMnPuLxF3wXWJDOC9vI6Qew0XGRP dS9g== X-Gm-Message-State: AOJu0Yy966ggz65926cFbiuvi7hi3yB5x+GiAP8HV4Rsf6ARyn6+fbMH r3k7TTd2WxUYjLRWpPy+w7x4ruwTeaPt5MZyczcXPBuyQi1avxqqa1Y3ZqY0Z9D0DbM= X-Gm-Gg: ASbGncu2mQ3ORnXf6UT1q6iuhTCvWZNw23NTaajn8qSXa40GsMQObl0qnbv9j21cmqu XgbBJDv/icMA/W4tb0xXZkqwabv9DbdyRoIumlaY61dtseYEu0bq02BeI+ZpdFKjAgs48ho/CeE TDtLT3Cea3hCpPVVxym4C3N0JZLr7ISvmos3zGhgBK/YPljmjLXs/SwmkdtsJ0S9gi80ooMQLie S+30QS+mJurZvoht6kqzFBVj8TQdV4s2/Y+DfT02cgK8amdGM7xUSosmSB/QQ5Pv4H2W3TASNP2 h7wjPCkPcqTdsjtmmfroiY/9DuS6YUHHH7Uf+4IsqQONiiQUYTyXZxsEyJRZijrvBDMqIVdL0m5 fDeOvI0LGeyckmqxCeQ== X-Google-Smtp-Source: AGHT+IFmLVeBhKzJEqSUf1IlkeKSrgzItqcCx7zQbQCgDi+N7L9pd7Nncg0iDwIKNaLuKX3UWq7WIQ== X-Received: by 2002:a17:90b:4fd0:b0:325:c92:4a89 with SMTP id 98e67ed59e1d1-32515e3cad8mr20990981a91.5.1756281892340; Wed, 27 Aug 2025 01:04:52 -0700 (PDT) Received: from ghost ([2601:647:6700:64d0:c960:881a:73ea:37d7]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3276f6b7458sm1367809a91.12.2025.08.27.01.04.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Aug 2025 01:04:51 -0700 (PDT) Date: Wed, 27 Aug 2025 01:04:48 -0700 From: Charlie Jenkins To: Himanshu Chauhan , Jesse Taube Cc: linux-riscv@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Oleg Nesterov , Kees Cook , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Liang Kan , Shuah Khan , Samuel Holland , Conor Dooley , Deepak Gupta , Andrew Jones , Atish Patra , Anup Patel , Mayuresh Chitale , WangYuli , Huacai Chen , Arnd Bergmann , Andrew Morton , Luis Chamberlain , "Mike Rapoport (Microsoft)" , Nam Cao , Yunhui Cui , Joel Granados , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Sebastian Andrzej Siewior , Celeste Liu , Chunyan Zhang , Nylon Chen , Thomas Gleixner , Thomas =?iso-8859-1?Q?Wei=DFschuh?= , Vincenzo Frascino , Joey Gouly , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-perf-users@vger.kernel.org, linux-kselftest@vger.kernel.org, Joel Stanley Subject: Re: [PATCH 5/8] riscv: hw_breakpoint: Use icount for single stepping Message-ID: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250827_010454_084645_BEBF6609 X-CRM114-Status: GOOD ( 41.98 ) 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 T24gVHVlLCBBdWcgMjYsIDIwMjUgYXQgMTA6MDg6MDRBTSArMDUzMCwgSGltYW5zaHUgQ2hhdWhh biB3cm90ZToKPiBPbiBGcmksIEF1ZyAyMiwgMjAyNSBhdCAxMToxN+KAr1BNIEplc3NlIFRhdWJl IDxqZXNzZUByaXZvc2luYy5jb20+IHdyb3RlOgo+ID4KPiA+IFRoZSBTZHRyaWcgUklTQy1WIElT QSBleHRlbnNpb24gZG9lcyBub3QgaGF2ZSBhIHJlc3VtZSBmbGFnIGZvcgo+ID4gcmV0dXJuaW5n IHRvIGFuZCBleGVjdXRpbmcgdGhlIGluc3RydWN0aW9uIGF0IHRoZSBicmVha3BvaW50Lgo+ID4g VG8gYXZvaWQgc2tpcHBpbmcgdGhlIGluc3RydWN0aW9uIG9yIGxvb3BpbmcsIGl0IGlzIG5lY2Vz c2FyeSB0byByZW1vdmUKPiA+IHRoZSBoYXJkd2FyZSBicmVha3BvaW50IGFuZCBzaW5nbGUgc3Rl cC4gVXNlIHRoZSBpY291bnQgZmVhdHVyZSBvZgo+ID4gU2R0cmlnIHRvIGFjY29tcGxpc2ggdGhp cy4gVXNlIGljb3VudCBhcyBkZWZhdWx0IHdpdGggYW4gb3B0aW9uIHRvIGFsbG93Cj4gPiBzb2Z0 d2FyZS1iYXNlZCBzaW5nbGUgc3RlcHBpbmcgd2hlbiBoYXJkd2FyZSBvciBTQkkgZG9lcyBub3Qg aGF2ZQo+ID4gaWNvdW50IGZ1bmN0aW9uYWxpdHksIGFzIGl0IG1heSBjYXVzZSB1bndhbnRlZCBz aWRlIGVmZmVjdHMgd2hlbiByZWFkaW5nCj4gPiB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSBtZW1vcnku Cj4gCj4gQ2FuIHlvdSBwbGVhc2UgZWxhYm9yYXRlIG9uIHRoaXM/IEkgcmVtZW1iZXIgbm90aWNp bmcgdGhlIGFic2VuY2Ugb2YKPiB0aGUgcmVzdW1lIGZsYWcgd2hpY2ggd2FzIGNhdXNpbmcgbG9v cHMuCgpUaGFuayB5b3UgZm9yIHlvdXIgZmVlZGJhY2suIEplc3NlJ3MgaW50ZXJuc2hpcCBjYW1l IHRvIGFuIGVuZCBsYXN0CkZyaWRheSAoQXVndXN0IDIybmQpIHNvIEkgd2lsbCBiZSBwaWNraW5n IHVwIHRoZXNlIHBhdGNoZXMsIGJ1dCBJIGhhdmUKYWxzbyBhZGRlZCBoZXIgcGVyc29uYWwgZW1h aWwgb250byB0aGlzIHRocmVhZC4KCldoZW4gYSBicmVha3BvaW50IGlzIHRyaWdnZXJlZCBhbmQg dGhlIGtlcm5lbCBnYWlucyBjb250cm9sLCB0aGUgbGFzdAppbnN0cnVjdGlvbiB0byBleGVjdXRl IHdhcyB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBpbnN0cnVjdGlvbiB3aGVyZQp0aGUgYnJl YWtwb2ludCBpcyBpbnN0YWxsZWQuIElmIGV4ZWN1dGlvbiB3YXMgdG8gYmUgcmVzdW1lZCBhdCB0 aGlzCnN0YWdlLCB0aGUgc2FtZSBicmVha3BvaW50IHdvdWxkIGJlIHRyaWdnZXJlZCBhZ2Fpbi4g U28gc2luZ2xlIHN0ZXBwaW5nCnJlcXVpcmVzIGEgY2FyZWZ1bCBkYW5jZSBvZiBlbmFibGluZyBh bmQgZGlzYWJsaW5nIGJyZWFrcG9pbnRzLiBIb3dldmVyLAp3ZSBjYW4gYXZvaWQgdGhpcyBvdmVy aGVhZCBhbmQgY29kZSBjb21wbGV4aXR5IGNhbiBiZSByZWR1Y2VkIGJ5IHVzaW5nCnRoZSBpY291 bnQgdHJpZ2dlciB3aGljaCBhbGxvd3MgYSBkaXJlY3QgbWV0aG9kIGZvciBzaW5nbGUgc3RlcHBp bmcuCgo+IAo+ID4KPiA+IFNpZ25lZC1vZmYtYnk6IEplc3NlIFRhdWJlIDxqZXNzZUByaXZvc2lu Yy5jb20+Cj4gPiAtLS0KPiA+IE9wZW5TQkkgaW1wbGVtZW50YXRpb24gb2Ygc2JpX2RlYnVnX3Jl YWRfdHJpZ2dlcnMgZG9lcyBub3QgcmV0dXJuIHRoZQo+ID4gdXBkYXRlZCBDU1IgdmFsdWVzLiBU aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciB3b3JraW5nCj4gPiBzYmlfZGVidWdfcmVhZF90 cmlnZ2VycyBiZWZvcmUgdGhpcyB3b3Jrcy4KPiA+Cj4gPiBodHRwczovL2xpc3RzLnJpc2N2Lm9y Zy9nL3RlY2gtcHJzL21lc3NhZ2UvMTQ3Ngo+ID4KPiA+IFJGQyAtPiBWMToKPiA+ICAtIEFkZCBk YnRyX21vZGUgdG8gcnZfaW5pdF9pY291bnRfdHJpZ2dlcgo+ID4gIC0gQWRkIGljb3VudF90cmln Z2VyZWQgdG8gY2hlY2sgd2hpY2ggYnJlYWtwb2ludCB3YXMgdHJpZ2dlcmVkCj4gPiAgLSBGaXgg dHlwbzogcy9hZmZlY3RzL2VmZmVjdHMKPiA+ICAtIE1vdmUgSFdfQlJFQUtQT0lOVF9DT01QVVRF X1NURVAgdG8gUGxhdGZvcm0gdHlwZQo+ID4gVjEgLT4gVjI6Cj4gPiAgLSBSZW1vdmUgSFdfQlJF QUtQT0lOVF9DT01QVVRFX1NURVAga2NvbmZpZyBvcHRpb24KPiA+IC0tLQo+ID4gIGFyY2gvcmlz Y3Yva2VybmVsL2h3X2JyZWFrcG9pbnQuYyB8IDE3MyArKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0KPiA+ICAxIGZpbGUgY2hhbmdlZCwgMTU1IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9u cygtKQo+ID4KPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9od19icmVha3BvaW50 LmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9od19icmVha3BvaW50LmMKPiA+IGluZGV4IDNmOTZlNzQ0 YTcxMS4uZjEyMzA2MjQ3NDM2IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvaHdf YnJlYWtwb2ludC5jCj4gPiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9od19icmVha3BvaW50LmMK PiA+IEBAIC0yMCw2ICsyMCw3IEBACj4gPiAgI2RlZmluZSBEQlRSX1REQVRBMV9ETU9ERSAgICAg ICAgICAgICAgQklUX1VMKF9fcmlzY3ZfeGxlbiAtIDUpCj4gPgo+ID4gICNkZWZpbmUgREJUUl9U REFUQTFfVFlQRV9NQ09OVFJPTCAgICAgICgyVUwgPDwgREJUUl9UREFUQTFfVFlQRV9TSElGVCkK PiA+ICsjZGVmaW5lIERCVFJfVERBVEExX1RZUEVfSUNPVU5UICAgICAgICAgICAgICAgICgzVUwg PDwgREJUUl9UREFUQTFfVFlQRV9TSElGVCkKPiA+ICAjZGVmaW5lIERCVFJfVERBVEExX1RZUEVf TUNPTlRST0w2ICAgICAoNlVMIDw8IERCVFJfVERBVEExX1RZUEVfU0hJRlQpCj4gPgo+ID4gICNk ZWZpbmUgREJUUl9UREFUQTFfTUNPTlRST0w2X0xPQUQgICAgICAgICAgICAgQklUKDApCj4gPiBA QCAtNjIsNiArNjMsMTQgQEAKPiA+ICAgICAgICAgKEZJRUxEX1BSRVAoREJUUl9UREFUQTFfTUNP TlRST0xfU0laRUxPX0ZJRUxELCBsbykgfCBcCj4gPiAgICAgICAgICBGSUVMRF9QUkVQKERCVFJf VERBVEExX01DT05UUk9MX1NJWkVISV9GSUVMRCwgaGkpKQo+ID4KPiA+ICsjZGVmaW5lIERCVFJf VERBVEExX0lDT1VOVF9VICAgICAgICAgICAgICAgICAgIEJJVCg2KQo+ID4gKyNkZWZpbmUgREJU Ul9UREFUQTFfSUNPVU5UX1MgICAgICAgICAgICAgICAgICAgQklUKDcpCj4gPiArI2RlZmluZSBE QlRSX1REQVRBMV9JQ09VTlRfUEVORElORyAgICAgICAgICAgICBCSVQoOCkKPiA+ICsjZGVmaW5l IERCVFJfVERBVEExX0lDT1VOVF9NICAgICAgICAgICAgICAgICAgIEJJVCg5KQo+ID4gKyNkZWZp bmUgREJUUl9UREFUQTFfSUNPVU5UX0NPVU5UX0ZJRUxEICAgICAgICAgR0VOTUFTSygyMywgMTAp Cj4gPiArI2RlZmluZSBEQlRSX1REQVRBMV9JQ09VTlRfVlUgICAgICAgICAgICAgICAgICBCSVQo MjUpCj4gPiArI2RlZmluZSBEQlRSX1REQVRBMV9JQ09VTlRfVlMgICAgICAgICAgICAgICAgICBC SVQoMjYpCj4gPiArCj4gPiAgZW51bSBkYnRyX21vZGUgewo+ID4gICAgICAgICBEQlRSX01PREVf VSA9IDAsCj4gPiAgICAgICAgIERCVFJfTU9ERV9TLAo+ID4gQEAgLTc5LDYgKzg4LDcgQEAgc3Rh dGljIERFRklORV9QRVJfQ1BVKHVuaW9uIHNiaV9kYnRyX3NobWVtX2VudHJ5LCBzYmlfZGJ0cl9z aG1lbSk7Cj4gPgo+ID4gIC8qIG51bWJlciBvZiBkZWJ1ZyB0cmlnZ2VycyBvbiB0aGlzIGNwdSAu ICovCj4gPiAgc3RhdGljIGludCBkYnRyX3RvdGFsX251bSBfX3JvX2FmdGVyX2luaXQ7Cj4gPiAr c3RhdGljIGJvb2wgaGF2ZV9pY291bnQgX19yb19hZnRlcl9pbml0Owo+ID4gIHN0YXRpYyB1bnNp Z25lZCBsb25nIGRidHJfdHlwZSBfX3JvX2FmdGVyX2luaXQ7Cj4gPiAgc3RhdGljIHVuc2lnbmVk IGxvbmcgZGJ0cl9pbml0IF9fcm9fYWZ0ZXJfaW5pdDsKPiA+Cj4gPiBAQCAtMTI5LDYgKzEzOSw3 IEBAIHN0YXRpYyBpbnQgYXJjaF9zbXBfdGVhcmRvd25fc2JpX3NobWVtKHVuc2lnbmVkIGludCBj cHUpCj4gPiAgc3RhdGljIHZvaWQgaW5pdF9zYmlfZGJ0cih2b2lkKQo+ID4gIHsKPiA+ICAgICAg ICAgc3RydWN0IHNiaXJldCByZXQ7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgZGJ0cl9jb3Vu dCA9IDA7Cj4gPgo+ID4gICAgICAgICAvKgo+ID4gICAgICAgICAgKiBDYWxsZWQgYnkgaHdfYnJl YWtwb2ludF9zbG90cyBhbmQgYXJjaF9od19icmVha3BvaW50X2luaXQuCj4gPiBAQCAtMTQzLDYg KzE1NCwxOSBAQCBzdGF0aWMgdm9pZCBpbml0X3NiaV9kYnRyKHZvaWQpCj4gPiAgICAgICAgICAg ICAgICAgcmV0dXJuOwo+ID4gICAgICAgICB9Cj4gPgo+ID4gKyAgICAgICByZXQgPSBzYmlfZWNh bGwoU0JJX0VYVF9EQlRSLCBTQklfRVhUX0RCVFJfTlVNX1RSSUdHRVJTLAo+ID4gKyAgICAgICAg ICAgICAgIERCVFJfVERBVEExX1RZUEVfSUNPVU5ULCAwLCAwLCAwLCAwLCAwKTsKPiA+ICsgICAg ICAgaWYgKHJldC5lcnJvcikgewo+ID4gKyAgICAgICAgICAgICAgIHByX3dhcm4oIiVzOiBmYWls ZWQgdG8gZGV0ZWN0IGljb3VudCB0cmlnZ2Vycy4gZXJyb3I6ICVsZC5cbiIsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmV0LmVycm9yKTsKPiA+ICsgICAgICAgfSBlbHNl IGlmICghcmV0LnZhbHVlKSB7Cj4gPiArICAgICAgICAgICAgICAgcHJfd2FybigiJXM6IE5vIGlj b3VudCB0cmlnZ2VycyBhdmFpbGFibGUuICIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJG YWxsaW5nLWJhY2sgdG8gY29tcHV0aW5nIHNpbmdsZSBzdGVwIGFkZHJlc3MuXG4iLCBfX2Z1bmNf Xyk7Cj4gPiArICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgZGJ0cl9jb3VudCA9 IHJldC52YWx1ZTsKPiA+ICsgICAgICAgICAgICAgICBoYXZlX2ljb3VudCA9IHRydWU7Cj4gPiAr ICAgICAgIH0KPiA+ICsKPiA+ICAgICAgICAgcmV0ID0gc2JpX2VjYWxsKFNCSV9FWFRfREJUUiwg U0JJX0VYVF9EQlRSX05VTV9UUklHR0VSUywKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIERC VFJfVERBVEExX1RZUEVfTUNPTlRST0w2LCAwLCAwLCAwLCAwLCAwKTsKPiA+ICAgICAgICAgaWYg KHJldC5lcnJvcikgewo+ID4gQEAgLTE1MSw3ICsxNzUsNyBAQCBzdGF0aWMgdm9pZCBpbml0X3Ni aV9kYnRyKHZvaWQpCj4gPiAgICAgICAgIH0gZWxzZSBpZiAoIXJldC52YWx1ZSkgewo+ID4gICAg ICAgICAgICAgICAgIHByX3dhcm4oIiVzOiBObyBtY29udHJvbDYgdHJpZ2dlcnMgYXZhaWxhYmxl LlxuIiwgX19mdW5jX18pOwo+ID4gICAgICAgICB9IGVsc2Ugewo+ID4gLSAgICAgICAgICAgICAg IGRidHJfdG90YWxfbnVtID0gcmV0LnZhbHVlOwo+ID4gKyAgICAgICAgICAgICAgIGRidHJfdG90 YWxfbnVtID0gbWluX25vdF96ZXJvKCh1bnNpZ25lZCBsb25nKXJldC52YWx1ZSwgZGJ0cl9jb3Vu dCk7Cj4gPiAgICAgICAgICAgICAgICAgZGJ0cl90eXBlID0gREJUUl9UREFUQTFfVFlQRV9NQ09O VFJPTDY7Cj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4gICAgICAgICB9Cj4gPiBAQCAt MTY2LDcgKzE5MCw3IEBAIHN0YXRpYyB2b2lkIGluaXRfc2JpX2RidHIodm9pZCkKPiA+ICAgICAg ICAgICAgICAgICBwcl9lcnIoIiVzOiBObyBtY29udHJvbCB0cmlnZ2VycyBhdmFpbGFibGUuXG4i LCBfX2Z1bmNfXyk7Cj4gPiAgICAgICAgICAgICAgICAgZGJ0cl90b3RhbF9udW0gPSAwOwo+ID4g ICAgICAgICB9IGVsc2Ugewo+ID4gLSAgICAgICAgICAgICAgIGRidHJfdG90YWxfbnVtID0gcmV0 LnZhbHVlOwo+ID4gKyAgICAgICAgICAgICAgIGRidHJfdG90YWxfbnVtID0gbWluX25vdF96ZXJv KCh1bnNpZ25lZCBsb25nKXJldC52YWx1ZSwgZGJ0cl9jb3VudCk7Cj4gPiAgICAgICAgICAgICAg ICAgZGJ0cl90eXBlID0gREJUUl9UREFUQTFfVFlQRV9NQ09OVFJPTDsKPiA+ICAgICAgICAgfQo+ ID4gIH0KPiA+IEBAIC0zMjAsNiArMzQ0LDM2IEBAIHN0YXRpYyBpbnQgcnZfaW5pdF9tY29udHJv bDZfdHJpZ2dlcihjb25zdCBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAo+ID4gICAgICAg ICByZXR1cm4gMDsKPiA+ICB9Cj4gPgo+ID4gK3N0YXRpYyBpbnQgcnZfaW5pdF9pY291bnRfdHJp Z2dlcihzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50ICpodywgZW51bSBkYnRyX21vZGUgbW9kZSkK PiA+ICt7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgdGRhdGExID0gREJUUl9UREFUQTFfVFlQ RV9JQ09VTlQ7Cj4gPiArCj4gPiArICAgICAgIC8qIFN0ZXAgb25lIGluc3RydWN0aW9uICovCj4g PiArICAgICAgIHRkYXRhMSB8PSBGSUVMRF9QUkVQKERCVFJfVERBVEExX0lDT1VOVF9DT1VOVF9G SUVMRCwgMSk7Cj4gPiArCj4gPiArICAgICAgIHN3aXRjaCAobW9kZSkgewo+ID4gKyAgICAgICBj YXNlIERCVFJfTU9ERV9VOgo+ID4gKyAgICAgICAgICAgICAgIHRkYXRhMSB8PSBEQlRSX1REQVRB MV9JQ09VTlRfVTsKPiA+ICsgICAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgICAgY2FzZSBE QlRSX01PREVfUzoKPiA+ICsgICAgICAgICAgICAgICB0ZGF0YTEgfD0gREJUUl9UREFUQTFfSUNP VU5UX1M7Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICAgIGNhc2UgREJUUl9N T0RFX1ZTOgo+ID4gKyAgICAgICAgICAgICAgIHRkYXRhMSB8PSBEQlRSX1REQVRBMV9JQ09VTlRf VlM7Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICAgIGNhc2UgREJUUl9NT0RF X1ZVOgo+ID4gKyAgICAgICAgICAgICAgIHRkYXRhMSB8PSBEQlRSX1REQVRBMV9JQ09VTlRfVlU7 Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICAgIGRlZmF1bHQ6Cj4gPiArICAg ICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAg ICAgaHctPnRkYXRhMSA9IHRkYXRhMTsKPiA+ICsgICAgICAgaHctPnRkYXRhMiA9IDA7Cj4gPiAr Cj4gPiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICBpbnQgaHdfYnJlYWtwb2lu dF9hcmNoX3BhcnNlKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludCAqaHcpCj4g PiBAQCAtMzcyLDI0ICs0MjYsMjggQEAgc3RhdGljIGludCBzZXR1cF9zaW5nbGVzdGVwKHN0cnVj dCBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCj4gPiAgICAgICAgIC8q IFJlbW92ZSBicmVha3BvaW50IGV2ZW4gaWYgcmV0dXJuIGVycm9yIGFzIG5vdCB0byBsb29wICov Cj4gPiAgICAgICAgIGFyY2hfdW5pbnN0YWxsX2h3X2JyZWFrcG9pbnQoZXZlbnQpOwo+ID4KPiA+ IC0gICAgICAgcmV0ID0gZ2V0X2luc25fbm9mYXVsdChyZWdzLCByZWdzLT5lcGMsICZpbnNuKTsK PiA+IC0gICAgICAgaWYgKHJldCA8IDApCj4gPiAtICAgICAgICAgICAgICAgcmV0dXJuIHJldDsK PiA+ICsgICAgICAgaWYgKGhhdmVfaWNvdW50KSB7Cj4gPiArICAgICAgICAgICAgICAgcnZfaW5p dF9pY291bnRfdHJpZ2dlcihicCwgREJUUl9NT0RFX1UpOwo+ID4gKyAgICAgICB9IGVsc2Ugewo+ ID4gKyAgICAgICAgICAgICAgIHJldCA9IGdldF9pbnNuX25vZmF1bHQocmVncywgcmVncy0+ZXBj LCAmaW5zbik7Cj4gPiArICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4KPiA+IC0gICAgICAgbmV4dF9hZGRyID0gZ2V0 X3N0ZXBfYWRkcmVzcyhyZWdzLCBpbnNuKTsKPiA+ICsgICAgICAgICAgICAgICBuZXh0X2FkZHIg PSBnZXRfc3RlcF9hZGRyZXNzKHJlZ3MsIGluc24pOwo+ID4KPiA+IC0gICAgICAgcmV0ID0gZ2V0 X2luc25fbm9mYXVsdChyZWdzLCBuZXh0X2FkZHIsICZpbnNuKTsKPiA+IC0gICAgICAgaWYgKHJl dCA8IDApCj4gPiAtICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgICAgICAgICAg ICByZXQgPSBnZXRfaW5zbl9ub2ZhdWx0KHJlZ3MsIG5leHRfYWRkciwgJmluc24pOwo+ID4gKyAg ICAgICAgICAgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIHJldDsKPiA+Cj4gPiAtICAgICAgIGJwX2luc24uYnBfdHlwZSA9IEhXX0JSRUFLUE9JTlRf WDsKPiA+IC0gICAgICAgYnBfaW5zbi5icF9hZGRyID0gbmV4dF9hZGRyOwo+ID4gLSAgICAgICAv KiBHZXQgdGhlIHNpemUgb2YgdGhlIGludHJ1Y3Rpb24gKi8KPiA+IC0gICAgICAgYnBfaW5zbi5i cF9sZW4gPSBHRVRfSU5TTl9MRU5HVEgoaW5zbik7Cj4gPiArICAgICAgICAgICAgICAgYnBfaW5z bi5icF90eXBlID0gSFdfQlJFQUtQT0lOVF9YOwo+ID4gKyAgICAgICAgICAgICAgIGJwX2luc24u YnBfYWRkciA9IG5leHRfYWRkcjsKPiA+ICsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNpemUg b2YgdGhlIGludHJ1Y3Rpb24gKi8KPiA+ICsgICAgICAgICAgICAgICBicF9pbnNuLmJwX2xlbiA9 IEdFVF9JTlNOX0xFTkdUSChpbnNuKTsKPiA+Cj4gPiAtICAgICAgIHJldCA9IGh3X2JyZWFrcG9p bnRfYXJjaF9wYXJzZShOVUxMLCAmYnBfaW5zbiwgYnApOwo+ID4gLSAgICAgICBpZiAocmV0KQo+ ID4gLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAgICAgICAgICAgcmV0ID0g aHdfYnJlYWtwb2ludF9hcmNoX3BhcnNlKE5VTEwsICZicF9pbnNuLCBicCk7Cj4gPiArICAgICAg ICAgICAgICAgaWYgKHJldCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7 Cj4gPiArICAgICAgIH0KPiA+Cj4gPiAgICAgICAgIHJldCA9IGFyY2hfaW5zdGFsbF9od19icmVh a3BvaW50KGV2ZW50KTsKPiA+ICAgICAgICAgaWYgKHJldCkKPiA+IEBAIC00MDAsNiArNDU4LDc5 IEBAIHN0YXRpYyBpbnQgc2V0dXBfc2luZ2xlc3RlcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQs IHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gICAgICAgICByZXR1cm4gMDsKPiA+ICB9Cj4gPgo+ ID4gKy8qKgo+ID4gKyAqIGljb3VudF90cmlnZ2VyZWQgLSBDaGVjayBpZiBldmVudCdzIGljb3Vu dCB3YXMgdHJpZ2dlcmVkLgo+ID4gKyAqIEBldmVudDogUGVyZiBldmVudCB0byBjaGVjawo+ID4g KyAqCj4gPiArICogQ2hlY2sgdGhlIGdpdmVuIHBlcmYgZXZlbnQncyBpY291bnQgYnJlYWtwb2lu dCB3YXMgdHJpZ2dlcmVkLgo+ID4gKyAqCj4gPiArICogUmV0dXJuczogICAgMSBpZiBpY291bnQg d2FzIHRyaWdnZXJlZC4KPiA+ICsgKiAgICAgICAgICAgICAwIGlmIGljb3VudCB3YXMgbm90IHRy aWdnZXJlZC4KPiA+ICsgKiAgICAgICAgICAgICBuZWdhdGl2ZSBvbiBmYWlsdXJlLgo+ID4gKyAq Lwo+ID4gK3N0YXRpYyBpbnQgaWNvdW50X3RyaWdnZXJlZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZl bnQpCj4gPiArewo+ID4gKyAgICAgICB1bmlvbiBzYmlfZGJ0cl9zaG1lbV9lbnRyeSAqc2htZW0g PSB0aGlzX2NwdV9wdHIoJnNiaV9kYnRyX3NobWVtKTsKPiA+ICsgICAgICAgc3RydWN0IHNiaXJl dCByZXQ7Cj4gPiArICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICoqc2xvdDsKPiA+ICsgICAgICAg dW5zaWduZWQgbG9uZyB0ZGF0YTE7Cj4gPiArICAgICAgIGludCBpOwo+ID4gKwo+ID4gKyAgICAg ICBmb3IgKGkgPSAwOyBpIDwgZGJ0cl90b3RhbF9udW07IGkrKykgewo+ID4gKyAgICAgICAgICAg ICAgIHNsb3QgPSB0aGlzX2NwdV9wdHIoJnBjcHVfaHdfYnBfZXZlbnRzW2ldKTsKPiA+ICsKPiA+ ICsgICAgICAgICAgICAgICBpZiAoKnNsb3QgPT0gZXZlbnQpCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICBicmVhazsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICBpZiAoaSA9PSBk YnRyX3RvdGFsX251bSkgewo+ID4gKyAgICAgICAgICAgICAgIHByX3dhcm4oIiVzOiBCcmVha3Bv aW50IG5vdCBpbnN0YWxsZWQuXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgICAgcmV0 dXJuIC1FTk9FTlQ7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgcmF3X3NwaW5fbG9j a19pcnFzYXZlKHRoaXNfY3B1X3B0cigmZWNhbGxfbG9jayksCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAqdGhpc19jcHVfcHRyKCZlY2FsbF9sb2NrX2ZsYWdzKSk7Cj4gPiArCj4g PiArICAgICAgIHJldCA9IHNiaV9lY2FsbChTQklfRVhUX0RCVFIsIFNCSV9FWFRfREJUUl9UUklH X1JFQUQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpLCAxLCAwLCAwLCAwLCAwKTsKPiA+ ICsgICAgICAgdGRhdGExID0gc2htZW0tPmRhdGEudGRhdGExOwo+ID4gKwo+ID4gKyAgICAgICBy YXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0aGlzX2NwdV9wdHIoJmVjYWxsX2xvY2spLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpc19jcHVfcHRyKCZlY2FsbF9s b2NrX2ZsYWdzKSk7Cj4gPiArICAgICAgIGlmIChyZXQuZXJyb3IpIHsKPiA+ICsgICAgICAgICAg ICAgICBwcl93YXJuKCIlczogZmFpbGVkIHRvIHJlYWQgdHJpZ2dlci4gZXJyb3I6ICVsZFxuIiwg X19mdW5jX18sIHJldC5lcnJvcik7Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIHNiaV9lcnJf bWFwX2xpbnV4X2Vycm5vKHJldC5lcnJvcik7Cj4gCj4gVG8gYXZvaWQgYSBmbHVycnkgb2YgZXZl bnRzIG9yIG1lc3NhZ2VzLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBnb29kIHRvCj4gZGlzYWJsZSB0 aGUgdHJpZ2dlci4KClRoYXQgaXMgYSBnb29kIHBvaW50LgoKPiAKPiA+ICsgICAgICAgfQo+ID4g Kwo+ID4gKyAgICAgICAvKgo+ID4gKyAgICAgICAgKiBUaGUgUklTQy1WIERlYnVnIFNwZWNpZmlj YXRpb24KPiA+ICsgICAgICAgICogVGltIE5ld3NvbWUsIFBhdWwgRG9uYWh1ZSAoVmVudGFuYSBN aWNybyBTeXN0ZW1zKQo+ID4gKyAgICAgICAgKiBWZXJzaW9uIDEuMCwgUmV2aXNlZCAyMDI1LTAy LTIxOiBSYXRpZmllZAo+IEkgdGhpbmsgbWVudGlvbmluZyB0aGUgdmVyc2lvbiBudW1iZXIgYW5k IHNlY3Rpb24gd291bGQgYmUgZW5vdWdoLgoKQWdyZWVkLgoKPiAKPiA+ICsgICAgICAgICogNS43 LjEzLiBJbnN0cnVjdGlvbiBDb3VudCAoaWNvdW50LCBhdCAweDdhMSkKPiA+ICsgICAgICAgICog V2hlbiBjb3VudCBpcyAxIGFuZCB0aGUgdHJpZ2dlciBtYXRjaGVzLCB0aGVuIHBlbmRpbmcgYmVj b21lcyBzZXQuCj4gPiArICAgICAgICAqIEluIGFkZGl0aW9uIGNvdW50IHdpbGwgYmVjb21lIDAg dW5sZXNzIGl0IGlzIGhhcmQtd2lyZWQgdG8gMS4KPiA+ICsgICAgICAgICogV2hlbiBwZW5kaW5n IGlzIHNldCwgdGhlIHRyaWdnZXIgZmlyZXMganVzdCBiZWZvcmUgYW55IGZ1cnRoZXIKPiA+ICsg ICAgICAgICogaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCBpbiBhIG1vZGUgd2hlcmUgdGhlIHRy aWdnZXIgaXMgZW5hYmxlZC4KPiA+ICsgICAgICAgICogQXMgdGhlIHRyaWdnZXIgZmlyZXMsIHBl bmRpbmcgaXMgY2xlYXJlZC4gSW4gYWRkaXRpb24sIGlmIGNvdW50IGlzCj4gPiArICAgICAgICAq IGhhcmQtd2lyZWQgdG8gMSB0aGVuIG0sIHMsIHUsIHZzLCBhbmQgdnUgYXJlIGFsbCBjbGVhcmVk Lgo+ID4gKyAgICAgICAgKi8KPiA+ICsgICAgICAgaWYgKEZJRUxEX0dFVChEQlRSX1REQVRBMV9J Q09VTlRfQ09VTlRfRklFTEQsIHRkYXRhMSkgPT0gMCkKPiA+ICsgICAgICAgICAgICAgICByZXR1 cm4gMTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKEZJRUxEX0dFVChEQlRSX1REQVRBMV9JQ09VTlRf Q09VTlRfRklFTEQsIHRkYXRhMSkgIT0gMSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gMDsK PiA+ICsKPiA+ICsgICAgICAgaWYgKHRkYXRhMSAmIERCVFJfVERBVEExX0lDT1VOVF9VKQo+ID4g KyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gKyAgICAgICBpZiAodGRhdGExICYgREJUUl9U REFUQTFfSUNPVU5UX1MpCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gPiArICAgICAg IGlmICh0ZGF0YTEgJiBEQlRSX1REQVRBMV9JQ09VTlRfVlUpCj4gPiArICAgICAgICAgICAgICAg cmV0dXJuIDA7Cj4gPiArICAgICAgIGlmICh0ZGF0YTEgJiBEQlRSX1REQVRBMV9JQ09VTlRfVlUp Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gPiArICAgICAgIHJldHVybiAxOwo+ID4g K30KPiA+ICsKPiA+ICAvKgo+ID4gICAqIEhXIEJyZWFrcG9pbnQvd2F0Y2hwb2ludCBoYW5kbGVy Cj4gPiAgICovCj4gPiBAQCAtNDYwLDcgKzU5MSwxMCBAQCBzdGF0aWMgaW50IGh3X2JyZWFrcG9p bnRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+Cj4gPiAgICAgICAgICAgICAgICAg aWYgKGJwLT5pbl9jYWxsYmFjaykgewo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0 aW5nX2NhbGxiYWNrID0gdHJ1ZTsKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdz LT5lcGMgIT0gYnAtPm5leHRfYWRkcikgewo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYg KGhhdmVfaWNvdW50KSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp Y291bnRfdHJpZ2dlcmVkKGV2ZW50KSAhPSAxKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgfSBl bHNlIGlmIChyZWdzLT5lcGMgIT0gYnAtPm5leHRfYWRkcikgewo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIH0K PiA+Cj4gPiBAQCAtNDc3LDcgKzYxMSwxMCBAQCBzdGF0aWMgaW50IGh3X2JyZWFrcG9pbnRfaGFu ZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+Cj4gPiAgICAgICAgIH0KPiA+Cj4gPiAtICAg ICAgIGlmIChleHBlY3RpbmdfY2FsbGJhY2spIHsKPiA+ICsgICAgICAgaWYgKGV4cGVjdGluZ19j YWxsYmFjayAmJiBoYXZlX2ljb3VudCkgewo+ID4gKyAgICAgICAgICAgICAgIHByX2VycigiJXM6 IGluX2NhbGxiYWNrIHdhcyBzZXQsIGJ1dCBpY291bnQgd2FzIG5vdCB0cmlnZ2VyZWQsIGVwYyAo JWx4KS5cbiIsCj4gPiArICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWdzLT5lcGMp Owo+ID4gKyAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGluZ19jYWxsYmFjaykgewo+ID4gICAgICAg ICAgICAgICAgIHByX2VycigiJXM6IGluX2NhbGxiYWNrIHdhcyBzZXQsIGJ1dCBlcGMgKCVseCkg d2FzIG5vdCBhdCBuZXh0IGFkZHJlc3MoJWx4KS5cbiIsCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgIF9fZnVuY19fLCByZWdzLT5lcGMsIGJwLT5uZXh0X2FkZHIpOwo+ID4gICAgICAgICB9Cj4g Cj4gSXMgdGhpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgb3IgZG8geW91IHdhbnQgdG8gY29tbWl0IGl0 PwoKSSBiZWxpZXZlIHRoaXMgd2FzIGludGVudGlvbmFsLCBidXQgcGVyaGFwcyBpdCBpcyBub3Qg YSB1c2VmdWwgcHJpbnQuCgotIENoYXJsaWUKCj4gCj4gUmVnYXJkcwo+IEhpbWFuc2h1Cj4gPiAt LQo+ID4gMi40My4wCj4gPgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1yaXNjdgo=