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 X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,FROM_EXCESS_BASE64, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD41FC43387 for ; Wed, 16 Jan 2019 07:24:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5EA8B20840 for ; Wed, 16 Jan 2019 07:24:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C/k5rc1J" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388197AbfAPHYK (ORCPT ); Wed, 16 Jan 2019 02:24:10 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:36999 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727247AbfAPHYJ (ORCPT ); Wed, 16 Jan 2019 02:24:09 -0500 Received: by mail-qt1-f196.google.com with SMTP id t33so6094202qtt.4 for ; Tue, 15 Jan 2019 23:24:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=dKvOC089S4I4I8Vt8+CwS++1M4BEvZ0vmrrEcdxHbUw=; b=C/k5rc1JX9xpGQQUn3w2hfLxAP/ogBlRhzbxFHbJytbiIxCt+ddNJMQqrKjVTHy7LZ Ixb7P4ECUpZs2YsoP9gHrUhDIy1Qix7DaJ3S9rfxK46Cr10WbkpHAtqTyrV49MThYGQy qxA8pklYnw48wv2KM4IQBuSbHXDuBoLHLqW6UthofxItE54Vj9YSAB9/RZusxldEz2dT cH/z9Rp2uvC/k93n0OzM88xfpvO8d1hYv2DwkEBM8KcALcDPO0VamTUCJ63iIJNO8GpJ Eoy+4hePwyivOITyW9jho4c+hT1eNsquSC7H8PH6waA7pLyv8x4sSxzp9uvXhNUQxBFu vzGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=dKvOC089S4I4I8Vt8+CwS++1M4BEvZ0vmrrEcdxHbUw=; b=W28ntJbgpzNpNNLVlzlWaqtn+vT58eCGqKyXzInacM0fPs+SMNZyFpqMRGYrQgw6Se Fr6p0X6CI7G8BfPvOPJ7PnaeKN6Pzc/Rcqs+GuLbM6V70I30frk3DLJ5GgyK9lo8anxO qNdouiwFkHIJyjfVUtUF0lTpnEi5d0c9cyLg3iGfIfjJlcDQxwJpS87ZMC4AO5MJb8kg Q75A/YTo0vUUapjeYYyAasL3yCo9t62n9bpnJ5nMve9JhESQsU4ie0J7ELnviKs+Eyhk 9KRvc76HoMLvzisNSkK/uzpD5L45yWnu7GNt0hV0f7khkikkVaqPqWtpNZibheR2izLw udRw== X-Gm-Message-State: AJcUukfyPDfNXc7aCbTmRCKXwU9o/VioWKg/DYwF7h0xhYRFARSKm+pn NnjRTpBObqJtMrZaoYKnVHyynxCwwQr3N+jo4bc= X-Google-Smtp-Source: ALg8bN7lXkTCdRVcq3nyQaWvyRgMRL/n/8NwjIxi4wR54Ulu8atR/rBgOz2+MQXfYOstc2xA6XucBy4o1PDrtwi2wJA= X-Received: by 2002:ac8:4454:: with SMTP id m20mr5809055qtn.381.1547623448004; Tue, 15 Jan 2019 23:24:08 -0800 (PST) MIME-Version: 1.0 References: <20190115083518.10149-1-bjorn.topel@gmail.com> <20190115083518.10149-4-bjorn.topel@gmail.com> In-Reply-To: From: =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= Date: Wed, 16 Jan 2019 08:23:56 +0100 Message-ID: Subject: Re: [RFC PATCH 3/3] bpf, riscv: added eBPF JIT for RV64G To: Daniel Borkmann Cc: linux-riscv@lists.infradead.org, Palmer Dabbelt , davidlee@sifive.com, Netdev Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Den ons 16 jan. 2019 kl 00:50 skrev Daniel Borkmann : > > On 01/15/2019 09:35 AM, Bj=C3=B6rn T=C3=B6pel wrote: > > This commit adds eBPF JIT for RV64G. > > > > Codewise, it needs some refactoring. Currently there's a bit too much > > copy-and-paste going on, and I know some places where I could optimize > > the code generation a bit (mostly BPF_K type of instructions, dealing > > with immediates). > > Nice work! :) > > > From a features perspective, two things are missing: > > > > * tail calls > > * "far-branches", i.e. conditional branches that reach beyond 13b. > > > > The test_bpf.ko passes all tests. > > Did you also check test_verifier under jit with/without jit hardening > enabled? That one contains lots of runtime tests as well. Probably makes > sense to check under CONFIG_BPF_JIT_ALWAYS_ON to see what fails the JIT; > the test_verifier also contains various tail call tests targeted at JITs, > for example. > Good point! I will do that. The only selftests/bpf program that I ran (and passed) was "test_progs". I'll make sure that the complete bpf selftests suite passes as well! > Nit: please definitely also add a MAINTAINERS entry with at least yoursel= f > under BPF JIT section, and update Documentation/sysctl/net.txt with riscv= 64. > Ah! Yes, I'll fix that. > > Signed-off-by: Bj=C3=B6rn T=C3=B6pel > > --- > > arch/riscv/net/bpf_jit_comp.c | 1608 +++++++++++++++++++++++++++++++++ > > 1 file changed, 1608 insertions(+) > > > > diff --git a/arch/riscv/net/bpf_jit_comp.c b/arch/riscv/net/bpf_jit_com= p.c > > index 7e359d3249ee..562d56eb8d23 100644 > > --- a/arch/riscv/net/bpf_jit_comp.c > > +++ b/arch/riscv/net/bpf_jit_comp.c > > @@ -1,4 +1,1612 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * BPF JIT compiler for RV64G > > + * > > + * Copyright(c) 2019 Bj=C3=B6rn T=C3=B6pel > > + * > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#define TMP_REG_0 (MAX_BPF_JIT_REG + 0) > > +#define TMP_REG_1 (MAX_BPF_JIT_REG + 1) > > Not used? > Correct! I'll get rid of them. > > +#define TAIL_CALL_REG (MAX_BPF_JIT_REG + 2) > > + > > +enum rv_register { > > + RV_REG_ZERO =3D 0, /* The constant value 0 */ > > + RV_REG_RA =3D 1, /* Return address */ > > + RV_REG_SP =3D 2, /* Stack pointer */ > > + RV_REG_GP =3D 3, /* Global pointer */ > > + RV_REG_TP =3D 4, /* Thread pointer */ > > + RV_REG_T0 =3D 5, /* Temporaries */ > > + RV_REG_T1 =3D 6, > > + RV_REG_T2 =3D 7, > > + RV_REG_FP =3D 8, > > + RV_REG_S1 =3D 9, /* Saved registers */ > > + RV_REG_A0 =3D 10, /* Function argument/return values */ > > + RV_REG_A1 =3D 11, /* Function arguments */ > > + RV_REG_A2 =3D 12, > > + RV_REG_A3 =3D 13, > > + RV_REG_A4 =3D 14, > > + RV_REG_A5 =3D 15, > > + RV_REG_A6 =3D 16, > > + RV_REG_A7 =3D 17, > > + RV_REG_S2 =3D 18, /* Saved registers */ > > + RV_REG_S3 =3D 19, > > + RV_REG_S4 =3D 20, > > + RV_REG_S5 =3D 21, > > + RV_REG_S6 =3D 22, > > + RV_REG_S7 =3D 23, > > + RV_REG_S8 =3D 24, > > + RV_REG_S9 =3D 25, > > + RV_REG_S10 =3D 26, > > + RV_REG_S11 =3D 27, > > + RV_REG_T3 =3D 28, /* Temporaries */ > > + RV_REG_T4 =3D 29, > > + RV_REG_T5 =3D 30, > > + RV_REG_T6 =3D 31, > > +}; > > + > > +struct rv_jit_context { > > + struct bpf_prog *prog; > > + u32 *insns; /* RV insns */ > > + int ninsns; > > + int epilogue_offset; > > + int *offset; /* BPF to RV */ > > + unsigned long seen_reg_bits; > > + int stack_size; > > +}; > > + > > +struct rv_jit_data { > > + struct bpf_binary_header *header; > > + u8 *image; > > + struct rv_jit_context ctx; > > +}; > > + > > +static u8 bpf_to_rv_reg(int bpf_reg, struct rv_jit_context *ctx) > > +{ > > This one can also be simplified by having a simple mapping as in > other JITs and then mark __set_bit() in the small bpf_to_rv_reg() > helper. > Yeah, I agree. Much better. I'll take that route. > > + switch (bpf_reg) { > > + /* Return value */ > > + case BPF_REG_0: > > + __set_bit(RV_REG_A5, &ctx->seen_reg_bits); > > + return RV_REG_A5; > > + /* Function arguments */ > > + case BPF_REG_1: > > + __set_bit(RV_REG_A0, &ctx->seen_reg_bits); > > + return RV_REG_A0; > > + case BPF_REG_2: > > + __set_bit(RV_REG_A1, &ctx->seen_reg_bits); > > + return RV_REG_A1; > > + case BPF_REG_3: > > + __set_bit(RV_REG_A2, &ctx->seen_reg_bits); > > + return RV_REG_A2; > > + case BPF_REG_4: > > + __set_bit(RV_REG_A3, &ctx->seen_reg_bits); > > + return RV_REG_A3; > > + case BPF_REG_5: > > + __set_bit(RV_REG_A4, &ctx->seen_reg_bits); > > + return RV_REG_A4; > > + /* Callee saved registers */ > > + case BPF_REG_6: > > + __set_bit(RV_REG_S1, &ctx->seen_reg_bits); > > + return RV_REG_S1; > > + case BPF_REG_7: > > + __set_bit(RV_REG_S2, &ctx->seen_reg_bits); > > + return RV_REG_S2; > > + case BPF_REG_8: > > + __set_bit(RV_REG_S3, &ctx->seen_reg_bits); > > + return RV_REG_S3; > > + case BPF_REG_9: > > + __set_bit(RV_REG_S4, &ctx->seen_reg_bits); > > + return RV_REG_S4; > > + /* Stack read-only frame pointer to access stack */ > > + case BPF_REG_FP: > > + __set_bit(RV_REG_S5, &ctx->seen_reg_bits); > > + return RV_REG_S5; > > + /* Temporary register */ > > + case BPF_REG_AX: > > + __set_bit(RV_REG_T0, &ctx->seen_reg_bits); > > + return RV_REG_T0; > > + /* Tail call counter */ > > + case TAIL_CALL_REG: > > + __set_bit(RV_REG_S6, &ctx->seen_reg_bits); > > + return RV_REG_S6; > > + default: > > + return 0; > > + } > > +}; > [...] > > + /* tail call */ > > + case BPF_JMP | BPF_TAIL_CALL: > > + rd =3D bpf_to_rv_reg(TAIL_CALL_REG, ctx); > > + pr_err("bpf-jit: tail call not supported yet!\n"); > > + return -1; > > There are two options here, either fixed size prologue where you can > then jump over it in tail call case, or dynamic one which would make > it slower due to reg restore but shrinks image for non-tail calls. > So, it would be the latter then, which is pretty much like a more expensive (due to the tail call depth checks) function call. For the fixed prologue: how does, say x86, deal with BPF stack usage in the tail call case? If the caller doesn't use the bpf stack, but the callee does. From a quick glance in the code, the x86 prologue still uses aux->stack_depth. If the callee has a different stack usage that the caller, and then the callee does a function call, wouldn't this mess up the frame? (Yeah, obviously missing something! :-)) > > + /* function return */ > > + case BPF_JMP | BPF_EXIT: > > + if (i =3D=3D ctx->prog->len - 1) > > + break; > > + > > + rvoff =3D epilogue_offset(ctx); > > + if (!is_21b_int(rvoff)) { > > + pr_err("bpf-jit: %d offset=3D%d not supported yet= !\n", > > + __LINE__, rvoff); > > + return -1; > > + } > > + > > + emit(rv_jal(RV_REG_ZERO, rvoff >> 1), ctx); > > + break; > > + > > + /* dst =3D imm64 */ > > + case BPF_LD | BPF_IMM | BPF_DW: > > + { > > + struct bpf_insn insn1 =3D insn[1]; > > + u64 imm64; > > + > [...] > > + > > +static void build_prologue(struct rv_jit_context *ctx) > > +{ > > + int stack_adjust =3D 0, store_offset, bpf_stack_adjust; > > + > > + if (seen_reg(RV_REG_RA, ctx)) > > + stack_adjust +=3D 8; > > + stack_adjust +=3D 8; /* RV_REG_FP */ > > + if (seen_reg(RV_REG_S1, ctx)) > > + stack_adjust +=3D 8; > > + if (seen_reg(RV_REG_S2, ctx)) > > + stack_adjust +=3D 8; > > + if (seen_reg(RV_REG_S3, ctx)) > > + stack_adjust +=3D 8; > > + if (seen_reg(RV_REG_S4, ctx)) > > + stack_adjust +=3D 8; > > + if (seen_reg(RV_REG_S5, ctx)) > > + stack_adjust +=3D 8; > > + if (seen_reg(RV_REG_S6, ctx)) > > + stack_adjust +=3D 8; > > + > > + stack_adjust =3D round_up(stack_adjust, 16); > > + bpf_stack_adjust =3D round_up(ctx->prog->aux->stack_depth, 16); > > + stack_adjust +=3D bpf_stack_adjust; > > + > > + store_offset =3D stack_adjust - 8; > > + > > + emit(rv_addi(RV_REG_SP, RV_REG_SP, -stack_adjust), ctx); > > + > > + if (seen_reg(RV_REG_RA, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_RA), ctx); > > + store_offset -=3D 8; > > + } > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_FP), ctx); > > + store_offset -=3D 8; > > + if (seen_reg(RV_REG_S1, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S1), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S2, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S2), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S3, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S3), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S4, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S4), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S5, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S5), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S6, ctx)) { > > + emit(rv_sd(RV_REG_SP, store_offset, RV_REG_S6), ctx); > > + store_offset -=3D 8; > > + } > > + > > + emit(rv_addi(RV_REG_FP, RV_REG_SP, stack_adjust), ctx); > > + > > + if (bpf_stack_adjust) { > > + if (!seen_reg(RV_REG_S5, ctx)) > > + pr_warn("bpf-jit: not seen BPF_REG_FP, stack is %= d\n", > > + bpf_stack_adjust); > > + emit(rv_addi(RV_REG_S5, RV_REG_SP, bpf_stack_adjust), ctx= ); > > + } > > + > > + ctx->stack_size =3D stack_adjust; > > +} > > + > > +static void build_epilogue(struct rv_jit_context *ctx) > > +{ > > + int stack_adjust =3D ctx->stack_size, store_offset =3D stack_adju= st - 8; > > + > > + if (seen_reg(RV_REG_RA, ctx)) { > > + emit(rv_ld(RV_REG_RA, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + emit(rv_ld(RV_REG_FP, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + if (seen_reg(RV_REG_S1, ctx)) { > > + emit(rv_ld(RV_REG_S1, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S2, ctx)) { > > + emit(rv_ld(RV_REG_S2, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S3, ctx)) { > > + emit(rv_ld(RV_REG_S3, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S4, ctx)) { > > + emit(rv_ld(RV_REG_S4, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S5, ctx)) { > > + emit(rv_ld(RV_REG_S5, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + if (seen_reg(RV_REG_S6, ctx)) { > > + emit(rv_ld(RV_REG_S6, store_offset, RV_REG_SP), ctx); > > + store_offset -=3D 8; > > + } > > + > > + emit(rv_addi(RV_REG_SP, RV_REG_SP, stack_adjust), ctx); > > + /* Set return value. */ > > + emit(rv_addi(RV_REG_A0, RV_REG_A5, 0), ctx); > > + emit(rv_jalr(RV_REG_ZERO, RV_REG_RA, 0), ctx); > > +} > > + > > +static int build_body(struct rv_jit_context *ctx, bool extra_pass) > > +{ > > + const struct bpf_prog *prog =3D ctx->prog; > > + int i; > > + > > + for (i =3D 0; i < prog->len; i++) { > > + const struct bpf_insn *insn =3D &prog->insnsi[i]; > > + int ret; > > + > > + ret =3D emit_insn(insn, ctx, extra_pass); > > + if (ret > 0) { > > + i++; > > + if (ctx->insns =3D=3D NULL) > > + ctx->offset[i] =3D ctx->ninsns; > > + continue; > > + } > > + if (ctx->insns =3D=3D NULL) > > + ctx->offset[i] =3D ctx->ninsns; > > + if (ret) > > + return ret; > > + } > > + return 0; > > +} > > + > > +static void bpf_fill_ill_insns(void *area, unsigned int size) > > +{ > > + memset(area, 0, size); > > Needs update as well? > No, bitpattern of all zeros is an illegal instruction, but a comment would be good! > > +} > > + > > +static void bpf_flush_icache(void *start, void *end) > > +{ > > + flush_icache_range((unsigned long)start, (unsigned long)end); > > +} > > + Thanks a lot for the comments, Daniel! I'll get back with a v2. Bj=C3=B6rn 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 X-Spam-Level: X-Spam-Status: No, score=-6.9 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, FROM_EXCESS_BASE64,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4E68C43387 for ; Wed, 16 Jan 2019 07:24:17 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 8174820840 for ; Wed, 16 Jan 2019 07:24:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="qJbwmZw5"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C/k5rc1J" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8174820840 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EdPnX9PxTof8wqQuAvvGQVNVs16kkelxJ7DtWfnOxaM=; b=qJbwmZw5r1SbUB 967dbZdBb7YNAyJrGTo1W7iF+vcOALt4iZ9kk+dduIhUkTFC/ntteyKGILsoX/pNWwnxjmFXmIb+E ivcYZxxnn88C7L4n8YgmL81RyONkdTf1ZhNOaCalt/uedYhdEtDKbmOXRj3PMCDR/pJchqLMfCUS6 S92XtzBA4js+CrN3cNClw2rTmbXmJPyn0JMyp0qmqJr5s9RMqWl7WLE7lMeLA3QDADHnqTJHgSDot cRp8ehSbYjrJJGEEVT1RbZCQ+cGXmoMTmeBptb5dme9fDoCjOKEj0Z+5KF3q2jHHS2RoGPGhYriyn a/GnQLJ5TyXl1+XNXjXg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gjfYd-0003Jz-NT; Wed, 16 Jan 2019 07:24:15 +0000 Received: from mail-qt1-x843.google.com ([2607:f8b0:4864:20::843]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gjfYa-0003JY-1c for linux-riscv@lists.infradead.org; Wed, 16 Jan 2019 07:24:14 +0000 Received: by mail-qt1-x843.google.com with SMTP id y20so6028671qtm.13 for ; Tue, 15 Jan 2019 23:24:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=dKvOC089S4I4I8Vt8+CwS++1M4BEvZ0vmrrEcdxHbUw=; b=C/k5rc1JX9xpGQQUn3w2hfLxAP/ogBlRhzbxFHbJytbiIxCt+ddNJMQqrKjVTHy7LZ Ixb7P4ECUpZs2YsoP9gHrUhDIy1Qix7DaJ3S9rfxK46Cr10WbkpHAtqTyrV49MThYGQy qxA8pklYnw48wv2KM4IQBuSbHXDuBoLHLqW6UthofxItE54Vj9YSAB9/RZusxldEz2dT cH/z9Rp2uvC/k93n0OzM88xfpvO8d1hYv2DwkEBM8KcALcDPO0VamTUCJ63iIJNO8GpJ Eoy+4hePwyivOITyW9jho4c+hT1eNsquSC7H8PH6waA7pLyv8x4sSxzp9uvXhNUQxBFu vzGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=dKvOC089S4I4I8Vt8+CwS++1M4BEvZ0vmrrEcdxHbUw=; b=Zlv3T5HSq8L7ldjGGfbFz3TLwSwRPNe0yEOTc2TRIsiJhZ5W0C0AgDe48e8qx6l7RM ggNUGIbUGsqEPCJK2PhL3x44BQfAYW4xvgEznHVPxU1oe8nJT/DZy1DvNtlj3bbjpiz7 an6ViK9PdQ9b4XYDm9naL1S0veZi88JIPLaSTthHkE4P7G/YJXpqMnGtd8eyguMQiBVv X9n0u21tfeGrlWw4Jqj3//m2FC69AKqFzN4eHexvpeCysRYkdApR892qaDZLDe4Zgraw KJfgqrJigdoLerGjAyhdc01kkPUsQrmsqHq0vg0xJ26SI92mcp49BJq6SEJHZxsLju4s apDg== X-Gm-Message-State: AJcUukfRA1rkzb+MKzCUfvImb7tvaKW9yW1+fx0dvJncC+bkZUfr2WRp JDF9/i6SnwQP5vyAylRzuDTkJw79oZSnE+9943A= X-Google-Smtp-Source: ALg8bN7lXkTCdRVcq3nyQaWvyRgMRL/n/8NwjIxi4wR54Ulu8atR/rBgOz2+MQXfYOstc2xA6XucBy4o1PDrtwi2wJA= X-Received: by 2002:ac8:4454:: with SMTP id m20mr5809055qtn.381.1547623448004; Tue, 15 Jan 2019 23:24:08 -0800 (PST) MIME-Version: 1.0 References: <20190115083518.10149-1-bjorn.topel@gmail.com> <20190115083518.10149-4-bjorn.topel@gmail.com> In-Reply-To: From: =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= Date: Wed, 16 Jan 2019 08:23:56 +0100 Message-ID: Subject: Re: [RFC PATCH 3/3] bpf, riscv: added eBPF JIT for RV64G To: Daniel Borkmann X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190115_232412_122148_C92FB4FF X-CRM114-Status: GOOD ( 28.48 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Netdev , linux-riscv@lists.infradead.org, Palmer Dabbelt , davidlee@sifive.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org RGVuIG9ucyAxNiBqYW4uIDIwMTkga2wgMDA6NTAgc2tyZXYgRGFuaWVsIEJvcmttYW5uIDxkYW5p ZWxAaW9nZWFyYm94Lm5ldD46Cj4KPiBPbiAwMS8xNS8yMDE5IDA5OjM1IEFNLCBCasO2cm4gVMO2 cGVsIHdyb3RlOgo+ID4gVGhpcyBjb21taXQgYWRkcyBlQlBGIEpJVCBmb3IgUlY2NEcuCj4gPgo+ ID4gQ29kZXdpc2UsIGl0IG5lZWRzIHNvbWUgcmVmYWN0b3JpbmcuIEN1cnJlbnRseSB0aGVyZSdz IGEgYml0IHRvbyBtdWNoCj4gPiBjb3B5LWFuZC1wYXN0ZSBnb2luZyBvbiwgYW5kIEkga25vdyBz b21lIHBsYWNlcyB3aGVyZSBJIGNvdWxkIG9wdGltaXplCj4gPiB0aGUgY29kZSBnZW5lcmF0aW9u IGEgYml0IChtb3N0bHkgQlBGX0sgdHlwZSBvZiBpbnN0cnVjdGlvbnMsIGRlYWxpbmcKPiA+IHdp dGggaW1tZWRpYXRlcykuCj4KPiBOaWNlIHdvcmshIDopCj4KPiA+IEZyb20gYSBmZWF0dXJlcyBw ZXJzcGVjdGl2ZSwgdHdvIHRoaW5ncyBhcmUgbWlzc2luZzoKPiA+Cj4gPiAqIHRhaWwgY2FsbHMK PiA+ICogImZhci1icmFuY2hlcyIsIGkuZS4gY29uZGl0aW9uYWwgYnJhbmNoZXMgdGhhdCByZWFj aCBiZXlvbmQgMTNiLgo+ID4KPiA+IFRoZSB0ZXN0X2JwZi5rbyBwYXNzZXMgYWxsIHRlc3RzLgo+ Cj4gRGlkIHlvdSBhbHNvIGNoZWNrIHRlc3RfdmVyaWZpZXIgdW5kZXIgaml0IHdpdGgvd2l0aG91 dCBqaXQgaGFyZGVuaW5nCj4gZW5hYmxlZD8gVGhhdCBvbmUgY29udGFpbnMgbG90cyBvZiBydW50 aW1lIHRlc3RzIGFzIHdlbGwuIFByb2JhYmx5IG1ha2VzCj4gc2Vuc2UgdG8gY2hlY2sgdW5kZXIg Q09ORklHX0JQRl9KSVRfQUxXQVlTX09OIHRvIHNlZSB3aGF0IGZhaWxzIHRoZSBKSVQ7Cj4gdGhl IHRlc3RfdmVyaWZpZXIgYWxzbyBjb250YWlucyB2YXJpb3VzIHRhaWwgY2FsbCB0ZXN0cyB0YXJn ZXRlZCBhdCBKSVRzLAo+IGZvciBleGFtcGxlLgo+CgpHb29kIHBvaW50ISBJIHdpbGwgZG8gdGhh dC4gVGhlIG9ubHkgc2VsZnRlc3RzL2JwZiBwcm9ncmFtIHRoYXQgSSByYW4KKGFuZCBwYXNzZWQp IHdhcyAidGVzdF9wcm9ncyIuIEknbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGJwZgpz ZWxmdGVzdHMgc3VpdGUgcGFzc2VzIGFzIHdlbGwhCgo+IE5pdDogcGxlYXNlIGRlZmluaXRlbHkg YWxzbyBhZGQgYSBNQUlOVEFJTkVSUyBlbnRyeSB3aXRoIGF0IGxlYXN0IHlvdXJzZWxmCj4gdW5k ZXIgQlBGIEpJVCBzZWN0aW9uLCBhbmQgdXBkYXRlIERvY3VtZW50YXRpb24vc3lzY3RsL25ldC50 eHQgd2l0aCByaXNjdjY0Lgo+CgpBaCEgWWVzLCBJJ2xsIGZpeCB0aGF0LgoKPiA+IFNpZ25lZC1v ZmYtYnk6IEJqw7ZybiBUw7ZwZWwgPGJqb3JuLnRvcGVsQGdtYWlsLmNvbT4KPiA+IC0tLQo+ID4g IGFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jIHwgMTYwOCArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKPiA+ICAxIGZpbGUgY2hhbmdlZCwgMTYwOCBpbnNlcnRpb25zKCspCj4g Pgo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jIGIvYXJjaC9y aXNjdi9uZXQvYnBmX2ppdF9jb21wLmMKPiA+IGluZGV4IDdlMzU5ZDMyNDllZS4uNTYyZDU2ZWI4 ZDIzIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wLmMKPiA+ICsr KyBiL2FyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jCj4gPiBAQCAtMSw0ICsxLDE2MTIgQEAK PiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ID4gKy8qCj4gPiArICog QlBGIEpJVCBjb21waWxlciBmb3IgUlY2NEcKPiA+ICsgKgo+ID4gKyAqIENvcHlyaWdodChjKSAy MDE5IEJqw7ZybiBUw7ZwZWwgPGJqb3JuLnRvcGVsQGdtYWlsLmNvbT4KPiA+ICsgKgo+ID4gKyAq Lwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgv ZmlsdGVyLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Cj4gPiArCj4gPiArI2Rl ZmluZSBUTVBfUkVHXzAgKE1BWF9CUEZfSklUX1JFRyArIDApCj4gPiArI2RlZmluZSBUTVBfUkVH XzEgKE1BWF9CUEZfSklUX1JFRyArIDEpCj4KPiBOb3QgdXNlZD8KPgoKQ29ycmVjdCEgSSdsbCBn ZXQgcmlkIG9mIHRoZW0uCgo+ID4gKyNkZWZpbmUgVEFJTF9DQUxMX1JFRyAoTUFYX0JQRl9KSVRf UkVHICsgMikKPiA+ICsKPiA+ICtlbnVtIHJ2X3JlZ2lzdGVyIHsKPiA+ICsgICAgIFJWX1JFR19a RVJPID0gICAwLCAgICAgIC8qIFRoZSBjb25zdGFudCB2YWx1ZSAwICovCj4gPiArICAgICBSVl9S RUdfUkEgPSAgICAgMSwgICAgICAvKiBSZXR1cm4gYWRkcmVzcyAqLwo+ID4gKyAgICAgUlZfUkVH X1NQID0gICAgIDIsICAgICAgLyogU3RhY2sgcG9pbnRlciAqLwo+ID4gKyAgICAgUlZfUkVHX0dQ ID0gICAgIDMsICAgICAgLyogR2xvYmFsIHBvaW50ZXIgKi8KPiA+ICsgICAgIFJWX1JFR19UUCA9 ICAgICA0LCAgICAgIC8qIFRocmVhZCBwb2ludGVyICovCj4gPiArICAgICBSVl9SRUdfVDAgPSAg ICAgNSwgICAgICAvKiBUZW1wb3JhcmllcyAqLwo+ID4gKyAgICAgUlZfUkVHX1QxID0gICAgIDYs Cj4gPiArICAgICBSVl9SRUdfVDIgPSAgICAgNywKPiA+ICsgICAgIFJWX1JFR19GUCA9ICAgICA4 LAo+ID4gKyAgICAgUlZfUkVHX1MxID0gICAgIDksICAgICAgLyogU2F2ZWQgcmVnaXN0ZXJzICov Cj4gPiArICAgICBSVl9SRUdfQTAgPSAgICAgMTAsICAgICAvKiBGdW5jdGlvbiBhcmd1bWVudC9y ZXR1cm4gdmFsdWVzICovCj4gPiArICAgICBSVl9SRUdfQTEgPSAgICAgMTEsICAgICAvKiBGdW5j dGlvbiBhcmd1bWVudHMgKi8KPiA+ICsgICAgIFJWX1JFR19BMiA9ICAgICAxMiwKPiA+ICsgICAg IFJWX1JFR19BMyA9ICAgICAxMywKPiA+ICsgICAgIFJWX1JFR19BNCA9ICAgICAxNCwKPiA+ICsg ICAgIFJWX1JFR19BNSA9ICAgICAxNSwKPiA+ICsgICAgIFJWX1JFR19BNiA9ICAgICAxNiwKPiA+ ICsgICAgIFJWX1JFR19BNyA9ICAgICAxNywKPiA+ICsgICAgIFJWX1JFR19TMiA9ICAgICAxOCwg ICAgIC8qIFNhdmVkIHJlZ2lzdGVycyAqLwo+ID4gKyAgICAgUlZfUkVHX1MzID0gICAgIDE5LAo+ ID4gKyAgICAgUlZfUkVHX1M0ID0gICAgIDIwLAo+ID4gKyAgICAgUlZfUkVHX1M1ID0gICAgIDIx LAo+ID4gKyAgICAgUlZfUkVHX1M2ID0gICAgIDIyLAo+ID4gKyAgICAgUlZfUkVHX1M3ID0gICAg IDIzLAo+ID4gKyAgICAgUlZfUkVHX1M4ID0gICAgIDI0LAo+ID4gKyAgICAgUlZfUkVHX1M5ID0g ICAgIDI1LAo+ID4gKyAgICAgUlZfUkVHX1MxMCA9ICAgIDI2LAo+ID4gKyAgICAgUlZfUkVHX1Mx MSA9ICAgIDI3LAo+ID4gKyAgICAgUlZfUkVHX1QzID0gICAgIDI4LCAgICAgLyogVGVtcG9yYXJp ZXMgKi8KPiA+ICsgICAgIFJWX1JFR19UNCA9ICAgICAyOSwKPiA+ICsgICAgIFJWX1JFR19UNSA9 ICAgICAzMCwKPiA+ICsgICAgIFJWX1JFR19UNiA9ICAgICAzMSwKPiA+ICt9Owo+ID4gKwo+ID4g K3N0cnVjdCBydl9qaXRfY29udGV4dCB7Cj4gPiArICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7 Cj4gPiArICAgICB1MzIgKmluc25zOyAvKiBSViBpbnNucyAqLwo+ID4gKyAgICAgaW50IG5pbnNu czsKPiA+ICsgICAgIGludCBlcGlsb2d1ZV9vZmZzZXQ7Cj4gPiArICAgICBpbnQgKm9mZnNldDsg LyogQlBGIHRvIFJWICovCj4gPiArICAgICB1bnNpZ25lZCBsb25nIHNlZW5fcmVnX2JpdHM7Cj4g PiArICAgICBpbnQgc3RhY2tfc2l6ZTsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBydl9qaXRf ZGF0YSB7Cj4gPiArICAgICBzdHJ1Y3QgYnBmX2JpbmFyeV9oZWFkZXIgKmhlYWRlcjsKPiA+ICsg ICAgIHU4ICppbWFnZTsKPiA+ICsgICAgIHN0cnVjdCBydl9qaXRfY29udGV4dCBjdHg7Cj4gPiAr fTsKPiA+ICsKPiA+ICtzdGF0aWMgdTggYnBmX3RvX3J2X3JlZyhpbnQgYnBmX3JlZywgc3RydWN0 IHJ2X2ppdF9jb250ZXh0ICpjdHgpCj4gPiArewo+Cj4gVGhpcyBvbmUgY2FuIGFsc28gYmUgc2lt cGxpZmllZCBieSBoYXZpbmcgYSBzaW1wbGUgbWFwcGluZyBhcyBpbgo+IG90aGVyIEpJVHMgYW5k IHRoZW4gbWFyayBfX3NldF9iaXQoPHJlZz4pIGluIHRoZSBzbWFsbCBicGZfdG9fcnZfcmVnKCkK PiBoZWxwZXIuCj4KClllYWgsIEkgYWdyZWUuIE11Y2ggYmV0dGVyLiBJJ2xsIHRha2UgdGhhdCBy b3V0ZS4KCj4gPiArICAgICBzd2l0Y2ggKGJwZl9yZWcpIHsKPiA+ICsgICAgIC8qIFJldHVybiB2 YWx1ZSAqLwo+ID4gKyAgICAgY2FzZSBCUEZfUkVHXzA6Cj4gPiArICAgICAgICAgICAgIF9fc2V0 X2JpdChSVl9SRUdfQTUsICZjdHgtPnNlZW5fcmVnX2JpdHMpOwo+ID4gKyAgICAgICAgICAgICBy ZXR1cm4gUlZfUkVHX0E1Owo+ID4gKyAgICAgLyogRnVuY3Rpb24gYXJndW1lbnRzICovCj4gPiAr ICAgICBjYXNlIEJQRl9SRUdfMToKPiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19B MCwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdf QTA7Cj4gPiArICAgICBjYXNlIEJQRl9SRUdfMjoKPiA+ICsgICAgICAgICAgICAgX19zZXRfYml0 KFJWX1JFR19BMSwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVy biBSVl9SRUdfQTE7Cj4gPiArICAgICBjYXNlIEJQRl9SRUdfMzoKPiA+ICsgICAgICAgICAgICAg X19zZXRfYml0KFJWX1JFR19BMiwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAg ICAgIHJldHVybiBSVl9SRUdfQTI7Cj4gPiArICAgICBjYXNlIEJQRl9SRUdfNDoKPiA+ICsgICAg ICAgICAgICAgX19zZXRfYml0KFJWX1JFR19BMywgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfQTM7Cj4gPiArICAgICBjYXNlIEJQRl9SRUdfNToK PiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19BNCwgJmN0eC0+c2Vlbl9yZWdfYml0 cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfQTQ7Cj4gPiArICAgICAvKiBDYWxs ZWUgc2F2ZWQgcmVnaXN0ZXJzICovCj4gPiArICAgICBjYXNlIEJQRl9SRUdfNjoKPiA+ICsgICAg ICAgICAgICAgX19zZXRfYml0KFJWX1JFR19TMSwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiAr ICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfUzE7Cj4gPiArICAgICBjYXNlIEJQRl9SRUdfNzoK PiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19TMiwgJmN0eC0+c2Vlbl9yZWdfYml0 cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfUzI7Cj4gPiArICAgICBjYXNlIEJQ Rl9SRUdfODoKPiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19TMywgJmN0eC0+c2Vl bl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfUzM7Cj4gPiArICAg ICBjYXNlIEJQRl9SRUdfOToKPiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19TNCwg JmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdfUzQ7 Cj4gPiArICAgICAvKiBTdGFjayByZWFkLW9ubHkgZnJhbWUgcG9pbnRlciB0byBhY2Nlc3Mgc3Rh Y2sgKi8KPiA+ICsgICAgIGNhc2UgQlBGX1JFR19GUDoKPiA+ICsgICAgICAgICAgICAgX19zZXRf Yml0KFJWX1JFR19TNSwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJl dHVybiBSVl9SRUdfUzU7Cj4gPiArICAgICAvKiBUZW1wb3JhcnkgcmVnaXN0ZXIgKi8KPiA+ICsg ICAgIGNhc2UgQlBGX1JFR19BWDoKPiA+ICsgICAgICAgICAgICAgX19zZXRfYml0KFJWX1JFR19U MCwgJmN0eC0+c2Vlbl9yZWdfYml0cyk7Cj4gPiArICAgICAgICAgICAgIHJldHVybiBSVl9SRUdf VDA7Cj4gPiArICAgICAvKiBUYWlsIGNhbGwgY291bnRlciAqLwo+ID4gKyAgICAgY2FzZSBUQUlM X0NBTExfUkVHOgo+ID4gKyAgICAgICAgICAgICBfX3NldF9iaXQoUlZfUkVHX1M2LCAmY3R4LT5z ZWVuX3JlZ19iaXRzKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIFJWX1JFR19TNjsKPiA+ICsg ICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gKyAgICAgfQo+ID4g K307Cj4gWy4uLl0KPiA+ICsgICAgIC8qIHRhaWwgY2FsbCAqLwo+ID4gKyAgICAgY2FzZSBCUEZf Sk1QIHwgQlBGX1RBSUxfQ0FMTDoKPiA+ICsgICAgICAgICAgICAgcmQgPSBicGZfdG9fcnZfcmVn KFRBSUxfQ0FMTF9SRUcsIGN0eCk7Cj4gPiArICAgICAgICAgICAgIHByX2VycigiYnBmLWppdDog dGFpbCBjYWxsIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIik7Cj4gPiArICAgICAgICAgICAgIHJldHVy biAtMTsKPgo+IFRoZXJlIGFyZSB0d28gb3B0aW9ucyBoZXJlLCBlaXRoZXIgZml4ZWQgc2l6ZSBw cm9sb2d1ZSB3aGVyZSB5b3UgY2FuCj4gdGhlbiBqdW1wIG92ZXIgaXQgaW4gdGFpbCBjYWxsIGNh c2UsIG9yIGR5bmFtaWMgb25lIHdoaWNoIHdvdWxkIG1ha2UKPiBpdCBzbG93ZXIgZHVlIHRvIHJl ZyByZXN0b3JlIGJ1dCBzaHJpbmtzIGltYWdlIGZvciBub24tdGFpbCBjYWxscy4KPgoKU28sIGl0 IHdvdWxkIGJlIHRoZSBsYXR0ZXIgdGhlbiwgd2hpY2ggaXMgcHJldHR5IG11Y2ggbGlrZSBhIG1v cmUKZXhwZW5zaXZlIChkdWUgdG8gdGhlIHRhaWwgY2FsbCBkZXB0aCBjaGVja3MpIGZ1bmN0aW9u IGNhbGwuCgpGb3IgdGhlIGZpeGVkIHByb2xvZ3VlOiBob3cgZG9lcywgc2F5IHg4NiwgZGVhbCB3 aXRoIEJQRiBzdGFjayB1c2FnZQppbiB0aGUgdGFpbCBjYWxsIGNhc2U/IElmIHRoZSBjYWxsZXIg ZG9lc24ndCB1c2UgdGhlIGJwZiBzdGFjaywgYnV0CnRoZSBjYWxsZWUgZG9lcy4gRnJvbSBhIHF1 aWNrIGdsYW5jZSBpbiB0aGUgY29kZSwgdGhlIHg4NiBwcm9sb2d1ZQpzdGlsbCB1c2VzIGF1eC0+ c3RhY2tfZGVwdGguIElmIHRoZSBjYWxsZWUgaGFzIGEgZGlmZmVyZW50IHN0YWNrIHVzYWdlCnRo YXQgdGhlIGNhbGxlciwgYW5kIHRoZW4gdGhlIGNhbGxlZSBkb2VzIGEgZnVuY3Rpb24gY2FsbCwg d291bGRuJ3QKdGhpcyBtZXNzIHVwIHRoZSBmcmFtZT8gKFllYWgsIG9idmlvdXNseSBtaXNzaW5n IHNvbWV0aGluZyEgOi0pKQoKPiA+ICsgICAgIC8qIGZ1bmN0aW9uIHJldHVybiAqLwo+ID4gKyAg ICAgY2FzZSBCUEZfSk1QIHwgQlBGX0VYSVQ6Cj4gPiArICAgICAgICAgICAgIGlmIChpID09IGN0 eC0+cHJvZy0+bGVuIC0gMSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiA+ICsK PiA+ICsgICAgICAgICAgICAgcnZvZmYgPSBlcGlsb2d1ZV9vZmZzZXQoY3R4KTsKPiA+ICsgICAg ICAgICAgICAgaWYgKCFpc18yMWJfaW50KHJ2b2ZmKSkgewo+ID4gKyAgICAgICAgICAgICAgICAg ICAgIHByX2VycigiYnBmLWppdDogJWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHJ2b2ZmKTsKPiA+ICsg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Cj4gPiArICAgICAgICAgICAgIH0KPiA+ICsK PiA+ICsgICAgICAgICAgICAgZW1pdChydl9qYWwoUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBj dHgpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsKPiA+ICsgICAgIC8qIGRzdCA9IGlt bTY0ICovCj4gPiArICAgICBjYXNlIEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFc6Cj4gPiArICAg ICB7Cj4gPiArICAgICAgICAgICAgIHN0cnVjdCBicGZfaW5zbiBpbnNuMSA9IGluc25bMV07Cj4g PiArICAgICAgICAgICAgIHU2NCBpbW02NDsKPiA+ICsKPiBbLi4uXQo+ID4gKwo+ID4gK3N0YXRp YyB2b2lkIGJ1aWxkX3Byb2xvZ3VlKHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQo+ID4gK3sK PiA+ICsgICAgIGludCBzdGFja19hZGp1c3QgPSAwLCBzdG9yZV9vZmZzZXQsIGJwZl9zdGFja19h ZGp1c3Q7Cj4gPiArCj4gPiArICAgICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1JBLCBjdHgpKQo+ID4g KyAgICAgICAgICAgICBzdGFja19hZGp1c3QgKz0gODsKPiA+ICsgICAgIHN0YWNrX2FkanVzdCAr PSA4OyAvKiBSVl9SRUdfRlAgKi8KPiA+ICsgICAgIGlmIChzZWVuX3JlZyhSVl9SRUdfUzEsIGN0 eCkpCj4gPiArICAgICAgICAgICAgIHN0YWNrX2FkanVzdCArPSA4Owo+ID4gKyAgICAgaWYgKHNl ZW5fcmVnKFJWX1JFR19TMiwgY3R4KSkKPiA+ICsgICAgICAgICAgICAgc3RhY2tfYWRqdXN0ICs9 IDg7Cj4gPiArICAgICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1MzLCBjdHgpKQo+ID4gKyAgICAgICAg ICAgICBzdGFja19hZGp1c3QgKz0gODsKPiA+ICsgICAgIGlmIChzZWVuX3JlZyhSVl9SRUdfUzQs IGN0eCkpCj4gPiArICAgICAgICAgICAgIHN0YWNrX2FkanVzdCArPSA4Owo+ID4gKyAgICAgaWYg KHNlZW5fcmVnKFJWX1JFR19TNSwgY3R4KSkKPiA+ICsgICAgICAgICAgICAgc3RhY2tfYWRqdXN0 ICs9IDg7Cj4gPiArICAgICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1M2LCBjdHgpKQo+ID4gKyAgICAg ICAgICAgICBzdGFja19hZGp1c3QgKz0gODsKPiA+ICsKPiA+ICsgICAgIHN0YWNrX2FkanVzdCA9 IHJvdW5kX3VwKHN0YWNrX2FkanVzdCwgMTYpOwo+ID4gKyAgICAgYnBmX3N0YWNrX2FkanVzdCA9 IHJvdW5kX3VwKGN0eC0+cHJvZy0+YXV4LT5zdGFja19kZXB0aCwgMTYpOwo+ID4gKyAgICAgc3Rh Y2tfYWRqdXN0ICs9IGJwZl9zdGFja19hZGp1c3Q7Cj4gPiArCj4gPiArICAgICBzdG9yZV9vZmZz ZXQgPSBzdGFja19hZGp1c3QgLSA4Owo+ID4gKwo+ID4gKyAgICAgZW1pdChydl9hZGRpKFJWX1JF R19TUCwgUlZfUkVHX1NQLCAtc3RhY2tfYWRqdXN0KSwgY3R4KTsKPiA+ICsKPiA+ICsgICAgIGlm IChzZWVuX3JlZyhSVl9SRUdfUkEsIGN0eCkpIHsKPiA+ICsgICAgICAgICAgICAgZW1pdChydl9z ZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1JBKSwgY3R4KTsKPiA+ICsgICAgICAg ICAgICAgc3RvcmVfb2Zmc2V0IC09IDg7Cj4gPiArICAgICB9Cj4gPiArICAgICBlbWl0KHJ2X3Nk KFJWX1JFR19TUCwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfRlApLCBjdHgpOwo+ID4gKyAgICAgc3Rv cmVfb2Zmc2V0IC09IDg7Cj4gPiArICAgICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1MxLCBjdHgpKSB7 Cj4gPiArICAgICAgICAgICAgIGVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJW X1JFR19TMSksIGN0eCk7Cj4gPiArICAgICAgICAgICAgIHN0b3JlX29mZnNldCAtPSA4Owo+ID4g KyAgICAgfQo+ID4gKyAgICAgaWYgKHNlZW5fcmVnKFJWX1JFR19TMiwgY3R4KSkgewo+ID4gKyAg ICAgICAgICAgICBlbWl0KHJ2X3NkKFJWX1JFR19TUCwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfUzIp LCBjdHgpOwo+ID4gKyAgICAgICAgICAgICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIH0K PiA+ICsgICAgIGlmIChzZWVuX3JlZyhSVl9SRUdfUzMsIGN0eCkpIHsKPiA+ICsgICAgICAgICAg ICAgZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1MzKSwgY3R4KTsK PiA+ICsgICAgICAgICAgICAgc3RvcmVfb2Zmc2V0IC09IDg7Cj4gPiArICAgICB9Cj4gPiArICAg ICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1M0LCBjdHgpKSB7Cj4gPiArICAgICAgICAgICAgIGVtaXQo cnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TNCksIGN0eCk7Cj4gPiArICAg ICAgICAgICAgIHN0b3JlX29mZnNldCAtPSA4Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgaWYgKHNl ZW5fcmVnKFJWX1JFR19TNSwgY3R4KSkgewo+ID4gKyAgICAgICAgICAgICBlbWl0KHJ2X3NkKFJW X1JFR19TUCwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfUzUpLCBjdHgpOwo+ID4gKyAgICAgICAgICAg ICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIH0KPiA+ICsgICAgIGlmIChzZWVuX3JlZyhS Vl9SRUdfUzYsIGN0eCkpIHsKPiA+ICsgICAgICAgICAgICAgZW1pdChydl9zZChSVl9SRUdfU1As IHN0b3JlX29mZnNldCwgUlZfUkVHX1M2KSwgY3R4KTsKPiA+ICsgICAgICAgICAgICAgc3RvcmVf b2Zmc2V0IC09IDg7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBlbWl0KHJ2X2FkZGkoUlZf UkVHX0ZQLCBSVl9SRUdfU1AsIHN0YWNrX2FkanVzdCksIGN0eCk7Cj4gPiArCj4gPiArICAgICBp ZiAoYnBmX3N0YWNrX2FkanVzdCkgewo+ID4gKyAgICAgICAgICAgICBpZiAoIXNlZW5fcmVnKFJW X1JFR19TNSwgY3R4KSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICBwcl93YXJuKCJicGYtaml0 OiBub3Qgc2VlbiBCUEZfUkVHX0ZQLCBzdGFjayBpcyAlZFxuIiwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGJwZl9zdGFja19hZGp1c3QpOwo+ID4gKyAgICAgICAgICAgICBlbWl0 KHJ2X2FkZGkoUlZfUkVHX1M1LCBSVl9SRUdfU1AsIGJwZl9zdGFja19hZGp1c3QpLCBjdHgpOwo+ ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgY3R4LT5zdGFja19zaXplID0gc3RhY2tfYWRqdXN0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBidWlsZF9lcGlsb2d1ZShzdHJ1Y3QgcnZf aml0X2NvbnRleHQgKmN0eCkKPiA+ICt7Cj4gPiArICAgICBpbnQgc3RhY2tfYWRqdXN0ID0gY3R4 LT5zdGFja19zaXplLCBzdG9yZV9vZmZzZXQgPSBzdGFja19hZGp1c3QgLSA4Owo+ID4gKwo+ID4g KyAgICAgaWYgKHNlZW5fcmVnKFJWX1JFR19SQSwgY3R4KSkgewo+ID4gKyAgICAgICAgICAgICBl bWl0KHJ2X2xkKFJWX1JFR19SQSwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfU1ApLCBjdHgpOwo+ID4g KyAgICAgICAgICAgICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIH0KPiA+ICsgICAgIGVt aXQocnZfbGQoUlZfUkVHX0ZQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7Cj4gPiAr ICAgICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIGlmIChzZWVuX3JlZyhSVl9SRUdfUzEs IGN0eCkpIHsKPiA+ICsgICAgICAgICAgICAgZW1pdChydl9sZChSVl9SRUdfUzEsIHN0b3JlX29m ZnNldCwgUlZfUkVHX1NQKSwgY3R4KTsKPiA+ICsgICAgICAgICAgICAgc3RvcmVfb2Zmc2V0IC09 IDg7Cj4gPiArICAgICB9Cj4gPiArICAgICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1MyLCBjdHgpKSB7 Cj4gPiArICAgICAgICAgICAgIGVtaXQocnZfbGQoUlZfUkVHX1MyLCBzdG9yZV9vZmZzZXQsIFJW X1JFR19TUCksIGN0eCk7Cj4gPiArICAgICAgICAgICAgIHN0b3JlX29mZnNldCAtPSA4Owo+ID4g KyAgICAgfQo+ID4gKyAgICAgaWYgKHNlZW5fcmVnKFJWX1JFR19TMywgY3R4KSkgewo+ID4gKyAg ICAgICAgICAgICBlbWl0KHJ2X2xkKFJWX1JFR19TMywgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfU1Ap LCBjdHgpOwo+ID4gKyAgICAgICAgICAgICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIH0K PiA+ICsgICAgIGlmIChzZWVuX3JlZyhSVl9SRUdfUzQsIGN0eCkpIHsKPiA+ICsgICAgICAgICAg ICAgZW1pdChydl9sZChSVl9SRUdfUzQsIHN0b3JlX29mZnNldCwgUlZfUkVHX1NQKSwgY3R4KTsK PiA+ICsgICAgICAgICAgICAgc3RvcmVfb2Zmc2V0IC09IDg7Cj4gPiArICAgICB9Cj4gPiArICAg ICBpZiAoc2Vlbl9yZWcoUlZfUkVHX1M1LCBjdHgpKSB7Cj4gPiArICAgICAgICAgICAgIGVtaXQo cnZfbGQoUlZfUkVHX1M1LCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7Cj4gPiArICAg ICAgICAgICAgIHN0b3JlX29mZnNldCAtPSA4Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgaWYgKHNl ZW5fcmVnKFJWX1JFR19TNiwgY3R4KSkgewo+ID4gKyAgICAgICAgICAgICBlbWl0KHJ2X2xkKFJW X1JFR19TNiwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfU1ApLCBjdHgpOwo+ID4gKyAgICAgICAgICAg ICBzdG9yZV9vZmZzZXQgLT0gODsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIGVtaXQocnZf YWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgc3RhY2tfYWRqdXN0KSwgY3R4KTsKPiA+ICsgICAg IC8qIFNldCByZXR1cm4gdmFsdWUuICovCj4gPiArICAgICBlbWl0KHJ2X2FkZGkoUlZfUkVHX0Ew LCBSVl9SRUdfQTUsIDApLCBjdHgpOwo+ID4gKyAgICAgZW1pdChydl9qYWxyKFJWX1JFR19aRVJP LCBSVl9SRUdfUkEsIDApLCBjdHgpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGJ1aWxk X2JvZHkoc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgsIGJvb2wgZXh0cmFfcGFzcykKPiA+ICt7 Cj4gPiArICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBjdHgtPnByb2c7Cj4gPiAr ICAgICBpbnQgaTsKPiA+ICsKPiA+ICsgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9nLT5sZW47IGkr Kykgewo+ID4gKyAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmcHJv Zy0+aW5zbnNpW2ldOwo+ID4gKyAgICAgICAgICAgICBpbnQgcmV0Owo+ID4gKwo+ID4gKyAgICAg ICAgICAgICByZXQgPSBlbWl0X2luc24oaW5zbiwgY3R4LCBleHRyYV9wYXNzKTsKPiA+ICsgICAg ICAgICAgICAgaWYgKHJldCA+IDApIHsKPiA+ICsgICAgICAgICAgICAgICAgICAgICBpKys7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+aW5zbnMgPT0gTlVMTCkKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2Zmc2V0W2ldID0gY3R4LT5uaW5zbnM7Cj4g PiArICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiArICAgICAgICAgICAgIH0KPiA+ ICsgICAgICAgICAgICAgaWYgKGN0eC0+aW5zbnMgPT0gTlVMTCkKPiA+ICsgICAgICAgICAgICAg ICAgICAgICBjdHgtPm9mZnNldFtpXSA9IGN0eC0+bmluc25zOwo+ID4gKyAgICAgICAgICAgICBp ZiAocmV0KQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9 Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgYnBmX2Zp bGxfaWxsX2luc25zKHZvaWQgKmFyZWEsIHVuc2lnbmVkIGludCBzaXplKQo+ID4gK3sKPiA+ICsg ICAgIG1lbXNldChhcmVhLCAwLCBzaXplKTsKPgo+IE5lZWRzIHVwZGF0ZSBhcyB3ZWxsPwo+CgpO bywgYml0cGF0dGVybiBvZiBhbGwgemVyb3MgaXMgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiwgYnV0 IGEgY29tbWVudAp3b3VsZCBiZSBnb29kIQoKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQg YnBmX2ZsdXNoX2ljYWNoZSh2b2lkICpzdGFydCwgdm9pZCAqZW5kKQo+ID4gK3sKPiA+ICsgICAg IGZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcp ZW5kKTsKPiA+ICt9Cj4gPiArCgpUaGFua3MgYSBsb3QgZm9yIHRoZSBjb21tZW50cywgRGFuaWVs ISBJJ2xsIGdldCBiYWNrIHdpdGggYSB2Mi4KCgpCasO2cm4KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51 eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK