From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (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 924874691; Mon, 25 Mar 2024 17:15:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711386957; cv=none; b=Ysj5cHrtqCQL6kgD4wjyOTvtPewq1Ly9mVoOwIu0LWw21K9ra0vuvgcL37nKfExzuhjXeRMz3rYK+iQ7Tjg9nUgdHn1afr81Kn/wBfqHxFw8/OIXYGqVdLNJC5xSYndpFuJxKliWM/+Xl8Pz7tI+7077yw+1fhsfelvs7czp6uI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711386957; c=relaxed/simple; bh=j8p3im1FoDBv1nShbdEtREoAUJDqe3kxTZ7MnLlwcnA=; h=From:To:Subject:In-Reply-To:References:Date:Message-ID: MIME-Version:Content-Type; b=IsV6WDe4LrVsSmu9cdOCIZ8rXokVx4qpf3n8rGIemyCGFLqrrTCqXpcqnE6cazMF4kJHNk/gQulTiXwQ6YJZP8lXK2UCyBpvzZ9w5r8LhegCjIfSxCZ9RqQNDcL/dkXBfmu0vzd4iE2G/E8diuj0wAWPxjtONXecK5AxQiG2xmA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bjo0NWyx; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bjo0NWyx" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-341b01dbebbso3323228f8f.0; Mon, 25 Mar 2024 10:15:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711386954; x=1711991754; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=3JcP9Ixxq7VYfRSOZNRDlURNxIkwxj5RGFVViXNJk14=; b=bjo0NWyxH7q85db171Isa93Z+W5dY1tz4V/cYiYSzTGAA3NYU2Fa1/+cXTu9uv93g1 +idwvP9IYCWqJBZPNSBcBTsZzzm+TrTMeseFhtgfiBv/BD7SBxmRR0aKzOQnaO68nD0G LHj92c8unzYh1o5HREl8IEB8ToYEpwzL1gmRWarV3XYAtSWI+iAx1+v3r6clnH9Ppmcx zkvL49m41/dYnQuIjbh0JY9YcutI3O/3ePxOZWDNAC9OBt1IhJDMVnfLPnkXIjfNrRRk 3kD5b1OhbiJgD51Bn832LDtEczgseXbz+pkIIiq7lOS/cw0vZwVcPIOHZQv9FZgnp2jv NULA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711386954; x=1711991754; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:to:from:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=3JcP9Ixxq7VYfRSOZNRDlURNxIkwxj5RGFVViXNJk14=; b=HSoIzDT7x4pXNfpxXhBOp3EyZP9bFzSP/LsGGXp+yxVoAbzW52GNN+lnVKoOuR0kyL kQM42SEVDkb/2PH5ipx26DJWg0QSraPhyVbSIjOG+B/Kji8RUREAaIGgvsB9Q4zQQ9vA MRArvuLoo/2iqgpXS5XVMPM+ViqKw09XehrdbeyvzT5rwu42Wxt1naACfbYXtoCYmJ9i ql6m8bwxMIomAxmBHoFML+VGIX2mRap7OUBjGBlcEzkiROv+I1FssQWYD4Q4Md1wU9ql LgUyO5hryw2zpcYFCYZgE1UqLcB3T4CC5ORtgAk6WtVSkjReVdAWj1Szki0tjMhdEW1W I07w== X-Forwarded-Encrypted: i=1; AJvYcCVLWvTwHRaZKgFPBixliisSuz2bRprHJB1kd7LObVA4yewAfy1zg67fz39V8FKcSmHyQZlIN7dJul7fWZnY4ZNIix8bf1KS1CelEQbvsKUzY7D5s6kZ+zJF6kH3N+p0yq9u X-Gm-Message-State: AOJu0YweyDK+bl/0pKBhSUudTXyw9koD8gQoF14hTNhRbue5qt0Cvb2U 06/n5+1p6IzoVXiNvKqW9twCPidEmEEirg1uQZwnJWm/loO1imh3 X-Google-Smtp-Source: AGHT+IE42lV8EQMw1EFXIiTWcsfY5Tdd8VoYbW7AxgP48DLUyoyJH4apdN/DLdWNdOb2U1bUlQzVqw== X-Received: by 2002:a5d:4fc2:0:b0:33f:84a1:7eb8 with SMTP id h2-20020a5d4fc2000000b0033f84a17eb8mr6124207wrw.1.1711386953673; Mon, 25 Mar 2024 10:15:53 -0700 (PDT) Received: from localhost (54-240-197-231.amazon.com. [54.240.197.231]) by smtp.gmail.com with ESMTPSA id x3-20020adfcc03000000b0033e41e1ad93sm9908955wrh.57.2024.03.25.10.15.53 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Mar 2024 10:15:53 -0700 (PDT) From: Puranjay Mohan To: =?utf-8?B?QmrDtnJuIFTDtnBlbA==?= , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , "Eduard Zingerman" , Song Liu , Yonghong Song , John Fastabend , "KP Singh" , Stanislav Fomichev , Hao Luo , Jiri Olsa , Luke Nelson , Xi Wang , Paul Walmsley , Palmer Dabbelt , Albert Ou , bpf@vger.kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Pu Lehui Subject: Re: [PATCH bpf-next v2 1/2] bpf,riscv: Implement PROBE_MEM32 pseudo instructions In-Reply-To: <875xxafe33.fsf@all.your.base.are.belong.to.us> References: <20240325155434.65589-1-puranjay12@gmail.com> <20240325155434.65589-2-puranjay12@gmail.com> <875xxafe33.fsf@all.your.base.are.belong.to.us> Date: Mon, 25 Mar 2024 17:15:51 +0000 Message-ID: Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Bj=C3=B6rn T=C3=B6pel writes: > Puranjay Mohan writes: > >> Add support for [LDX | STX | ST], PROBE_MEM32, [B | H | W | DW] >> instructions. They are similar to PROBE_MEM instructions with the >> following differences: >> - PROBE_MEM32 supports store. >> - PROBE_MEM32 relies on the verifier to clear upper 32-bit of the >> src/dst register >> - PROBE_MEM32 adds 64-bit kern_vm_start address (which is stored in S7 >> in the prologue). Due to bpf_arena constructions such S7 + reg + >> off16 access is guaranteed to be within arena virtual range, so no >> address check at run-time. >> - S7 is a free callee-saved register, so it is used to store kern_vm_sta= rt >> - PROBE_MEM32 allows STX and ST. If they fault the store is a nop. When >> LDX faults the destination register is zeroed. >> >> To support these on riscv, we do tmp =3D S7 + src/dst reg and then use >> tmp2 as the new src/dst register. This allows us to reuse most of the >> code for normal [LDX | STX | ST]. > > Cool to see the RV BPF JIT keeping up with x86 features! ;-) Nice work! It is my self proclaimed duty to make sure that all 64-bit JITs have feature parity. :D > > A couple of minor comments below. > >> Signed-off-by: Puranjay Mohan >> --- >> arch/riscv/net/bpf_jit.h | 1 + >> arch/riscv/net/bpf_jit_comp64.c | 193 +++++++++++++++++++++++++++++++- >> arch/riscv/net/bpf_jit_core.c | 1 + >> 3 files changed, 192 insertions(+), 3 deletions(-) >> >> diff --git a/arch/riscv/net/bpf_jit.h b/arch/riscv/net/bpf_jit.h >> index f4b6b3b9edda..8a47da08dd9c 100644 >> --- a/arch/riscv/net/bpf_jit.h >> +++ b/arch/riscv/net/bpf_jit.h >> @@ -81,6 +81,7 @@ struct rv_jit_context { >> int nexentries; >> unsigned long flags; >> int stack_size; >> + u64 arena_vm_start; >> }; >>=20=20 >> /* Convert from ninsns to bytes. */ >> diff --git a/arch/riscv/net/bpf_jit_comp64.c b/arch/riscv/net/bpf_jit_co= mp64.c >> index 1adf2f39ce59..0c0588e327af 100644 >> --- a/arch/riscv/net/bpf_jit_comp64.c >> +++ b/arch/riscv/net/bpf_jit_comp64.c >> @@ -255,6 +255,10 @@ static void __build_epilogue(bool is_tail_call, str= uct rv_jit_context *ctx) >> emit_ld(RV_REG_S6, store_offset, RV_REG_SP, ctx); >> store_offset -=3D 8; >> } >> + if (ctx->arena_vm_start) { >> + emit_ld(RV_REG_S7, store_offset, RV_REG_SP, ctx); >> + store_offset -=3D 8; >> + } >>=20=20 >> emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx); >> /* Set return value. */ >> @@ -548,6 +552,7 @@ static void emit_atomic(u8 rd, u8 rs, s16 off, s32 i= mm, bool is64, >>=20=20 >> #define BPF_FIXUP_OFFSET_MASK GENMASK(26, 0) >> #define BPF_FIXUP_REG_MASK GENMASK(31, 27) >> +#define DONT_CLEAR 17 /* RV_REG_A7 unused in pt_regmap */ > > Hmm, so this is just a a sentinel node, right? Isn't it more robust to > use, say REG_ZERO which will never be used? Maybe REG_DONT_CLEAR_MARKER > or smth, so it's obvious how it's used? Yes, I agree, RV_REG_ZERO would be the best thing to use here. > > >> bool ex_handler_bpf(const struct exception_table_entry *ex, >> struct pt_regs *regs) >> @@ -555,7 +560,8 @@ bool ex_handler_bpf(const struct exception_table_ent= ry *ex, >> off_t offset =3D FIELD_GET(BPF_FIXUP_OFFSET_MASK, ex->fixup); >> int regs_offset =3D FIELD_GET(BPF_FIXUP_REG_MASK, ex->fixup); >>=20=20 >> - *(unsigned long *)((void *)regs + pt_regmap[regs_offset]) =3D 0; >> + if (regs_offset !=3D DONT_CLEAR) >> + *(unsigned long *)((void *)regs + pt_regmap[regs_offset]) =3D 0; >> regs->epc =3D (unsigned long)&ex->fixup - offset; >>=20=20 >> return true; >> @@ -572,7 +578,8 @@ static int add_exception_handler(const struct bpf_in= sn *insn, >> off_t fixup_offset; >>=20=20 >> if (!ctx->insns || !ctx->ro_insns || !ctx->prog->aux->extable || >> - (BPF_MODE(insn->code) !=3D BPF_PROBE_MEM && BPF_MODE(insn->code) != =3D BPF_PROBE_MEMSX)) >> + (BPF_MODE(insn->code) !=3D BPF_PROBE_MEM && BPF_MODE(insn->code) != =3D BPF_PROBE_MEMSX && >> + BPF_MODE(insn->code) !=3D BPF_PROBE_MEM32)) >> return 0; >>=20=20 >> if (WARN_ON_ONCE(ctx->nexentries >=3D ctx->prog->aux->num_exentries)) >> @@ -622,6 +629,9 @@ static int add_exception_handler(const struct bpf_in= sn *insn, >>=20=20 >> ex->insn =3D ins_offset; >>=20=20 >> + if (BPF_CLASS(insn->code) !=3D BPF_LDX) >> + dst_reg =3D DONT_CLEAR; >> + > > Instead of having a side-effect, and passing a dummy dst_reg for the > probe_mem32, just explicitly add DONT_CLEAR when calling > add_exception_handler(). It's more obvious to me at least. Sure, will do that in the next version. > >> ex->fixup =3D FIELD_PREP(BPF_FIXUP_OFFSET_MASK, fixup_offset) | >> FIELD_PREP(BPF_FIXUP_REG_MASK, dst_reg); >> ex->type =3D EX_TYPE_BPF; >> @@ -1063,7 +1073,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn,= struct rv_jit_context *ctx, >> BPF_CLASS(insn->code) =3D=3D BPF_JMP; >> int s, e, rvoff, ret, i =3D insn - ctx->prog->insnsi; >> struct bpf_prog_aux *aux =3D ctx->prog->aux; >> - u8 rd =3D -1, rs =3D -1, code =3D insn->code; >> + u8 rd =3D -1, rs =3D -1, code =3D insn->code, reg_arena_vm_start =3D R= V_REG_S7; >> s16 off =3D insn->off; >> s32 imm =3D insn->imm; >>=20=20 >> @@ -1539,6 +1549,11 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn= , struct rv_jit_context *ctx, >> case BPF_LDX | BPF_PROBE_MEMSX | BPF_B: >> case BPF_LDX | BPF_PROBE_MEMSX | BPF_H: >> case BPF_LDX | BPF_PROBE_MEMSX | BPF_W: >> + /* LDX | PROBE_MEM32: dst =3D *(unsigned size *)(src + S7 + off)*/ >> + case BPF_LDX | BPF_PROBE_MEM32 | BPF_B: >> + case BPF_LDX | BPF_PROBE_MEM32 | BPF_H: >> + case BPF_LDX | BPF_PROBE_MEM32 | BPF_W: >> + case BPF_LDX | BPF_PROBE_MEM32 | BPF_DW: >> { >> int insn_len, insns_start; >> bool sign_ext; >> @@ -1546,6 +1561,11 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn= , struct rv_jit_context *ctx, >> sign_ext =3D BPF_MODE(insn->code) =3D=3D BPF_MEMSX || >> BPF_MODE(insn->code) =3D=3D BPF_PROBE_MEMSX; >>=20=20 >> + if (BPF_MODE(insn->code) =3D=3D BPF_PROBE_MEM32) { >> + emit_add(RV_REG_T2, rs, reg_arena_vm_start, ctx); >> + rs =3D RV_REG_T2; >> + } >> + >> switch (BPF_SIZE(code)) { >> case BPF_B: >> if (is_12b_int(off)) { >> @@ -1682,6 +1702,87 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn= , struct rv_jit_context *ctx, >> emit_sd(RV_REG_T2, 0, RV_REG_T1, ctx); >> break; >>=20=20 >> + case BPF_ST | BPF_PROBE_MEM32 | BPF_B: >> + case BPF_ST | BPF_PROBE_MEM32 | BPF_H: >> + case BPF_ST | BPF_PROBE_MEM32 | BPF_W: >> + case BPF_ST | BPF_PROBE_MEM32 | BPF_DW: >> + { >> + int insn_len, insns_start; >> + >> + emit_add(RV_REG_T3, rd, reg_arena_vm_start, ctx); >> + rd =3D RV_REG_T3; >> + >> + /* Load imm to a register then store it */ >> + emit_imm(RV_REG_T1, imm, ctx); >> + >> + switch (BPF_SIZE(code)) { >> + case BPF_B: >> + if (is_12b_int(off)) { >> + insns_start =3D ctx->ninsns; >> + emit(rv_sb(rd, off, RV_REG_T1), ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + } >> + >> + emit_imm(RV_REG_T2, off, ctx); >> + emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); >> + insns_start =3D ctx->ninsns; >> + emit(rv_sb(RV_REG_T2, 0, RV_REG_T1), ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + >> + break; >> + >> + case BPF_H: >> + if (is_12b_int(off)) { >> + insns_start =3D ctx->ninsns; >> + emit(rv_sh(rd, off, RV_REG_T1), ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + } >> + >> + emit_imm(RV_REG_T2, off, ctx); >> + emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); >> + insns_start =3D ctx->ninsns; >> + emit(rv_sh(RV_REG_T2, 0, RV_REG_T1), ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + case BPF_W: >> + if (is_12b_int(off)) { >> + insns_start =3D ctx->ninsns; >> + emit_sw(rd, off, RV_REG_T1, ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + } >> + >> + emit_imm(RV_REG_T2, off, ctx); >> + emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); >> + insns_start =3D ctx->ninsns; >> + emit_sw(RV_REG_T2, 0, RV_REG_T1, ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + case BPF_DW: >> + if (is_12b_int(off)) { >> + insns_start =3D ctx->ninsns; >> + emit_sd(rd, off, RV_REG_T1, ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + } >> + >> + emit_imm(RV_REG_T2, off, ctx); >> + emit_add(RV_REG_T2, RV_REG_T2, rd, ctx); >> + insns_start =3D ctx->ninsns; >> + emit_sd(RV_REG_T2, 0, RV_REG_T1, ctx); >> + insn_len =3D ctx->ninsns - insns_start; >> + break; >> + } > > A lot of similar code, with emit of different sizes. Possible to move > move out to a function, and wrap the emits? The main loop is hard read > already! I thought about this as well. My plan is to refactor the whole thing in a seperate patch. I did not do it with this feature as it will cause a lot of unrelated code churn. Thanks, Puranjay 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 CCEB6C54E64 for ; Mon, 25 Mar 2024 17:16: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:MIME-Version:Message-ID:Date:References :In-Reply-To:Subject:To:From:Reply-To:Cc:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JUf+YyXjRvSBz1o0Z7i1KoccadmV/lR5LvR39+OqEP0=; b=z15cI5z1d5pFnW 3HXSdcVbN+MvERN2nn0HYcmjAZThmaoozfSf37t4expS3pwPFcmSE/s+i4rc2Yu55DhdzszgaYliN UtUHn/QOIF75hP0PyeAxF/SeA9PTTxM3OCHZqpXInXmc4ENmkwwVyqsXN5HtDzB0HC5ZvfUaBfl6u 7RL88nDZUVvFsOodYlC98kscT/1xf/Ea1MZXiFJ9fvxp2CVPKI775rjyUhe60LX+JXY/9AKY5XwjA akPsxNvZq12VhqkOFPa1wGB5ExZnUUVjImniGHlxwFxdMlmUqKx3qXApyVfzzbPbbi2CHiv8El31c nnuh8ob6m/WksTPHjD2g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1ronvV-00000000zgk-19vi; Mon, 25 Mar 2024 17:16:01 +0000 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1ronvQ-00000000zeI-36vY for linux-riscv@lists.infradead.org; Mon, 25 Mar 2024 17:16:00 +0000 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-4148ccac377so1244645e9.2 for ; Mon, 25 Mar 2024 10:15:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711386954; x=1711991754; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=3JcP9Ixxq7VYfRSOZNRDlURNxIkwxj5RGFVViXNJk14=; b=AJWp5f3LeOD8k10/bCO+d6kTQ/L4mkdFPtCwMf3TU6VWOrv7Zec4oR0/oD3O31nqhg ITV72ccMJtZCz5lHmsUWMvzCwDGBly/47gpBzR96xEuP6wX+/MAwtNsnehBNIaPaud0e W27Sryyso7SZku9y8nRHYvwO7HrCn3H7MUO4ocZMrLrd4cNUQi/EP/F0EekwVL40N/KN OTxjLx5lQe4rgbdKNLc1pQ6P6OIDzx1ps5X+jPhvb99J7fEbhpTxMEN+qQK4BZE410nx VpbJY0s9YD1/mAWtT8tP3OVSrprvKmFf7e3Ub3WRTaWXVxp9MmVlN28E4LRF72hobYqE VYfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711386954; x=1711991754; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:to:from:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=3JcP9Ixxq7VYfRSOZNRDlURNxIkwxj5RGFVViXNJk14=; b=aU2klKe78G7dZMx7FM9m4jNX/3uT9LY8W8BXDpxl1mkCcNl0y4hAeQ9ydDkgPQeK8I vcDN+47H9/aoRAH/L9G0YRsYa4YpAow5Cn8OZNRUmDKym9JgCTG8tkLaty+RxAvx5XQG xgCBr+QhB49+AoPNYS4oqvsRpLjRFRnJD2cVvkORTwC5P7b3oTO1mmuA/uHDWfXW2aw6 nMw2xf0w4RjWljWV9bSwIhBSwn6qsGw3Z/qjBnSBjRDJ9u2SHN9zSkEMjHbhHV4CcXPF IckWSNrjKtQNp8GG7k8NoqlGWMEHD8YTRkSNxppl4uUiEamZblJ9N3ybFmLL4K1xKPD8 Nszg== X-Forwarded-Encrypted: i=1; AJvYcCVVEQDxqqWpRtS6rOlS4cKC/tWdpI9LQUr1MMsPt0yKelgseRdCk1ebIqaWuHqMwampKDzBSsnQdpQHFD+uooakInz98PMa5kMutp7b+cAt X-Gm-Message-State: AOJu0Yy5dAdTkBaj/97gj+7PaBL0OG1lfrAg3ky0HvCmgxSOZi6vgRtj ZZYgo72gV+5MsFTHJQGr9SP08WSio1MSY5B2zcZdrbgmtWGd/fYj X-Google-Smtp-Source: AGHT+IE42lV8EQMw1EFXIiTWcsfY5Tdd8VoYbW7AxgP48DLUyoyJH4apdN/DLdWNdOb2U1bUlQzVqw== X-Received: by 2002:a5d:4fc2:0:b0:33f:84a1:7eb8 with SMTP id h2-20020a5d4fc2000000b0033f84a17eb8mr6124207wrw.1.1711386953673; Mon, 25 Mar 2024 10:15:53 -0700 (PDT) Received: from localhost (54-240-197-231.amazon.com. [54.240.197.231]) by smtp.gmail.com with ESMTPSA id x3-20020adfcc03000000b0033e41e1ad93sm9908955wrh.57.2024.03.25.10.15.53 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Mar 2024 10:15:53 -0700 (PDT) From: Puranjay Mohan To: =?utf-8?B?QmrDtnJuIFTDtnBlbA==?= , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , "Eduard Zingerman" , Song Liu , Yonghong Song , John Fastabend , "KP Singh" , Stanislav Fomichev , Hao Luo , Jiri Olsa , Luke Nelson , Xi Wang , Paul Walmsley , Palmer Dabbelt , Albert Ou , bpf@vger.kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Pu Lehui Subject: Re: [PATCH bpf-next v2 1/2] bpf,riscv: Implement PROBE_MEM32 pseudo instructions In-Reply-To: <875xxafe33.fsf@all.your.base.are.belong.to.us> References: <20240325155434.65589-1-puranjay12@gmail.com> <20240325155434.65589-2-puranjay12@gmail.com> <875xxafe33.fsf@all.your.base.are.belong.to.us> Date: Mon, 25 Mar 2024 17:15:51 +0000 Message-ID: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240325_101558_641445_2D186A89 X-CRM114-Status: GOOD ( 27.52 ) 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 QmrDtnJuIFTDtnBlbCA8Ympvcm5Aa2VybmVsLm9yZz4gd3JpdGVzOgoKPiBQdXJhbmpheSBNb2hh biA8cHVyYW5qYXkxMkBnbWFpbC5jb20+IHdyaXRlczoKPgo+PiBBZGQgc3VwcG9ydCBmb3IgW0xE WCB8IFNUWCB8IFNUXSwgUFJPQkVfTUVNMzIsIFtCIHwgSCB8IFcgfCBEV10KPj4gaW5zdHJ1Y3Rp b25zLiAgVGhleSBhcmUgc2ltaWxhciB0byBQUk9CRV9NRU0gaW5zdHJ1Y3Rpb25zIHdpdGggdGhl Cj4+IGZvbGxvd2luZyBkaWZmZXJlbmNlczoKPj4gLSBQUk9CRV9NRU0zMiBzdXBwb3J0cyBzdG9y ZS4KPj4gLSBQUk9CRV9NRU0zMiByZWxpZXMgb24gdGhlIHZlcmlmaWVyIHRvIGNsZWFyIHVwcGVy IDMyLWJpdCBvZiB0aGUKPj4gICBzcmMvZHN0IHJlZ2lzdGVyCj4+IC0gUFJPQkVfTUVNMzIgYWRk cyA2NC1iaXQga2Vybl92bV9zdGFydCBhZGRyZXNzICh3aGljaCBpcyBzdG9yZWQgaW4gUzcKPj4g ICBpbiB0aGUgcHJvbG9ndWUpLiBEdWUgdG8gYnBmX2FyZW5hIGNvbnN0cnVjdGlvbnMgc3VjaCBT NyArIHJlZyArCj4+ICAgb2ZmMTYgYWNjZXNzIGlzIGd1YXJhbnRlZWQgdG8gYmUgd2l0aGluIGFy ZW5hIHZpcnR1YWwgcmFuZ2UsIHNvIG5vCj4+ICAgYWRkcmVzcyBjaGVjayBhdCBydW4tdGltZS4K Pj4gLSBTNyBpcyBhIGZyZWUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyLCBzbyBpdCBpcyB1c2VkIHRv IHN0b3JlIGtlcm5fdm1fc3RhcnQKPj4gLSBQUk9CRV9NRU0zMiBhbGxvd3MgU1RYIGFuZCBTVC4g SWYgdGhleSBmYXVsdCB0aGUgc3RvcmUgaXMgYSBub3AuIFdoZW4KPj4gICBMRFggZmF1bHRzIHRo ZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyB6ZXJvZWQuCj4+Cj4+IFRvIHN1cHBvcnQgdGhlc2Ug b24gcmlzY3YsIHdlIGRvIHRtcCA9IFM3ICsgc3JjL2RzdCByZWcgYW5kIHRoZW4gdXNlCj4+IHRt cDIgYXMgdGhlIG5ldyBzcmMvZHN0IHJlZ2lzdGVyLiBUaGlzIGFsbG93cyB1cyB0byByZXVzZSBt b3N0IG9mIHRoZQo+PiBjb2RlIGZvciBub3JtYWwgW0xEWCB8IFNUWCB8IFNUXS4KPgo+IENvb2wg dG8gc2VlIHRoZSBSViBCUEYgSklUIGtlZXBpbmcgdXAgd2l0aCB4ODYgZmVhdHVyZXMhIDstKSBO aWNlIHdvcmshCgpJdCBpcyBteSBzZWxmIHByb2NsYWltZWQgZHV0eSB0byBtYWtlIHN1cmUgdGhh dCBhbGwgNjQtYml0IEpJVHMgaGF2ZQpmZWF0dXJlIHBhcml0eS4gOkQKCj4KPiBBIGNvdXBsZSBv ZiBtaW5vciBjb21tZW50cyBiZWxvdy4KPgo+PiBTaWduZWQtb2ZmLWJ5OiBQdXJhbmpheSBNb2hh biA8cHVyYW5qYXkxMkBnbWFpbC5jb20+Cj4+IC0tLQo+PiAgYXJjaC9yaXNjdi9uZXQvYnBmX2pp dC5oICAgICAgICB8ICAgMSArCj4+ICBhcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jIHwg MTkzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4+ICBhcmNoL3Jpc2N2L25ldC9i cGZfaml0X2NvcmUuYyAgIHwgICAxICsKPj4gIDMgZmlsZXMgY2hhbmdlZCwgMTkyIGluc2VydGlv bnMoKyksIDMgZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L25ldC9i cGZfaml0LmggYi9hcmNoL3Jpc2N2L25ldC9icGZfaml0LmgKPj4gaW5kZXggZjRiNmIzYjllZGRh Li44YTQ3ZGEwOGRkOWMgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvcmlzY3YvbmV0L2JwZl9qaXQuaAo+ PiArKysgYi9hcmNoL3Jpc2N2L25ldC9icGZfaml0LmgKPj4gQEAgLTgxLDYgKzgxLDcgQEAgc3Ry dWN0IHJ2X2ppdF9jb250ZXh0IHsKPj4gIAlpbnQgbmV4ZW50cmllczsKPj4gIAl1bnNpZ25lZCBs b25nIGZsYWdzOwo+PiAgCWludCBzdGFja19zaXplOwo+PiArCXU2NCBhcmVuYV92bV9zdGFydDsK Pj4gIH07Cj4+ICAKPj4gIC8qIENvbnZlcnQgZnJvbSBuaW5zbnMgdG8gYnl0ZXMuICovCj4+IGRp ZmYgLS1naXQgYS9hcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jIGIvYXJjaC9yaXNjdi9u ZXQvYnBmX2ppdF9jb21wNjQuYwo+PiBpbmRleCAxYWRmMmYzOWNlNTkuLjBjMDU4OGUzMjdhZiAx MDA2NDQKPj4gLS0tIGEvYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wNjQuYwo+PiArKysgYi9h cmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXA2NC5jCj4+IEBAIC0yNTUsNiArMjU1LDEwIEBAIHN0 YXRpYyB2b2lkIF9fYnVpbGRfZXBpbG9ndWUoYm9vbCBpc190YWlsX2NhbGwsIHN0cnVjdCBydl9q aXRfY29udGV4dCAqY3R4KQo+PiAgCQllbWl0X2xkKFJWX1JFR19TNiwgc3RvcmVfb2Zmc2V0LCBS Vl9SRUdfU1AsIGN0eCk7Cj4+ICAJCXN0b3JlX29mZnNldCAtPSA4Owo+PiAgCX0KPj4gKwlpZiAo Y3R4LT5hcmVuYV92bV9zdGFydCkgewo+PiArCQllbWl0X2xkKFJWX1JFR19TNywgc3RvcmVfb2Zm c2V0LCBSVl9SRUdfU1AsIGN0eCk7Cj4+ICsJCXN0b3JlX29mZnNldCAtPSA4Owo+PiArCX0KPj4g IAo+PiAgCWVtaXRfYWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgc3RhY2tfYWRqdXN0LCBjdHgp Owo+PiAgCS8qIFNldCByZXR1cm4gdmFsdWUuICovCj4+IEBAIC01NDgsNiArNTUyLDcgQEAgc3Rh dGljIHZvaWQgZW1pdF9hdG9taWModTggcmQsIHU4IHJzLCBzMTYgb2ZmLCBzMzIgaW1tLCBib29s IGlzNjQsCj4+ICAKPj4gICNkZWZpbmUgQlBGX0ZJWFVQX09GRlNFVF9NQVNLICAgR0VOTUFTSygy NiwgMCkKPj4gICNkZWZpbmUgQlBGX0ZJWFVQX1JFR19NQVNLICAgICAgR0VOTUFTSygzMSwgMjcp Cj4+ICsjZGVmaW5lIERPTlRfQ0xFQVIJCTE3CS8qIFJWX1JFR19BNyB1bnVzZWQgaW4gcHRfcmVn bWFwICovCj4KPiBIbW0sIHNvIHRoaXMgaXMganVzdCBhIGEgc2VudGluZWwgbm9kZSwgcmlnaHQ/ IElzbid0IGl0IG1vcmUgcm9idXN0IHRvCj4gdXNlLCBzYXkgUkVHX1pFUk8gd2hpY2ggd2lsbCBu ZXZlciBiZSB1c2VkPyBNYXliZSBSRUdfRE9OVF9DTEVBUl9NQVJLRVIKPiBvciBzbXRoLCBzbyBp dCdzIG9idmlvdXMgaG93IGl0J3MgdXNlZD8KClllcywgSSBhZ3JlZSwgUlZfUkVHX1pFUk8gd291 bGQgYmUgdGhlIGJlc3QgdGhpbmcgdG8gdXNlIGhlcmUuCgo+Cj4KPj4gIGJvb2wgZXhfaGFuZGxl cl9icGYoY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZXgsCj4+ICAJCSAgICBz dHJ1Y3QgcHRfcmVncyAqcmVncykKPj4gQEAgLTU1NSw3ICs1NjAsOCBAQCBib29sIGV4X2hhbmRs ZXJfYnBmKGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmV4LAo+PiAgCW9mZl90 IG9mZnNldCA9IEZJRUxEX0dFVChCUEZfRklYVVBfT0ZGU0VUX01BU0ssIGV4LT5maXh1cCk7Cj4+ ICAJaW50IHJlZ3Nfb2Zmc2V0ID0gRklFTERfR0VUKEJQRl9GSVhVUF9SRUdfTUFTSywgZXgtPmZp eHVwKTsKPj4gIAo+PiAtCSoodW5zaWduZWQgbG9uZyAqKSgodm9pZCAqKXJlZ3MgKyBwdF9yZWdt YXBbcmVnc19vZmZzZXRdKSA9IDA7Cj4+ICsJaWYgKHJlZ3Nfb2Zmc2V0ICE9IERPTlRfQ0xFQVIp Cj4+ICsJCSoodW5zaWduZWQgbG9uZyAqKSgodm9pZCAqKXJlZ3MgKyBwdF9yZWdtYXBbcmVnc19v ZmZzZXRdKSA9IDA7Cj4+ICAJcmVncy0+ZXBjID0gKHVuc2lnbmVkIGxvbmcpJmV4LT5maXh1cCAt IG9mZnNldDsKPj4gIAo+PiAgCXJldHVybiB0cnVlOwo+PiBAQCAtNTcyLDcgKzU3OCw4IEBAIHN0 YXRpYyBpbnQgYWRkX2V4Y2VwdGlvbl9oYW5kbGVyKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5z biwKPj4gIAlvZmZfdCBmaXh1cF9vZmZzZXQ7Cj4+ICAKPj4gIAlpZiAoIWN0eC0+aW5zbnMgfHwg IWN0eC0+cm9faW5zbnMgfHwgIWN0eC0+cHJvZy0+YXV4LT5leHRhYmxlIHx8Cj4+IC0JICAgIChC UEZfTU9ERShpbnNuLT5jb2RlKSAhPSBCUEZfUFJPQkVfTUVNICYmIEJQRl9NT0RFKGluc24tPmNv ZGUpICE9IEJQRl9QUk9CRV9NRU1TWCkpCj4+ICsJICAgIChCUEZfTU9ERShpbnNuLT5jb2RlKSAh PSBCUEZfUFJPQkVfTUVNICYmIEJQRl9NT0RFKGluc24tPmNvZGUpICE9IEJQRl9QUk9CRV9NRU1T WCAmJgo+PiArCSAgICAgQlBGX01PREUoaW5zbi0+Y29kZSkgIT0gQlBGX1BST0JFX01FTTMyKSkK Pj4gIAkJcmV0dXJuIDA7Cj4+ICAKPj4gIAlpZiAoV0FSTl9PTl9PTkNFKGN0eC0+bmV4ZW50cmll cyA+PSBjdHgtPnByb2ctPmF1eC0+bnVtX2V4ZW50cmllcykpCj4+IEBAIC02MjIsNiArNjI5LDkg QEAgc3RhdGljIGludCBhZGRfZXhjZXB0aW9uX2hhbmRsZXIoY29uc3Qgc3RydWN0IGJwZl9pbnNu ICppbnNuLAo+PiAgCj4+ICAJZXgtPmluc24gPSBpbnNfb2Zmc2V0Owo+PiAgCj4+ICsJaWYgKEJQ Rl9DTEFTUyhpbnNuLT5jb2RlKSAhPSBCUEZfTERYKQo+PiArCQlkc3RfcmVnID0gRE9OVF9DTEVB UjsKPj4gKwo+Cj4gSW5zdGVhZCBvZiBoYXZpbmcgYSBzaWRlLWVmZmVjdCwgYW5kIHBhc3Npbmcg YSBkdW1teSBkc3RfcmVnIGZvciB0aGUKPiBwcm9iZV9tZW0zMiwganVzdCBleHBsaWNpdGx5IGFk ZCBET05UX0NMRUFSIHdoZW4gY2FsbGluZwo+IGFkZF9leGNlcHRpb25faGFuZGxlcigpLiBJdCdz IG1vcmUgb2J2aW91cyB0byBtZSBhdCBsZWFzdC4KClN1cmUsIHdpbGwgZG8gdGhhdCBpbiB0aGUg bmV4dCB2ZXJzaW9uLgoKPgo+PiAgCWV4LT5maXh1cCA9IEZJRUxEX1BSRVAoQlBGX0ZJWFVQX09G RlNFVF9NQVNLLCBmaXh1cF9vZmZzZXQpIHwKPj4gIAkJRklFTERfUFJFUChCUEZfRklYVVBfUkVH X01BU0ssIGRzdF9yZWcpOwo+PiAgCWV4LT50eXBlID0gRVhfVFlQRV9CUEY7Cj4+IEBAIC0xMDYz LDcgKzEwNzMsNyBAQCBpbnQgYnBmX2ppdF9lbWl0X2luc24oY29uc3Qgc3RydWN0IGJwZl9pbnNu ICppbnNuLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKPj4gIAkJICAgIEJQRl9DTEFTUyhp bnNuLT5jb2RlKSA9PSBCUEZfSk1QOwo+PiAgCWludCBzLCBlLCBydm9mZiwgcmV0LCBpID0gaW5z biAtIGN0eC0+cHJvZy0+aW5zbnNpOwo+PiAgCXN0cnVjdCBicGZfcHJvZ19hdXggKmF1eCA9IGN0 eC0+cHJvZy0+YXV4Owo+PiAtCXU4IHJkID0gLTEsIHJzID0gLTEsIGNvZGUgPSBpbnNuLT5jb2Rl Owo+PiArCXU4IHJkID0gLTEsIHJzID0gLTEsIGNvZGUgPSBpbnNuLT5jb2RlLCByZWdfYXJlbmFf dm1fc3RhcnQgPSBSVl9SRUdfUzc7Cj4+ICAJczE2IG9mZiA9IGluc24tPm9mZjsKPj4gIAlzMzIg aW1tID0gaW5zbi0+aW1tOwo+PiAgCj4+IEBAIC0xNTM5LDYgKzE1NDksMTEgQEAgaW50IGJwZl9q aXRfZW1pdF9pbnNuKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgc3RydWN0IHJ2X2ppdF9j b250ZXh0ICpjdHgsCj4+ICAJY2FzZSBCUEZfTERYIHwgQlBGX1BST0JFX01FTVNYIHwgQlBGX0I6 Cj4+ICAJY2FzZSBCUEZfTERYIHwgQlBGX1BST0JFX01FTVNYIHwgQlBGX0g6Cj4+ICAJY2FzZSBC UEZfTERYIHwgQlBGX1BST0JFX01FTVNYIHwgQlBGX1c6Cj4+ICsJLyogTERYIHwgUFJPQkVfTUVN MzI6IGRzdCA9ICoodW5zaWduZWQgc2l6ZSAqKShzcmMgKyBTNyArIG9mZikqLwo+PiArCWNhc2Ug QlBGX0xEWCB8IEJQRl9QUk9CRV9NRU0zMiB8IEJQRl9COgo+PiArCWNhc2UgQlBGX0xEWCB8IEJQ Rl9QUk9CRV9NRU0zMiB8IEJQRl9IOgo+PiArCWNhc2UgQlBGX0xEWCB8IEJQRl9QUk9CRV9NRU0z MiB8IEJQRl9XOgo+PiArCWNhc2UgQlBGX0xEWCB8IEJQRl9QUk9CRV9NRU0zMiB8IEJQRl9EVzoK Pj4gIAl7Cj4+ICAJCWludCBpbnNuX2xlbiwgaW5zbnNfc3RhcnQ7Cj4+ICAJCWJvb2wgc2lnbl9l eHQ7Cj4+IEBAIC0xNTQ2LDYgKzE1NjEsMTEgQEAgaW50IGJwZl9qaXRfZW1pdF9pbnNuKGNvbnN0 IHN0cnVjdCBicGZfaW5zbiAqaW5zbiwgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgsCj4+ICAJ CXNpZ25fZXh0ID0gQlBGX01PREUoaW5zbi0+Y29kZSkgPT0gQlBGX01FTVNYIHx8Cj4+ICAJCQkg ICBCUEZfTU9ERShpbnNuLT5jb2RlKSA9PSBCUEZfUFJPQkVfTUVNU1g7Cj4+ICAKPj4gKwkJaWYg KEJQRl9NT0RFKGluc24tPmNvZGUpID09IEJQRl9QUk9CRV9NRU0zMikgewo+PiArCQkJZW1pdF9h ZGQoUlZfUkVHX1QyLCBycywgcmVnX2FyZW5hX3ZtX3N0YXJ0LCBjdHgpOwo+PiArCQkJcnMgPSBS Vl9SRUdfVDI7Cj4+ICsJCX0KPj4gKwo+PiAgCQlzd2l0Y2ggKEJQRl9TSVpFKGNvZGUpKSB7Cj4+ ICAJCWNhc2UgQlBGX0I6Cj4+ICAJCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7Cj4+IEBAIC0xNjgy LDYgKzE3MDIsODcgQEAgaW50IGJwZl9qaXRfZW1pdF9pbnNuKGNvbnN0IHN0cnVjdCBicGZfaW5z biAqaW5zbiwgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgsCj4+ICAJCWVtaXRfc2QoUlZfUkVH X1QyLCAwLCBSVl9SRUdfVDEsIGN0eCk7Cj4+ICAJCWJyZWFrOwo+PiAgCj4+ICsJY2FzZSBCUEZf U1QgfCBCUEZfUFJPQkVfTUVNMzIgfCBCUEZfQjoKPj4gKwljYXNlIEJQRl9TVCB8IEJQRl9QUk9C RV9NRU0zMiB8IEJQRl9IOgo+PiArCWNhc2UgQlBGX1NUIHwgQlBGX1BST0JFX01FTTMyIHwgQlBG X1c6Cj4+ICsJY2FzZSBCUEZfU1QgfCBCUEZfUFJPQkVfTUVNMzIgfCBCUEZfRFc6Cj4+ICsJewo+ PiArCQlpbnQgaW5zbl9sZW4sIGluc25zX3N0YXJ0Owo+PiArCj4+ICsJCWVtaXRfYWRkKFJWX1JF R19UMywgcmQsIHJlZ19hcmVuYV92bV9zdGFydCwgY3R4KTsKPj4gKwkJcmQgPSBSVl9SRUdfVDM7 Cj4+ICsKPj4gKwkJLyogTG9hZCBpbW0gdG8gYSByZWdpc3RlciB0aGVuIHN0b3JlIGl0ICovCj4+ ICsJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOwo+PiArCj4+ICsJCXN3aXRjaCAoQlBG X1NJWkUoY29kZSkpIHsKPj4gKwkJY2FzZSBCUEZfQjoKPj4gKwkJCWlmIChpc18xMmJfaW50KG9m ZikpIHsKPj4gKwkJCQlpbnNuc19zdGFydCA9IGN0eC0+bmluc25zOwo+PiArCQkJCWVtaXQocnZf c2IocmQsIG9mZiwgUlZfUkVHX1QxKSwgY3R4KTsKPj4gKwkJCQlpbnNuX2xlbiA9IGN0eC0+bmlu c25zIC0gaW5zbnNfc3RhcnQ7Cj4+ICsJCQkJYnJlYWs7Cj4+ICsJCQl9Cj4+ICsKPj4gKwkJCWVt aXRfaW1tKFJWX1JFR19UMiwgb2ZmLCBjdHgpOwo+PiArCQkJZW1pdF9hZGQoUlZfUkVHX1QyLCBS Vl9SRUdfVDIsIHJkLCBjdHgpOwo+PiArCQkJaW5zbnNfc3RhcnQgPSBjdHgtPm5pbnNuczsKPj4g KwkJCWVtaXQocnZfc2IoUlZfUkVHX1QyLCAwLCBSVl9SRUdfVDEpLCBjdHgpOwo+PiArCQkJaW5z bl9sZW4gPSBjdHgtPm5pbnNucyAtIGluc25zX3N0YXJ0Owo+PiArCj4+ICsJCQlicmVhazsKPj4g Kwo+PiArCQljYXNlIEJQRl9IOgo+PiArCQkJaWYgKGlzXzEyYl9pbnQob2ZmKSkgewo+PiArCQkJ CWluc25zX3N0YXJ0ID0gY3R4LT5uaW5zbnM7Cj4+ICsJCQkJZW1pdChydl9zaChyZCwgb2ZmLCBS Vl9SRUdfVDEpLCBjdHgpOwo+PiArCQkJCWluc25fbGVuID0gY3R4LT5uaW5zbnMgLSBpbnNuc19z dGFydDsKPj4gKwkJCQlicmVhazsKPj4gKwkJCX0KPj4gKwo+PiArCQkJZW1pdF9pbW0oUlZfUkVH X1QyLCBvZmYsIGN0eCk7Cj4+ICsJCQllbWl0X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgcmQs IGN0eCk7Cj4+ICsJCQlpbnNuc19zdGFydCA9IGN0eC0+bmluc25zOwo+PiArCQkJZW1pdChydl9z aChSVl9SRUdfVDIsIDAsIFJWX1JFR19UMSksIGN0eCk7Cj4+ICsJCQlpbnNuX2xlbiA9IGN0eC0+ bmluc25zIC0gaW5zbnNfc3RhcnQ7Cj4+ICsJCQlicmVhazsKPj4gKwkJY2FzZSBCUEZfVzoKPj4g KwkJCWlmIChpc18xMmJfaW50KG9mZikpIHsKPj4gKwkJCQlpbnNuc19zdGFydCA9IGN0eC0+bmlu c25zOwo+PiArCQkJCWVtaXRfc3cocmQsIG9mZiwgUlZfUkVHX1QxLCBjdHgpOwo+PiArCQkJCWlu c25fbGVuID0gY3R4LT5uaW5zbnMgLSBpbnNuc19zdGFydDsKPj4gKwkJCQlicmVhazsKPj4gKwkJ CX0KPj4gKwo+PiArCQkJZW1pdF9pbW0oUlZfUkVHX1QyLCBvZmYsIGN0eCk7Cj4+ICsJCQllbWl0 X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgcmQsIGN0eCk7Cj4+ICsJCQlpbnNuc19zdGFydCA9 IGN0eC0+bmluc25zOwo+PiArCQkJZW1pdF9zdyhSVl9SRUdfVDIsIDAsIFJWX1JFR19UMSwgY3R4 KTsKPj4gKwkJCWluc25fbGVuID0gY3R4LT5uaW5zbnMgLSBpbnNuc19zdGFydDsKPj4gKwkJCWJy ZWFrOwo+PiArCQljYXNlIEJQRl9EVzoKPj4gKwkJCWlmIChpc18xMmJfaW50KG9mZikpIHsKPj4g KwkJCQlpbnNuc19zdGFydCA9IGN0eC0+bmluc25zOwo+PiArCQkJCWVtaXRfc2QocmQsIG9mZiwg UlZfUkVHX1QxLCBjdHgpOwo+PiArCQkJCWluc25fbGVuID0gY3R4LT5uaW5zbnMgLSBpbnNuc19z dGFydDsKPj4gKwkJCQlicmVhazsKPj4gKwkJCX0KPj4gKwo+PiArCQkJZW1pdF9pbW0oUlZfUkVH X1QyLCBvZmYsIGN0eCk7Cj4+ICsJCQllbWl0X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgcmQs IGN0eCk7Cj4+ICsJCQlpbnNuc19zdGFydCA9IGN0eC0+bmluc25zOwo+PiArCQkJZW1pdF9zZChS Vl9SRUdfVDIsIDAsIFJWX1JFR19UMSwgY3R4KTsKPj4gKwkJCWluc25fbGVuID0gY3R4LT5uaW5z bnMgLSBpbnNuc19zdGFydDsKPj4gKwkJCWJyZWFrOwo+PiArCQl9Cj4KPiBBIGxvdCBvZiBzaW1p bGFyIGNvZGUsIHdpdGggZW1pdCBvZiBkaWZmZXJlbnQgc2l6ZXMuIFBvc3NpYmxlIHRvIG1vdmUK PiBtb3ZlIG91dCB0byBhIGZ1bmN0aW9uLCBhbmQgd3JhcCB0aGUgZW1pdHM/IFRoZSBtYWluIGxv b3AgaXMgaGFyZCByZWFkCj4gYWxyZWFkeSEKCkkgdGhvdWdodCBhYm91dCB0aGlzIGFzIHdlbGwu IE15IHBsYW4gaXMgdG8gcmVmYWN0b3IgdGhlIHdob2xlIHRoaW5nIGluIGEKc2VwZXJhdGUgcGF0 Y2guIEkgZGlkIG5vdCBkbyBpdCB3aXRoIHRoaXMgZmVhdHVyZSBhcyBpdCB3aWxsIGNhdXNlIGEg bG90Cm9mIHVucmVsYXRlZCBjb2RlIGNodXJuLgoKVGhhbmtzLApQdXJhbmpheQoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=