From patchwork Wed Dec 19 22:44:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016374 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="ZIOVMMwQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43KqhR5dKDz9sCh for ; Thu, 20 Dec 2018 09:44:39 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728995AbeLSWoh (ORCPT ); Wed, 19 Dec 2018 17:44:37 -0500 Received: from mail-wm1-f66.google.com ([209.85.128.66]:34051 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728170AbeLSWoh (ORCPT ); Wed, 19 Dec 2018 17:44:37 -0500 Received: by mail-wm1-f66.google.com with SMTP id y185so10572338wmd.1 for ; Wed, 19 Dec 2018 14:44:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cNbPYqrPtm/+FdgfAdJFi5nAujwWSKcs1imsX3RThmg=; b=ZIOVMMwQdF86JOgmJLt9LCAiCSzOCzv5eP6FYXQQb0bbto+OLWCnK2GlTLnehV0R+m gfOCwQLabhs5ZY2M8sodhxDQGYiFhoaS1A2Np1VlbW5yo/6I9Nd2zkNF5YsqPjcF/7JK oxCH1/nVFBjGflA42eLNR4YhcajAhYRnYHpcvsya5uXV8gAUg0QKFBgjcxBdeqhiyYcp Jtjij4bd9c2t4yEw7QPFnGkDOaUrcJOJI7tMayxF5LzKJ0k+Hf3FgADkDYAHVH4sa86s ufy31G7Ogvf1VfWfRLPdDoIwtbdSUaSOtup/rSUE7HzwsdbsKnzaI4K1svYx020EOPly FWjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cNbPYqrPtm/+FdgfAdJFi5nAujwWSKcs1imsX3RThmg=; b=LnbHh4xdYQi77w/tK0ctpa45cj7yAPFI76gW63/5fZG7OCsr8H7RxdOcd16BDGkDCZ rueAFQ/jbOqlgHMMNzYKoVqKMBy+Nw9OakGRuTDkx4lvAwyzX6jj3MMXitMmGdFRMFXE gsyW4S4L6em2VuJI18B+DidVAcygbkgl/D38F7ofudowfMS7l30dpVHd+YKT6+A0puFL 4CVoNnqw1voIM9bdO0kz8/PYXwWZLMQyXTFxlo4ObEXAd805M19ixIXDZzyLDqTXhE9p JcWHQPzny25RmNFXJb7ropFWCFAhSTADMowMhsce3u0f72smhCEvBoDhGmssPutgS079 dHPg== X-Gm-Message-State: AA+aEWaxNXsFiguU4QKWVLHDkd9NqQNByBR2mRoYEcjC8V7/G7tmY2HB K0W6+gbRxFanMzoaR4cRkI+n2w32yDKJYg== X-Google-Smtp-Source: AFSGD/UAUzNQVt61lJhHq6+2rl7OtnExiwfPkmX0lGUYPMRJ+WKR3ZqUE29HMRPFDJD9Bm0kwlGFuQ== X-Received: by 2002:a1c:c2d4:: with SMTP id s203mr8863524wmf.3.1545259475053; Wed, 19 Dec 2018 14:44:35 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:34 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 01/13] bpf: encoding description and macros for JMP32 Date: Wed, 19 Dec 2018 17:44:08 -0500 Message-Id: <1545259460-13376-2-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch update kernel BPF documents for JMP32 encoding. Two macros are added for JMP32 to easy programming. Signed-off-by: Jiong Wang --- Documentation/networking/filter.txt | 10 ++++++++++ include/uapi/linux/bpf.h | 4 ++++ tools/include/uapi/linux/bpf.h | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/Documentation/networking/filter.txt b/Documentation/networking/filter.txt index 2196b82..5f6fafa 100644 --- a/Documentation/networking/filter.txt +++ b/Documentation/networking/filter.txt @@ -939,6 +939,16 @@ in eBPF means function exit only. The eBPF program needs to store return value into register R0 before doing a BPF_EXIT. Class 6 in eBPF is currently unused and reserved for future use. +And BPF_JMP has sub-opcode. When BPF_SRC(code) == BPF_X, the encoding is at +insn->imm, starting from LSB. When BPF_SRC(code) == BPF_K, the encoding is at +insn->src_reg, starting from LSB as well. Only one bit is used for sub-opcode at +the moment, all other bits in imm and src_reg are still reserved and should be +zeroed. The BPF_JMP sub-opcode is: + + BPF_JMP_SUBOP_32BIT 0x1 + +It means jump insn use 32-bit sub-register when doing comparison. + For load and store instructions the 8-bit 'code' field is divided as: +--------+--------+-------------------+ diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index e7d57e89..f30d646 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -42,6 +42,10 @@ #define BPF_CALL 0x80 /* function call */ #define BPF_EXIT 0x90 /* function return */ +/* jmp has sub-opcode */ +#define BPF_JMP_SUBOP_MASK 0x1 +#define BPF_JMP_SUBOP_32BIT 0x1 + /* Register numbers */ enum { BPF_REG_0 = 0, diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index e7d57e89..f30d646 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -42,6 +42,10 @@ #define BPF_CALL 0x80 /* function call */ #define BPF_EXIT 0x90 /* function return */ +/* jmp has sub-opcode */ +#define BPF_JMP_SUBOP_MASK 0x1 +#define BPF_JMP_SUBOP_32BIT 0x1 + /* Register numbers */ enum { BPF_REG_0 = 0, From patchwork Wed Dec 19 22:44:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016376 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Oof/n13x"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43KqhW2nBXz9sCh for ; Thu, 20 Dec 2018 09:44:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729098AbeLSWok (ORCPT ); Wed, 19 Dec 2018 17:44:40 -0500 Received: from mail-wr1-f43.google.com ([209.85.221.43]:32890 "EHLO mail-wr1-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728247AbeLSWoj (ORCPT ); Wed, 19 Dec 2018 17:44:39 -0500 Received: by mail-wr1-f43.google.com with SMTP id c14so21180205wrr.0 for ; Wed, 19 Dec 2018 14:44:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=O08C3x2DF1EvGcWwNEGaimOoNmuYorZf+oCk4wc7Kug=; b=Oof/n13xtXjbXNSsOo6pNby63kv/DLwBY1idMFT+OYUhGZrnrhg/XaNwYKen04xHca UsmTbDAjwDWhNDBZcr2/i+NJ8ivn+Oyny3Ri0netR50oi4HsmwZSVJXdAAlyoWwqR8M2 jY+zGepFGFoDxWLlHrNpZGqhID5f4wwHOoG+j5zhtJCpoEvZuojmGXamuyQPnuS1HdOf au70/RV/I+qAZmL1l95YMo1DEJFk73dH7zwIw/EOFp9K2RcDS5ifZIA1IziaYrA8ZbQS NNsTeeNqJ5H7bYcRL1P+gGj4p2ZnjM2p2q5aw3rrAV+ru8GTvhyNp+m80eHmyRgeslYr vFGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=O08C3x2DF1EvGcWwNEGaimOoNmuYorZf+oCk4wc7Kug=; b=rnTLwpTO3vYZ+r/LUCsocb5iWM19IZqPoXqSumqR/NW0TWRQLOOcY1iQW+JUPDux+3 kyYd1coKHtcRsGwJ5jgz/CELM3shluBHqHXVwvygCMYtZxkHXm+zu7Tr1m6Qi88lVZWc ZLNBll0e0ZPte4sXoeE1INdQsT8llHMINq4kylX9GLEk8ZCJUgOqmlWj9rnGz5eCqmIE ICmmqFY5v5pJUHcpcoAvvD6BcKG0Py6G1Cy5SxD6C7i270sCO5KsjOEifzXn8IrOxZ3G FHpobJiJYE/zBr1sSnYRxZ//j+VlWjl55wcS69z0C6QejhO4bCDHwhShP697/Wa5xrVQ yZzQ== X-Gm-Message-State: AA+aEWYWKoAf5ESPq/2i64+ioRCrDtnOyg01apRq+PT/g9FoaQET1lmN 0z5pZ7wrADre5h9r1gm4nd72SA== X-Google-Smtp-Source: AFSGD/Wkc8fuQrQdXOF+nU4rv8ZgWmykZlidrEv6wcQBiiJWEt+8GoZLQvMJgiR98QFAuBzS5vGDLw== X-Received: by 2002:a5d:694d:: with SMTP id r13mr19431885wrw.323.1545259475781; Wed, 19 Dec 2018 14:44:35 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:35 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 02/13] bpf: interpreter support for JMP32 Date: Wed, 19 Dec 2018 17:44:09 -0500 Message-Id: <1545259460-13376-3-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements interpreting new JMP32 instructions. Signed-off-by: Jiong Wang --- kernel/bpf/core.c | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 5cdd8da..33609f3 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -57,6 +57,7 @@ #define ARG1 regs[BPF_REG_ARG1] #define CTX regs[BPF_REG_CTX] #define IMM insn->imm +#define SRCNO insn->src_reg /* No hurry in this branch * @@ -1366,121 +1367,132 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) insn += insn->off; CONT; JMP_JEQ_X: - if (DST == SRC) { + if (DST == SRC || (IMM && (u32) DST == (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JEQ_K: - if (DST == IMM) { + if (DST == IMM || (SRCNO && (u32) DST == (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JNE_X: - if (DST != SRC) { + if ((!IMM && DST != SRC) || (IMM && (u32) DST != (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JNE_K: - if (DST != IMM) { + if ((!SRCNO && DST != IMM) || + (SRCNO && (u32) DST != (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JGT_X: - if (DST > SRC) { + if ((!IMM && DST > SRC) || (IMM && (u32) DST > (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JGT_K: - if (DST > IMM) { + if ((!SRCNO && DST > IMM) || (SRCNO && (u32) DST > (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JLT_X: - if (DST < SRC) { + if ((!IMM && DST < SRC) || (IMM && (u32) DST < (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JLT_K: - if (DST < IMM) { + if ((!SRCNO && DST < IMM) || (SRCNO && (u32) DST < (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JGE_X: - if (DST >= SRC) { + if ((!IMM && DST >= SRC) || (IMM && (u32) DST >= (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JGE_K: - if (DST >= IMM) { + if ((!SRCNO && DST >= IMM) || + (SRCNO && (u32) DST >= (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JLE_X: - if (DST <= SRC) { + if ((!IMM && DST <= SRC) || (IMM && (u32) DST <= (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JLE_K: - if (DST <= IMM) { + if ((!SRCNO && DST <= IMM) || + (SRCNO && (u32) DST <= (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSGT_X: - if (((s64) DST) > ((s64) SRC)) { + if ((!IMM && ((s64) DST) > (s64) SRC) || + (IMM && (s32) (u32) DST > (s32) (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSGT_K: - if (((s64) DST) > ((s64) IMM)) { + if ((!SRCNO && (s64) DST > (s64) IMM) || + (SRCNO && (s32) (u32) DST > (s32) (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSLT_X: - if (((s64) DST) < ((s64) SRC)) { + if ((!IMM && (s64) DST < (s64) SRC) || + (IMM && (s32) (u32) DST < (s32) (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSLT_K: - if (((s64) DST) < ((s64) IMM)) { + if ((!SRCNO && (s64) DST < (s64) IMM) || + (SRCNO && (s32) (u32) DST < (s32) (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSGE_X: - if (((s64) DST) >= ((s64) SRC)) { + if ((!IMM && (s64) DST >= (s64) SRC) || + (IMM && (s32) (u32) DST >= (s32) (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSGE_K: - if (((s64) DST) >= ((s64) IMM)) { + if ((!SRCNO && (s64) DST >= (s64) IMM) || + (SRCNO && (s32) (u32) DST >= (s32) (u32) IMM)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSLE_X: - if (((s64) DST) <= ((s64) SRC)) { + if ((!IMM && (s64) DST <= (s64) SRC) || + (IMM && (s32) (u32) DST <= (s32) (u32) SRC)) { insn += insn->off; CONT_JMP; } CONT; JMP_JSLE_K: - if (((s64) DST) <= ((s64) IMM)) { + if ((!SRCNO && (s64) DST <= (s64) IMM) || + (SRCNO && (s32) (u32) DST <= (s32) (u32) IMM)) { insn += insn->off; CONT_JMP; } From patchwork Wed Dec 19 22:44:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016377 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="0mTTRrlj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43KqhX3ksxz9sD9 for ; Thu, 20 Dec 2018 09:44:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729255AbeLSWom (ORCPT ); Wed, 19 Dec 2018 17:44:42 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:37493 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728170AbeLSWok (ORCPT ); Wed, 19 Dec 2018 17:44:40 -0500 Received: by mail-wm1-f68.google.com with SMTP id g67so102883wmd.2 for ; Wed, 19 Dec 2018 14:44:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cfXCkBj2kJYvNnfNRDP4otxJotEG/b5atqFLHO0LTFo=; b=0mTTRrljgunqMt9UrNc9mBngpeSsWcnjMpB+/SqiF8kMbW/LJ84nLFnrJqDxDkfqTI Za0WI321b9i8kFMOKjDeq2XcOejQ7gvUJ8FCgfhKwomz359aJHfmindIKcZSnUYa5U5I yzmadig9u+P2n94F7o0MWlNLWRqKhpLqLvbjsqsCPrkPfMECce8T6Lno0ZPBRww47HN5 7fvEut+q6QvLiYYjJJnhfmUsTMSNiTjP6wqmQwRDCKPINJu7iRKhHnTAlYligJksvliS +LHuX5HiyvgYBNBKFVNLUyhEbziMxd+8Efj4GE7QZ2E2IKdjqPltPXXv44w280U8doyI FnSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cfXCkBj2kJYvNnfNRDP4otxJotEG/b5atqFLHO0LTFo=; b=PJXT7EQK/2sPdq8RgdxItJbX3LoYBriN71QywlN43Tm9uq+QJSYwpZwb+X6cbcKomm yOITe779z+yNs/NrLp3nU+SFQwzpq785FifmWUbuWtzuVWwl8NTDHaKldQC67h2mmO9+ +ppm18JO2oR7HNdTVFob/zotDfM+xbuHHFAr1VbyCYdqhD5txp0d8aeCfkCLWmfr2oHf wCcl875EyQXFtgYTTTvYMvrFXu710vCFI8YDvnG4hJAUuA4jN0TGqIzZ7odMKZoWFWTw z6GlSVXi0DoJFllfY65DlMcIiQPC5RJDclushh4XS1vq6PBgZvOXvzMn4OtnJGf28/Qv uGkw== X-Gm-Message-State: AA+aEWZiE3VCqUOD3q8R+tCsXTlpdCrgsMniM0yciSuY9YngwxTQR7Zy W/qMFLRg5n3gZeElrrBa+h1Cdg== X-Google-Smtp-Source: AFSGD/XWPiUlvmXHEd2LvPf/rWEFjxiZm8D3f5fKcinElIcsz3FoZVeRDCne1bV09PDO8O1TCnFszA== X-Received: by 2002:a1c:30b:: with SMTP id 11mr8748578wmd.110.1545259478022; Wed, 19 Dec 2018 14:44:38 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:35 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 03/13] bpf: JIT blinds support JMP32 Date: Wed, 19 Dec 2018 17:44:10 -0500 Message-Id: <1545259460-13376-4-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org JIT blinds is building eBPF JMP insn directly, and is transforming BPF_K into BPF_X. Update the code to be aware of JMP32 Signed-off-by: Jiong Wang --- kernel/bpf/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 33609f3..0252e28 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -902,7 +902,13 @@ static int bpf_jit_blind_insn(const struct bpf_insn *from, off -= 2; *to++ = BPF_ALU64_IMM(BPF_MOV, BPF_REG_AX, imm_rnd ^ from->imm); *to++ = BPF_ALU64_IMM(BPF_XOR, BPF_REG_AX, imm_rnd); - *to++ = BPF_JMP_REG(from->code, from->dst_reg, BPF_REG_AX, off); + *to = BPF_JMP_REG(from->code, from->dst_reg, BPF_REG_AX, off); + if (from->src_reg) + /* NOTE: BPF_K has been transformed into BPF_X, + * mark imm instead of src_reg + */ + to->imm |= BPF_JMP_SUBOP_32BIT; + to++; break; case BPF_LD | BPF_IMM | BPF_DW: From patchwork Wed Dec 19 22:44:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016387 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="2Oa0PBgd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhy63G4z9sCh for ; Thu, 20 Dec 2018 09:45:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729549AbeLSWpF (ORCPT ); Wed, 19 Dec 2018 17:45:05 -0500 Received: from mail-wm1-f42.google.com ([209.85.128.42]:52562 "EHLO mail-wm1-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729000AbeLSWol (ORCPT ); Wed, 19 Dec 2018 17:44:41 -0500 Received: by mail-wm1-f42.google.com with SMTP id m1so92806wml.2 for ; Wed, 19 Dec 2018 14:44:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fOW1qjQx9EvCpPZbirwkkmV4vkA7HnVMeZQMzWHftNY=; b=2Oa0PBgdSSrLYEm/U2FuNxBWPdkruRI7JQ5Pdq7KP+9Yuxgf8X/G4faL06Dz+qe2g6 Px7bTpvgWPqVwZmvNW5pUyPpifml+wN3W5NgceN9zI8Tx1FfZoMQkcmZTTz9b+o0o14o cConK/s0ka5UiVXkldNAk+xItCWC9S7fBRMV6KUHBe7Fk0woKeYqpAX0n5cQxZyJsi2Y Yz4cu+PouYhuyCIg4KJqOs0cwWR9rK9U872nG86nhSMAuTX1xNe90ZyR7G7BlB1GTyUa 1WKCdx0vxA0CrpvhVRl+3YGojKMFf7LbuO/ay/5VxEd29p8olHoleCScaF6l13OWV8vW FHtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fOW1qjQx9EvCpPZbirwkkmV4vkA7HnVMeZQMzWHftNY=; b=TjUjwI1tfbNmijsvDdU0yfsAPZTu0bhRjNw8J5SDrXPeJDCojF44fZig0EKtuOO92S /7e0aWjC3A4ja2qG/GjGBUyOIFd7gTh3dRk8CaKU5mhvA55pAO12RZn+dcpOXwE0GIMt VcPeK8i58MaCQSkEjgeRC3SLEptzldmm0I37kZK7gKDSICXRW1PdFnYEs3C1BFyZzhzl BnvUTG0gajs0DJq4P7uUKbRmJTWfS5du8Vyp+XYTJlyluPlT3xh95NLIDUtRbr4OS4sf V+FjEeStEBVuD6pBCfiSYJe6zZBDuH3F1eR/Y5zGz+kmN9h6tLNnxQQ3/Oe+rO+Y8neW 775A== X-Gm-Message-State: AA+aEWZKBCg0clsGFyllbjV1zdARG7n97eflDW9K4OXj61++12LDOX1e DhQ1KeKAbhP+yFGA2FcTRPVbzg== X-Google-Smtp-Source: AFSGD/XphrqLRSWonqER6V0bINlWqQ8+08VtZY8QANSOMzR6E7zJko1yDFhHpDjAf4QiLBMAur6l7A== X-Received: by 2002:a1c:5604:: with SMTP id k4mr8581533wmb.107.1545259479070; Wed, 19 Dec 2018 14:44:39 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:38 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 04/13] x86_64: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:11 -0500 Message-Id: <1545259460-13376-5-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on x86_64. Cc: Alexei Starovoitov Cc: Daniel Borkmann Signed-off-by: Jiong Wang --- arch/x86/net/bpf_jit_comp.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 5542303..499f1c1 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -882,8 +882,12 @@ xadd: if (is_imm8(insn->off)) case BPF_JMP | BPF_JSGE | BPF_X: case BPF_JMP | BPF_JSLE | BPF_X: /* cmp dst_reg, src_reg */ - EMIT3(add_2mod(0x48, dst_reg, src_reg), 0x39, - add_2reg(0xC0, dst_reg, src_reg)); + if (!imm32) /* JMP32 */ + EMIT1(add_2mod(0x48, dst_reg, src_reg)); + else if (is_ereg(dst_reg) || is_ereg(src_reg)) + EMIT1(add_2mod(0x40, dst_reg, src_reg)); + + EMIT2(0x39, add_2reg(0xC0, dst_reg, src_reg)); goto emit_cond_jmp; case BPF_JMP | BPF_JSET | BPF_X: @@ -909,7 +913,10 @@ xadd: if (is_imm8(insn->off)) case BPF_JMP | BPF_JSGE | BPF_K: case BPF_JMP | BPF_JSLE | BPF_K: /* cmp dst_reg, imm8/32 */ - EMIT1(add_1mod(0x48, dst_reg)); + if (!src_reg) /* JMP32 */ + EMIT1(add_1mod(0x48, dst_reg)); + else if (is_ereg(dst_reg)) + EMIT1(add_1mod(0x40, dst_reg)); if (is_imm8(imm32)) EMIT3(0x83, add_1reg(0xF8, dst_reg), imm32); From patchwork Wed Dec 19 22:44:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016379 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="X64vgldR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhb2B0Bz9sCh for ; Thu, 20 Dec 2018 09:44:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729328AbeLSWop (ORCPT ); Wed, 19 Dec 2018 17:44:45 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:54734 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729188AbeLSWon (ORCPT ); Wed, 19 Dec 2018 17:44:43 -0500 Received: by mail-wm1-f67.google.com with SMTP id a62so86513wmh.4 for ; Wed, 19 Dec 2018 14:44:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X0s++q2JqB8XJAOTk0/D9GnqyX9WOsecRZQREdJdoys=; b=X64vgldRsnA/KTgZkjWxxGGuEDANdBv4bqOUrw/PpxrSVWW7QPC+Mt2OblZvUvGmrX mvSA0ECYXYwL1pz0WTEp5w3unxgjqd7bY8mG/Fbzw+dKxZ8zuzZ9leRZdxZXrRtLqkXN 9Y0luB+9Dr9Cgtknoei4FbX7xGzGbb4q6aEy1JFinE+HKoBDnQCWoxeImt32lz9a8fDf bs5+r52nSlnLMk7GAi/2CuLgoI3xT2to+7gCdB0hlhJZwzvKjgExCs3Cs3vsZpg9axWE TNkPbUbDiDEaJBpTM/niX6Xw7ntM6hOYwTqEBnRalGxsueGOCmDFJ6vuXiqDE7/n/Wtl V7gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X0s++q2JqB8XJAOTk0/D9GnqyX9WOsecRZQREdJdoys=; b=I1uHUz+VDJq4x27y36yTRGnhDIAxThkxcHkt7mX+OE2WnWa6T+4YGd2oVOheqNB6QJ wsCxHspqCku0nqg8pXrRDXRYoL/Jk8iVIUGnaGmzwdMTrrYHA69WWjPIiDreHxFx797+ dMmZJxFPxXBKK6DqmPP+biG+nSb+ujcdwK+ZqaiI1vDdLJxxm8lzedngib4IXqM71y5U NAeBO51FCjW2OVIYJggHMPpN7nJWOdFL4jZYkkE0cG6vebw8Ich4pLmFli6UxRqBFs4N osLGV/5vIUWTeFRn86o4nfLkF6lVvZKoRhWUIIOqBr9xmWuB1nl9MbK/c5oCmbNApgjg AA4A== X-Gm-Message-State: AA+aEWYKdkyuELplYWJdPqUDYg2BEF4Cwc9b7LPirgOvnIH4QTsLnzkq ljV+cMlxdFbvP7jkpEwGECGSpg== X-Google-Smtp-Source: AFSGD/WRt0GCO2N0Eq80KVdPts4tVqvhZvJ0geEWG4fNMqCG8FPDzsxAAvlDvgr4UDOO5ZPqzQsYjg== X-Received: by 2002:a7b:c399:: with SMTP id s25mr9105781wmj.90.1545259480069; Wed, 19 Dec 2018 14:44:40 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:39 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , Wang YanQing Subject: [PATH bpf-next 05/13] x32: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:12 -0500 Message-Id: <1545259460-13376-6-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on x32. Cc: Wang YanQing Signed-off-by: Jiong Wang --- arch/x86/net/bpf_jit_comp32.c | 46 ++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c index 8f6cc71..9f08918 100644 --- a/arch/x86/net/bpf_jit_comp32.c +++ b/arch/x86/net/bpf_jit_comp32.c @@ -2077,24 +2077,33 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 dreg_hi = dstk ? IA32_EDX : dst_hi; u8 sreg_lo = sstk ? IA32_ECX : src_lo; u8 sreg_hi = sstk ? IA32_EBX : src_hi; + bool is_jmp64 = !imm32; if (dstk) { EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(dst_lo)); - EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX), - STACK_VAR(dst_hi)); + if (is_jmp64) + EMIT3(0x8B, + add_2reg(0x40, IA32_EBP, + IA32_EDX), + STACK_VAR(dst_hi)); } if (sstk) { EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_ECX), STACK_VAR(src_lo)); - EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EBX), - STACK_VAR(src_hi)); + if (is_jmp64) + EMIT3(0x8B, + add_2reg(0x40, IA32_EBP, + IA32_EBX), + STACK_VAR(src_hi)); } - /* cmp dreg_hi,sreg_hi */ - EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); - EMIT2(IA32_JNE, 2); + if (is_jmp64) { + /* cmp dreg_hi,sreg_hi */ + EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); + EMIT2(IA32_JNE, 2); + } /* cmp dreg_lo,sreg_lo */ EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); goto emit_cond_jmp; @@ -2169,23 +2178,28 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 dreg_hi = dstk ? IA32_EDX : dst_hi; u8 sreg_lo = IA32_ECX; u8 sreg_hi = IA32_EBX; + bool is_jmp64 = !insn->src_reg; if (dstk) { EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(dst_lo)); - EMIT3(0x8B, add_2reg(0x40, IA32_EBP, IA32_EDX), - STACK_VAR(dst_hi)); + if (is_jmp64) + EMIT3(0x8B, + add_2reg(0x40, IA32_EBP, + IA32_EDX), + STACK_VAR(dst_hi)); } - hi = imm32 & (1<<31) ? (u32)~0 : 0; /* mov ecx,imm32 */ EMIT2_off32(0xC7, add_1reg(0xC0, IA32_ECX), imm32); - /* mov ebx,imm32 */ - EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EBX), hi); - - /* cmp dreg_hi,sreg_hi */ - EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); - EMIT2(IA32_JNE, 2); + if (is_jmp64) { + hi = imm32 & (1 << 31) ? (u32)~0 : 0; + /* mov ebx,imm32 */ + EMIT2_off32(0xC7, add_1reg(0xC0, IA32_EBX), hi); + /* cmp dreg_hi,sreg_hi */ + EMIT2(0x39, add_2reg(0xC0, dreg_hi, sreg_hi)); + EMIT2(IA32_JNE, 2); + } /* cmp dreg_lo,sreg_lo */ EMIT2(0x39, add_2reg(0xC0, dreg_lo, sreg_lo)); From patchwork Wed Dec 19 22:44:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016378 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="UONMQSQG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43KqhY5wBCz9sCh for ; Thu, 20 Dec 2018 09:44:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729283AbeLSWoo (ORCPT ); Wed, 19 Dec 2018 17:44:44 -0500 Received: from mail-wm1-f43.google.com ([209.85.128.43]:36109 "EHLO mail-wm1-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729214AbeLSWon (ORCPT ); Wed, 19 Dec 2018 17:44:43 -0500 Received: by mail-wm1-f43.google.com with SMTP id p6so107990wmc.1 for ; Wed, 19 Dec 2018 14:44:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=U6/hGzsZ9lZLQ7Z1rr/Js8DkkwIFM/V2UOKjQSZHxuQ=; b=UONMQSQGwyvM2rVD1cZN7cpcBxqtwNbCGewR1bvxIBanaYkuYPTJGAGuZyv30QW9t7 KY9+i6MvZw4Iox65w7+l0iPO96YnJQpKBWebIMrmO5y1DiVKLp7VmKTnCgx6VVu8Gu3Q d7q7Zzj7nUGhH9XaEptYK46NiUIEG6NQA3xlaSax3cjGdQV57rjekulYqWnd7nLblM/L asLbxhiwM84ks9kDQtWOq7btGAAwT3ghn7GuTjlhaTgl22r2CwVmlnaX+USrIneatycf wFRlNE6KHPe3hmH3UGBthInD0uWnj9rAR/BWuOl+e+Y2594TV5AJ8SkZp+FeUroCcNbU oSbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=U6/hGzsZ9lZLQ7Z1rr/Js8DkkwIFM/V2UOKjQSZHxuQ=; b=MNA34tYNgTU2/Liwbrdq+apLy1LQU9Xx2Nyqo0hpV6Gd9oQXqlFnzEqFPx1GDLV/+B f7/CJ/Ju1jSPdyj87sdU6Gk/rNR0coUwJMwcUp5XXww3R/Bsx5GHSuNsPUzhMgcAOn4J ohOjibdcu08JICK/6K4SQCxpZv8QONzKClxQ7f2paCrPnp7IueBIqP0b4mX/Jhf0IjLM hrQJ/F1eHDh/rh6ua85tyTVnWUNtcpD+ewM38yfYoq174XcKZlLw2Dj/VodH3wjDPQoG 8sgMsJToIz/GrMdNsu6j6ZHezBDpkpov1zbEQdmGN6nIPU2ID9XrCsTRQakex8YoCKqp D6PQ== X-Gm-Message-State: AA+aEWbB0Unb5RM0PVqHrRBoKr9mGT4rkOcepRays50eFhAqe6l4Dd9Q U1POmmVoHdAHco4zKxhZxzvKiQ== X-Google-Smtp-Source: AFSGD/Xa57U6qWgYGRybrNbz3iFZM3vR78EdL6WDFyfYNxPLoNuYuRjlEtGjKmtNWzmJwVF6CRyZqg== X-Received: by 2002:a1c:f605:: with SMTP id w5mr9173807wmc.116.1545259481104; Wed, 19 Dec 2018 14:44:41 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:40 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , Zi Shen Lim Subject: [PATH bpf-next 06/13] arm64: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:13 -0500 Message-Id: <1545259460-13376-7-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on arm64. Cc: Daniel Borkmann Cc: Alexei Starovoitov Cc: Zi Shen Lim Signed-off-by: Jiong Wang --- arch/arm64/net/bpf_jit_comp.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index 1542df0..9ed73af 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c @@ -559,7 +559,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, case BPF_JMP | BPF_JSLT | BPF_X: case BPF_JMP | BPF_JSGE | BPF_X: case BPF_JMP | BPF_JSLE | BPF_X: - emit(A64_CMP(1, dst, src), ctx); + emit(A64_CMP(!!imm, dst, src), ctx); emit_cond_jmp: jmp_offset = bpf2a64_offset(i + off, i, ctx); check_imm19(jmp_offset); @@ -614,9 +614,13 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, case BPF_JMP | BPF_JSLT | BPF_K: case BPF_JMP | BPF_JSGE | BPF_K: case BPF_JMP | BPF_JSLE | BPF_K: - emit_a64_mov_i(1, tmp, imm, ctx); - emit(A64_CMP(1, dst, tmp), ctx); + { + bool is_jmp32 = !!insn->src_reg; + + emit_a64_mov_i(is_jmp32, tmp, imm, ctx); + emit(A64_CMP(is_jmp32, dst, tmp), ctx); goto emit_cond_jmp; + } case BPF_JMP | BPF_JSET | BPF_K: emit_a64_mov_i(1, tmp, imm, ctx); emit(A64_TST(1, dst, tmp), ctx); From patchwork Wed Dec 19 22:44:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016386 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="2A4xCsWh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhv6dbXz9sCh for ; Thu, 20 Dec 2018 09:45:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729542AbeLSWpD (ORCPT ); Wed, 19 Dec 2018 17:45:03 -0500 Received: from mail-wm1-f54.google.com ([209.85.128.54]:37563 "EHLO mail-wm1-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728170AbeLSWoo (ORCPT ); Wed, 19 Dec 2018 17:44:44 -0500 Received: by mail-wm1-f54.google.com with SMTP id g67so102987wmd.2 for ; Wed, 19 Dec 2018 14:44:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Tn250/SYOFGlQViTP9EWKTv1xjUCd3UDNDXhs6xFjSs=; b=2A4xCsWhIJ46mBVZEx95gGX5+Dhb7nTRouLDOgwLy/2VYYsfq5Ow1mP0YohtW2oHk7 OhiZlvEXRA+lsTdozciCmfzsBtFVU/cj5nI3Fy8438t9BMPQwS0VqXNvGI2g+I39UoAh wgLwknfrmiJyNGHfyfEmvbx4jGld1zgk1mw7OeiWzD+odQoXt75LxizWOsvfnxYjY/fg nfYCMnGU++jcMRTUqFxxcg7whzcl06gDhozMgvlBndL6BPXANI2GsG7lSeQEpoytz3Rt Ckz/SP9zV6pPxbUEC9p4O3DTzwUe03czgQKxIuRdmFpmnfOf+eYKe5CxCe5j90hSrkZM s1Gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Tn250/SYOFGlQViTP9EWKTv1xjUCd3UDNDXhs6xFjSs=; b=Y+g3DKhyNTNAKdaSWddQETOeUadk6HeSS1odd2UXijmMiCv3rwFCFDPu25QLc++GpQ mnLDWmK505dXUadCktv2h3eGb8O8boLsawvyptei6+wqXLfJ9l77Iop07sRJ8lwiPHm3 +iZx8hT5kEJ30EEIAWSxSXNPoa6UUOHK1v0PnMifSfhk/jJ5akBV1LvCFZzYBGkHffPi BU3CiDVw2iLswSJg6a57sz5lPEZLjJcTD7mLUckt/+VNSUzrA6T3K5yitizX+3NeUMmb hHzVhXS+UVTReL1tea9K2f+sOmYo9bC1hF+QcaDs18aetQ1M2+tcgOPfk1TUAK2sgqcz JNFA== X-Gm-Message-State: AA+aEWZAISUAaY7YRcgAPAHGKVwV0agWKSB/BXzqhxYzvBLyD3xAIjXw GwG0SVTR7lQtJmJlV4cb3gGzCw== X-Google-Smtp-Source: AFSGD/VCHg1MdvvZgpflQq6XLat5gtOeMgdXjwZ5wxoqddCtH7M1edJcCLcIRjVhOXVW2RnlYPlZjQ== X-Received: by 2002:a1c:af89:: with SMTP id y131mr8619715wme.105.1545259481965; Wed, 19 Dec 2018 14:44:41 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:41 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , Shubham Bansal Subject: [PATH bpf-next 07/13] arm: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:14 -0500 Message-Id: <1545259460-13376-8-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on arm. Cc: Shubham Bansal Signed-off-by: Jiong Wang --- arch/arm/net/bpf_jit_32.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 25b3ee8..e9830a7 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c @@ -1083,7 +1083,8 @@ static inline void emit_ldx_r(const s8 dst[], const s8 src, /* Arithmatic Operation */ static inline void emit_ar_r(const u8 rd, const u8 rt, const u8 rm, - const u8 rn, struct jit_ctx *ctx, u8 op) { + const u8 rn, struct jit_ctx *ctx, u8 op, + bool is_jmp64) { switch (op) { case BPF_JSET: emit(ARM_AND_R(ARM_IP, rt, rn), ctx); @@ -1096,18 +1097,25 @@ static inline void emit_ar_r(const u8 rd, const u8 rt, const u8 rm, case BPF_JGE: case BPF_JLE: case BPF_JLT: - emit(ARM_CMP_R(rd, rm), ctx); - _emit(ARM_COND_EQ, ARM_CMP_R(rt, rn), ctx); + if (is_jmp64) { + emit(ARM_CMP_R(rd, rm), ctx); + /* Only compare low halve if high halve are equal. */ + _emit(ARM_COND_EQ, ARM_CMP_R(rt, rn), ctx); + } else { + emit(ARM_CMP_R(rt, rn), ctx); + } break; case BPF_JSLE: case BPF_JSGT: emit(ARM_CMP_R(rn, rt), ctx); - emit(ARM_SBCS_R(ARM_IP, rm, rd), ctx); + if (is_jmp64) + emit(ARM_SBCS_R(ARM_IP, rm, rd), ctx); break; case BPF_JSLT: case BPF_JSGE: emit(ARM_CMP_R(rt, rn), ctx); - emit(ARM_SBCS_R(ARM_IP, rd, rm), ctx); + if (is_jmp64) + emit(ARM_SBCS_R(ARM_IP, rd, rm), ctx); break; } } @@ -1326,6 +1334,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) const s8 *rd, *rs; s8 rd_lo, rt, rm, rn; s32 jmp_offset; + bool is_jmp64; #define check_imm(bits, imm) do { \ if ((imm) >= (1 << ((bits) - 1)) || \ @@ -1615,6 +1624,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) case BPF_JMP | BPF_JLT | BPF_X: case BPF_JMP | BPF_JSLT | BPF_X: case BPF_JMP | BPF_JSLE | BPF_X: + is_jmp64 = !imm; /* Setup source registers */ rm = arm_bpf_get_reg32(src_hi, tmp2[0], ctx); rn = arm_bpf_get_reg32(src_lo, tmp2[1], ctx); @@ -1641,6 +1651,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) case BPF_JMP | BPF_JLE | BPF_K: case BPF_JMP | BPF_JSLT | BPF_K: case BPF_JMP | BPF_JSLE | BPF_K: + is_jmp64 = !insn->src_reg; if (off == 0) break; rm = tmp2[0]; @@ -1652,7 +1663,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) rd = arm_bpf_get_reg64(dst, tmp, ctx); /* Check for the condition */ - emit_ar_r(rd[0], rd[1], rm, rn, ctx, BPF_OP(code)); + emit_ar_r(rd[0], rd[1], rm, rn, ctx, BPF_OP(code), is_jmp64); /* Setup JUMP instruction */ jmp_offset = bpf2a32_offset(i+off, i, ctx); From patchwork Wed Dec 19 22:44:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016384 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="ZZ+anTGj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhr0sTDz9sCh for ; Thu, 20 Dec 2018 09:45:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729426AbeLSWow (ORCPT ); Wed, 19 Dec 2018 17:44:52 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:52622 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729252AbeLSWop (ORCPT ); Wed, 19 Dec 2018 17:44:45 -0500 Received: by mail-wm1-f68.google.com with SMTP id m1so92922wml.2 for ; Wed, 19 Dec 2018 14:44:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=x76pUwRRBAN0HQDUaEMMpzO0xhGG8KSqv4EH2zgFQ/k=; b=ZZ+anTGjdqGy1MDtb+gmyOzG02mHXYoJ6YXSdlnAhlkQQoaFnZ1MF6+cyY2SLbv7v0 CnAbpqPeMeNQO09Z8MABF7Zk3agrKtkDq41rdXtB4kAbF4d91D2hNDiyUFoFPxE//Pk6 JLWNJqQHnEWHjyoZjX0rfeEmTf2xIuFc90qSU+NfvqDqS4KySjHbUvfyCYVSQpiB9LPU PPL7nE3Ncbaw1mkDbkOcH88cWeNrEI6BIT5Ks0QSuzV/y1y/0H/n6yMfT5NOHSvZiEdS mncY1vORUDv/PyDSEJdlmoSzqSFR2xo9MbUtTgGx5NNMkBiHO3ibwKWXlGkKehxCjrIX g5oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=x76pUwRRBAN0HQDUaEMMpzO0xhGG8KSqv4EH2zgFQ/k=; b=rtzHZqxk7uTZgj9jPpHbsuIPicBBV2mGLmhj7DHyKZ9OnvFUY8Z7neSZDxrFmtEZS+ tzsJUWeso1NLCIHsrZRxYMe9bupAaoDGNVIas9pl04GYM8vs0tB5EVKaw5NdnhjZk51k yqNf4Q5h6VpuK0wS6lhWH/vcTXrsxihxTPXoEBYL9mIh2bmhj1Rjjm9+ECOIfusESNKq vAEHrBVTFvSLNvRH2vsFZAhk+4+btQ+/57W9JRwS/Pv2c/ADymdgSkG0WOXvTqM9Q1dx CrUPdoUYtAW/TNJda0XbrLJLe+xkqC8LBlrUc7gvcqwVhHIu429ewOhKrNlqpgTuYq6D emyQ== X-Gm-Message-State: AA+aEWYlztnI86dizwhMncLRYcWs9VieZBrHZv2QjZ6QId43DacPr1/E R3YfF7UWtEwPhF2QcCUa+pXaDA== X-Google-Smtp-Source: AFSGD/WOyut2G7bXbpkFfr+h8av1Znjl+X89jbXOh4/Juf957dqWMeMIj85cxtWwmq9YAMR7u59+7A== X-Received: by 2002:a1c:e18a:: with SMTP id y132mr9436232wmg.48.1545259483237; Wed, 19 Dec 2018 14:44:43 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:42 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , "Naveen N . Rao" , Sandipan Das Subject: [PATH bpf-next 08/13] ppc: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:15 -0500 Message-Id: <1545259460-13376-9-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on ppc. Cc: Naveen N. Rao Cc: Sandipan Das Signed-off-by: Jiong Wang --- arch/powerpc/net/bpf_jit_comp64.c | 50 +++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c index 7ce57657..4a9d759 100644 --- a/arch/powerpc/net/bpf_jit_comp64.c +++ b/arch/powerpc/net/bpf_jit_comp64.c @@ -810,14 +810,20 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, case BPF_JMP | BPF_JEQ | BPF_X: case BPF_JMP | BPF_JNE | BPF_X: /* unsigned comparison */ - PPC_CMPLD(dst_reg, src_reg); + if (!!imm) /* jmp32 */ + PPC_CMPLW(dst_reg, src_reg); + else + PPC_CMPLD(dst_reg, src_reg); break; case BPF_JMP | BPF_JSGT | BPF_X: case BPF_JMP | BPF_JSLT | BPF_X: case BPF_JMP | BPF_JSGE | BPF_X: case BPF_JMP | BPF_JSLE | BPF_X: /* signed comparison */ - PPC_CMPD(dst_reg, src_reg); + if (!!imm) /* jmp32 */ + PPC_CMPW(dst_reg, src_reg); + else + PPC_CMPD(dst_reg, src_reg); break; case BPF_JMP | BPF_JSET | BPF_X: PPC_AND_DOT(b2p[TMP_REG_1], dst_reg, src_reg); @@ -828,34 +834,58 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, case BPF_JMP | BPF_JLT | BPF_K: case BPF_JMP | BPF_JGE | BPF_K: case BPF_JMP | BPF_JLE | BPF_K: + { + bool is_jmp32 = !!insn[i].src_reg; + /* * Need sign-extended load, so only positive * values can be used as imm in cmpldi */ - if (imm >= 0 && imm < 32768) - PPC_CMPLDI(dst_reg, imm); - else { + if (imm >= 0 && imm < 32768) { + if (is_jmp32) + PPC_CMPLWI(dst_reg, imm); + else + PPC_CMPLDI(dst_reg, imm); + } else { /* sign-extending load */ PPC_LI32(b2p[TMP_REG_1], imm); /* ... but unsigned comparison */ - PPC_CMPLD(dst_reg, b2p[TMP_REG_1]); + if (is_jmp32) + PPC_CMPLW(dst_reg, + b2p[TMP_REG_1]); + else + PPC_CMPLD(dst_reg, + b2p[TMP_REG_1]); } break; + } case BPF_JMP | BPF_JSGT | BPF_K: case BPF_JMP | BPF_JSLT | BPF_K: case BPF_JMP | BPF_JSGE | BPF_K: case BPF_JMP | BPF_JSLE | BPF_K: + { + bool is_jmp32 = !!insn[i].src_reg; + /* * signed comparison, so any 16-bit value * can be used in cmpdi */ - if (imm >= -32768 && imm < 32768) - PPC_CMPDI(dst_reg, imm); - else { + if (imm >= -32768 && imm < 32768) { + if (is_jmp32) + PPC_CMPWI(dst_reg, imm); + else + PPC_CMPDI(dst_reg, imm); + } else { PPC_LI32(b2p[TMP_REG_1], imm); - PPC_CMPD(dst_reg, b2p[TMP_REG_1]); + if (is_jmp32) + PPC_CMPW(dst_reg, + b2p[TMP_REG_1]); + else + PPC_CMPD(dst_reg, + b2p[TMP_REG_1]); } break; + } case BPF_JMP | BPF_JSET | BPF_K: /* andi does not sign-extend the immediate */ if (imm >= 0 && imm < 32768) From patchwork Wed Dec 19 22:44:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016380 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Q5g99RkU"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhd513nz9sCh for ; Thu, 20 Dec 2018 09:44:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729363AbeLSWos (ORCPT ); Wed, 19 Dec 2018 17:44:48 -0500 Received: from mail-wm1-f46.google.com ([209.85.128.46]:36116 "EHLO mail-wm1-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729287AbeLSWoq (ORCPT ); Wed, 19 Dec 2018 17:44:46 -0500 Received: by mail-wm1-f46.google.com with SMTP id p6so108077wmc.1 for ; Wed, 19 Dec 2018 14:44:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HVFDota1zkwqjKWBH4JQPaJlz9neHe1/UpjWf3yzUvQ=; b=Q5g99RkU24ECghvLNBHNCxoTNzNQwRXnp8hwQQfhvefSqHjdLxADnHzwozZ73xGevI 3XjVXUrnOXIeI1rWgiUcjcrr664/G5xEKm3GBydn+YeULL5OYzSam1inYTTeRDsAKkpg BMPvmDfjKnXCssu72v4JdZcc+uAOjPT2cvkWjvNzlZbSmMmh4VCK2JfIdBOwN+G2kZxR TW++2BXHOm6fUEyvducRdcw6STqIhSYwt8ZFwx/GrxJidNzXkWH4Otjj6S+qUr+1zRWe Eq/VWFTdv2qs4zqQeNhNDhLI/Gnklob2UDnuf3TTPeNP7I+LkH5prXCB0JXWllQTkHKA ai3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HVFDota1zkwqjKWBH4JQPaJlz9neHe1/UpjWf3yzUvQ=; b=uLimhJmqkirLIs4qY9PiH1CQlQPy+3RLzYiq1lvg3VKTFb3UWCxxYjsKWhm8MymvJ0 IaZWfVPqJQO5lPWZrPHRkZ7SMlsJyr45iro5/5UVxzFXD3eS2Bnvq8iQseKeDPpbz0aw FyPpM44YQBrsR182S6CalCb2yMPR87xm7jeiVZc0qc7YtPnSRDxFBS6NVIJImSX1x1GH USeShoowfaDgp43roTQvy1ZXtw17u+RBEov2i3Tuqeo/uP7aTyr+hzH5bb1z9E+BXq7T wTlDfDbOppqarjJlnlXpUxQKyOd7hRukLwTEG7oPKYsOL3MplMarlwrGEaE6PR4a951W cRhw== X-Gm-Message-State: AA+aEWaCjEo7PmfwBiyMr3WvMj/+1ttTRR9LhvWdub80VAhiDM14NKSO oLN1K0Y9/qDAr0mkvV6P4ZJYdg== X-Google-Smtp-Source: AFSGD/VSO1Mi/IYPP2njOywHkSa1tcu3qkcshsOlbFDqpL/dJ7Xu8vnoTEeRUj0t4DLlK5GTAop2Cg== X-Received: by 2002:a1c:6e06:: with SMTP id j6mr9100316wmc.3.1545259484215; Wed, 19 Dec 2018 14:44:44 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:43 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , Martin Schwidefsky , Heiko Carstens Subject: [PATH bpf-next 09/13] s390: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:16 -0500 Message-Id: <1545259460-13376-10-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on s390. Cc: Martin Schwidefsky Cc: Heiko Carstens Signed-off-by: Jiong Wang --- arch/s390/net/bpf_jit_comp.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 3ff758e..c7101e5 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c @@ -1186,21 +1186,25 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i /* lgfi %w1,imm (load sign extend imm) */ EMIT6_IMM(0xc0010000, REG_W1, imm); /* cgrj %dst,%w1,mask,off */ - EMIT6_PCREL(0xec000000, 0x0064, dst_reg, REG_W1, i, off, mask); + EMIT6_PCREL(0xec000000, src_reg ? 0x0076 : 0x0064, + dst_reg, REG_W1, i, off, mask); break; branch_ku: /* lgfi %w1,imm (load sign extend imm) */ EMIT6_IMM(0xc0010000, REG_W1, imm); /* clgrj %dst,%w1,mask,off */ - EMIT6_PCREL(0xec000000, 0x0065, dst_reg, REG_W1, i, off, mask); + EMIT6_PCREL(0xec000000, src_reg ? 0x0077 : 0x0065, + dst_reg, REG_W1, i, off, mask); break; branch_xs: /* cgrj %dst,%src,mask,off */ - EMIT6_PCREL(0xec000000, 0x0064, dst_reg, src_reg, i, off, mask); + EMIT6_PCREL(0xec000000, imm ? 0x0076 : 0x0064, + dst_reg, src_reg, i, off, mask); break; branch_xu: /* clgrj %dst,%src,mask,off */ - EMIT6_PCREL(0xec000000, 0x0065, dst_reg, src_reg, i, off, mask); + EMIT6_PCREL(0xec000000, imm ? 0x0077 : 0x0065, + dst_reg, src_reg, i, off, mask); break; branch_oc: /* brc mask,jmp_off (branch instruction needs 4 bytes) */ From patchwork Wed Dec 19 22:44:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016385 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="hPB5tqlQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhs3nPzz9sCh for ; Thu, 20 Dec 2018 09:45:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729406AbeLSWov (ORCPT ); Wed, 19 Dec 2018 17:44:51 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:38550 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729333AbeLSWot (ORCPT ); Wed, 19 Dec 2018 17:44:49 -0500 Received: by mail-wm1-f67.google.com with SMTP id m22so100511wml.3 for ; Wed, 19 Dec 2018 14:44:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0RsG2BL58MnIuDNlvYXnxyRvph5/x0H8S0mIun9wwVA=; b=hPB5tqlQxIEiUM0oxVdDnnI6tOpZcTZ+xZ23+NCRotroUMhgAPg+3CLZuiSX+5MWa1 IA+9wDuKC8tVhBDTGzQYrwnHcvhrR3qZOpUM2u6A8eN7albrVwrpdZuaPw6CezAwGsYr 4DQUIKX0r8MbbMbXZLULS6aC2YVMKALvoUH2zWEVl+2oFtJqN6lXjtdv2eKcx7FuOmdt TULLZ3boVLp7/kCCs653zVZwcbM1fJlC5Zd2Yfwno2wsQaV1LRHmyK0ai66w0bd5xEnt tDsQ/yCfY1blpKLwjCLOQPAmPIq68itU/rqVnQp/NqLeJJKLXLPeZUp1a5/V8mJpCAol +67Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0RsG2BL58MnIuDNlvYXnxyRvph5/x0H8S0mIun9wwVA=; b=W5EWsDXYOU82j4qH1WEoYWEVNymjDlBwxKOSZ3M/e5E2MzE2i9iPt8NveVZTSn0H9V j6K2u3ot0l+zxN2fz0gPe1Zyh6Jp1Ho/JYNVkG2RQyr9Q27ZAuILZRIBakoiUIePvyE3 tqFjIdn6t3c9faKm6wpcUtFUl5G26qgZ4BcYg4tcjIwv+daRxS7Ee0qdQ4f86HoIfoRp 6AkLbIjhye9HX+gWqDxWpTLqU1Oce/xcsvUdWfzw9kVgHM0exAyfLL3+5aP3cZo+7nJ2 EQc2WsMt8l+NU69olUUtoEuXYHbOtk8VJioIFIgjZWK71G45S6AcpcERgpHVBcffALdZ 5yTA== X-Gm-Message-State: AA+aEWZ9+zWCKKaKCIQvlpr5vGaBcupTaCamweKVD3GlV3GQwirFBaUb PJ0Se9e6mp1we0rFjXDu7mXi/w== X-Google-Smtp-Source: AFSGD/UrF4aDw7sAJunOCrRVRMmGZ9YZqIc/sqGIrJM/dg2eSsEvY4HDHcPQL/2DTopdcAWdSvVvEA== X-Received: by 2002:a1c:b94b:: with SMTP id j72mr8798973wmf.11.1545259485671; Wed, 19 Dec 2018 14:44:45 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:44 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang , Jakub Kicinski Subject: [PATH bpf-next 10/13] nfp: bpf: implement jitting of JMP32 Date: Wed, 19 Dec 2018 17:44:17 -0500 Message-Id: <1545259460-13376-11-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch implements code-gen for new JMP32 instructions on NFP. Cc: Jakub Kicinski Signed-off-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 69 ++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 662cbc2..6afb11e 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -1334,8 +1334,11 @@ wrp_test_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, wrp_test_reg_one(nfp_prog, insn->dst_reg * 2, alu_op, insn->src_reg * 2, br_mask, insn->off); - wrp_test_reg_one(nfp_prog, insn->dst_reg * 2 + 1, alu_op, - insn->src_reg * 2 + 1, br_mask, insn->off); + /* JMP64 */ + if (!insn->imm) { + wrp_test_reg_one(nfp_prog, insn->dst_reg * 2 + 1, alu_op, + insn->src_reg * 2 + 1, br_mask, insn->off); + } return 0; } @@ -1390,13 +1393,16 @@ static int cmp_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) else emit_alu(nfp_prog, reg_none(), tmp_reg, alu_op, reg_a(reg)); - tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog)); - if (!code->swap) - emit_alu(nfp_prog, reg_none(), - reg_a(reg + 1), carry_op, tmp_reg); - else - emit_alu(nfp_prog, reg_none(), - tmp_reg, carry_op, reg_a(reg + 1)); + /* JMP64 */ + if (!insn->src_reg) { + tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog)); + if (!code->swap) + emit_alu(nfp_prog, reg_none(), + reg_a(reg + 1), carry_op, tmp_reg); + else + emit_alu(nfp_prog, reg_none(), + tmp_reg, carry_op, reg_a(reg + 1)); + } emit_br(nfp_prog, code->br_mask, insn->off, 0); @@ -1423,8 +1429,10 @@ static int cmp_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) } emit_alu(nfp_prog, reg_none(), reg_a(areg), ALU_OP_SUB, reg_b(breg)); - emit_alu(nfp_prog, reg_none(), - reg_a(areg + 1), ALU_OP_SUB_C, reg_b(breg + 1)); + /* JMP64 */ + if (!insn->imm) + emit_alu(nfp_prog, reg_none(), + reg_a(areg + 1), ALU_OP_SUB_C, reg_b(breg + 1)); emit_br(nfp_prog, code->br_mask, insn->off, 0); return 0; @@ -3023,7 +3031,8 @@ static int jeq_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { const struct bpf_insn *insn = &meta->insn; u64 imm = insn->imm; /* sign extend */ - swreg or1, or2, tmp_reg; + swreg or1, or2, or1b, tmp_reg; + bool alu_flag_set = false; or1 = reg_a(insn->dst_reg * 2); or2 = reg_b(insn->dst_reg * 2 + 1); @@ -3033,6 +3042,17 @@ static int jeq_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) emit_alu(nfp_prog, imm_a(nfp_prog), reg_a(insn->dst_reg * 2), ALU_OP_XOR, tmp_reg); or1 = imm_a(nfp_prog); + alu_flag_set = true; + } + + /* JMP32 */ + if (insn->src_reg) { + if (!alu_flag_set) { + or1b = reg_b(insn->dst_reg * 2); + emit_alu(nfp_prog, reg_none(), reg_none(), ALU_OP_NONE, + or1b); + } + goto jeq_imm_br_out; } if (imm >> 32) { @@ -3043,6 +3063,7 @@ static int jeq_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) } emit_alu(nfp_prog, reg_none(), or1, ALU_OP_OR, or2); +jeq_imm_br_out: emit_br(nfp_prog, BR_BEQ, insn->off, 0); return 0; @@ -3080,11 +3101,16 @@ static int jne_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) { const struct bpf_insn *insn = &meta->insn; u64 imm = insn->imm; /* sign extend */ + bool is_jmp32 = !!insn->src_reg; swreg tmp_reg; if (!imm) { - emit_alu(nfp_prog, reg_none(), reg_a(insn->dst_reg * 2), - ALU_OP_OR, reg_b(insn->dst_reg * 2 + 1)); + if (is_jmp32) + emit_alu(nfp_prog, reg_none(), reg_none(), ALU_OP_NONE, + reg_b(insn->dst_reg * 2)); + else + emit_alu(nfp_prog, reg_none(), reg_a(insn->dst_reg * 2), + ALU_OP_OR, reg_b(insn->dst_reg * 2 + 1)); emit_br(nfp_prog, BR_BNE, insn->off, 0); return 0; } @@ -3094,6 +3120,9 @@ static int jne_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) reg_a(insn->dst_reg * 2), ALU_OP_XOR, tmp_reg); emit_br(nfp_prog, BR_BNE, insn->off, 0); + if (is_jmp32) + return 0; + tmp_reg = ur_load_imm_any(nfp_prog, imm >> 32, imm_b(nfp_prog)); emit_alu(nfp_prog, reg_none(), reg_a(insn->dst_reg * 2 + 1), ALU_OP_XOR, tmp_reg); @@ -3108,10 +3137,14 @@ static int jeq_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) emit_alu(nfp_prog, imm_a(nfp_prog), reg_a(insn->dst_reg * 2), ALU_OP_XOR, reg_b(insn->src_reg * 2)); - emit_alu(nfp_prog, imm_b(nfp_prog), reg_a(insn->dst_reg * 2 + 1), - ALU_OP_XOR, reg_b(insn->src_reg * 2 + 1)); - emit_alu(nfp_prog, reg_none(), - imm_a(nfp_prog), ALU_OP_OR, imm_b(nfp_prog)); + /* JMP64 */ + if (!insn->imm) { + emit_alu(nfp_prog, imm_b(nfp_prog), + reg_a(insn->dst_reg * 2 + 1), ALU_OP_XOR, + reg_b(insn->src_reg * 2 + 1)); + emit_alu(nfp_prog, reg_none(), imm_a(nfp_prog), ALU_OP_OR, + imm_b(nfp_prog)); + } emit_br(nfp_prog, BR_BEQ, insn->off, 0); return 0; From patchwork Wed Dec 19 22:44:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016383 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="DCQ07vy9"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhn4Tr0z9sCh for ; Thu, 20 Dec 2018 09:44:57 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729523AbeLSWoy (ORCPT ); Wed, 19 Dec 2018 17:44:54 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:52623 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729287AbeLSWov (ORCPT ); Wed, 19 Dec 2018 17:44:51 -0500 Received: by mail-wm1-f65.google.com with SMTP id m1so93009wml.2 for ; Wed, 19 Dec 2018 14:44:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=afJHjNb2bccmUKwKYQg1kOeRJy8xQ0FZ8X54NZLQO3c=; b=DCQ07vy97j4eY8cXcxXOd1dh3WNleDHn4YD+ATC1HaQi5+cOrjeU0QcRHbkKdUCfzI h9XCbkvWK/15liPvwFfLf+Fo55ap4JbvjLh/iFFoNBVPLGqBFuVMAJ1uZjQMjXV11JZ1 tRuZ3O9USwLW6OUc47ZqFuMnKxGvAPYhNEPibTgD6zhRUyLsgXovPCGt7XL8H8W4GZdV vETZo/g8VEo+mVDh8QXuHwWzD/dAdkdqsccnNhTBQX8EmgAWNv4m9rP11pEdYcriJWq7 MekGlGlvwZOOPK5BT+cOXWXPdO4ew0XYS+tmzioUHxzT96LsYIugysKFIJ0Y4NNxabPQ vs5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=afJHjNb2bccmUKwKYQg1kOeRJy8xQ0FZ8X54NZLQO3c=; b=eyfw/kRtiIQqG0jvQGlTeWwpwdaKzzc+qCAyITnmbv4cv/+zAp/thLPByNUA7k65kx o8/IPqLaH4A5BfVQLoYnzQtnvl27bN1HvoXw390O6pjCfrTSFiOqZqYJDhuHpy3oJbpD ffU44WD4niWBEd2VkBRCjU70XTbliymUpnA3RznZa7hLTQMOFn3E0LkCk2AhzWq32PZi wYZm5ZLxDl3kumtPgtAmjdZ2jN/9Pc6Lz2x8iC3/KcPBankpRctrTuYX7NDY/z+sZbGj z1DmhwVxACKfQrcg2krqeBsBg0vng4ELvEZd8lE+8f104PAdZ0ooJUu/d2mPCwUj1DG3 NVzQ== X-Gm-Message-State: AA+aEWYufk7QbR3tyKnA65+n8ri0y+03f764rGv+Gi+xWLuqSAsIIHeh VKlKQ8/0Dp37vNH8bY068J1LmQ== X-Google-Smtp-Source: AFSGD/Uwl2/P8G1MViBVsIbojAikHQibz6vIOhWuAG6HEmji25SHduc++H3WPBwBTWSrbHCBqf5CXw== X-Received: by 2002:a1c:8851:: with SMTP id k78mr8999460wmd.51.1545259486879; Wed, 19 Dec 2018 14:44:46 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:45 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 11/13] bpf: verifier support JMP32 Date: Wed, 19 Dec 2018 17:44:18 -0500 Message-Id: <1545259460-13376-12-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Verifier is doing some runtime optimizations based on the extra info conditional jump instruction could offer, especially when the comparison is between constant and register for which case the value range of the register could be improved. is_branch_taken/reg_set_min_max/reg_set_min_max_inv are the three functions that needs updating. There are some other conditional jump related optimizations but they are with pointer types comparison which JMP32 won't be generated for. Signed-off-by: Jiong Wang --- kernel/bpf/verifier.c | 178 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 137 insertions(+), 41 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index e0e77ff..3123c91 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -3919,7 +3919,7 @@ static int is_branch_taken(struct bpf_reg_state *reg, u64 val, u8 opcode) */ static void reg_set_min_max(struct bpf_reg_state *true_reg, struct bpf_reg_state *false_reg, u64 val, - u8 opcode) + u8 opcode, bool is_jmp32) { /* If the dst_reg is a pointer, we can't learn anything about its * variable offset from the compare (unless src_reg were a pointer into @@ -3935,45 +3935,69 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg, /* If this is false then we know nothing Jon Snow, but if it is * true then we know for sure. */ - __mark_reg_known(true_reg, val); + if (is_jmp32) + true_reg->var_off = tnum_or(true_reg->var_off, + tnum_const(val)); + else + __mark_reg_known(true_reg, val); break; case BPF_JNE: /* If this is true we know nothing Jon Snow, but if it is false - * we know the value for sure; + * we know the value for sure. */ - __mark_reg_known(false_reg, val); + if (is_jmp32) + false_reg->var_off = tnum_or(false_reg->var_off, + tnum_const(val)); + else + __mark_reg_known(false_reg, val); break; case BPF_JGT: - false_reg->umax_value = min(false_reg->umax_value, val); + if (!is_jmp32) + false_reg->umax_value = min(false_reg->umax_value, val); true_reg->umin_value = max(true_reg->umin_value, val + 1); break; case BPF_JSGT: - false_reg->smax_value = min_t(s64, false_reg->smax_value, val); + if (!is_jmp32) + false_reg->smax_value = min_t(s64, + false_reg->smax_value, + val); true_reg->smin_value = max_t(s64, true_reg->smin_value, val + 1); break; case BPF_JLT: false_reg->umin_value = max(false_reg->umin_value, val); - true_reg->umax_value = min(true_reg->umax_value, val - 1); + if (!is_jmp32) + true_reg->umax_value = min(true_reg->umax_value, + val - 1); break; case BPF_JSLT: false_reg->smin_value = max_t(s64, false_reg->smin_value, val); - true_reg->smax_value = min_t(s64, true_reg->smax_value, val - 1); + if (!is_jmp32) + true_reg->smax_value = min_t(s64, true_reg->smax_value, + val - 1); break; case BPF_JGE: - false_reg->umax_value = min(false_reg->umax_value, val - 1); + if (!is_jmp32) + false_reg->umax_value = min(false_reg->umax_value, + val - 1); true_reg->umin_value = max(true_reg->umin_value, val); break; case BPF_JSGE: - false_reg->smax_value = min_t(s64, false_reg->smax_value, val - 1); + if (!is_jmp32) + false_reg->smax_value = min_t(s64, + false_reg->smax_value, + val - 1); true_reg->smin_value = max_t(s64, true_reg->smin_value, val); break; case BPF_JLE: false_reg->umin_value = max(false_reg->umin_value, val + 1); - true_reg->umax_value = min(true_reg->umax_value, val); + if (!is_jmp32) + true_reg->umax_value = min(true_reg->umax_value, val); break; case BPF_JSLE: false_reg->smin_value = max_t(s64, false_reg->smin_value, val + 1); - true_reg->smax_value = min_t(s64, true_reg->smax_value, val); + if (!is_jmp32) + true_reg->smax_value = min_t(s64, true_reg->smax_value, + val); break; default: break; @@ -3997,7 +4021,7 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg, */ static void reg_set_min_max_inv(struct bpf_reg_state *true_reg, struct bpf_reg_state *false_reg, u64 val, - u8 opcode) + u8 opcode, bool is_jmp32) { if (__is_pointer_value(false, false_reg)) return; @@ -4007,45 +4031,69 @@ static void reg_set_min_max_inv(struct bpf_reg_state *true_reg, /* If this is false then we know nothing Jon Snow, but if it is * true then we know for sure. */ - __mark_reg_known(true_reg, val); + if (is_jmp32) + true_reg->var_off = tnum_or(true_reg->var_off, + tnum_const(val)); + else + __mark_reg_known(true_reg, val); break; case BPF_JNE: /* If this is true we know nothing Jon Snow, but if it is false - * we know the value for sure; + * we know the value for sure. */ - __mark_reg_known(false_reg, val); + if (is_jmp32) + false_reg->var_off = tnum_or(false_reg->var_off, + tnum_const(val)); + else + __mark_reg_known(false_reg, val); break; case BPF_JGT: - true_reg->umax_value = min(true_reg->umax_value, val - 1); + if (!is_jmp32) + true_reg->umax_value = min(true_reg->umax_value, + val - 1); false_reg->umin_value = max(false_reg->umin_value, val); break; case BPF_JSGT: - true_reg->smax_value = min_t(s64, true_reg->smax_value, val - 1); + if (!is_jmp32) + true_reg->smax_value = min_t(s64, true_reg->smax_value, + val - 1); false_reg->smin_value = max_t(s64, false_reg->smin_value, val); break; case BPF_JLT: true_reg->umin_value = max(true_reg->umin_value, val + 1); - false_reg->umax_value = min(false_reg->umax_value, val); + if (!is_jmp32) + false_reg->umax_value = min(false_reg->umax_value, val); break; case BPF_JSLT: true_reg->smin_value = max_t(s64, true_reg->smin_value, val + 1); - false_reg->smax_value = min_t(s64, false_reg->smax_value, val); + if (!is_jmp32) + false_reg->smax_value = min_t(s64, + false_reg->smax_value, + val); break; case BPF_JGE: - true_reg->umax_value = min(true_reg->umax_value, val); + if (!is_jmp32) + true_reg->umax_value = min(true_reg->umax_value, val); false_reg->umin_value = max(false_reg->umin_value, val + 1); break; case BPF_JSGE: - true_reg->smax_value = min_t(s64, true_reg->smax_value, val); + if (!is_jmp32) + true_reg->smax_value = min_t(s64, true_reg->smax_value, + val); false_reg->smin_value = max_t(s64, false_reg->smin_value, val + 1); break; case BPF_JLE: true_reg->umin_value = max(true_reg->umin_value, val); - false_reg->umax_value = min(false_reg->umax_value, val - 1); + if (!is_jmp32) + false_reg->umax_value = min(false_reg->umax_value, + val - 1); break; case BPF_JSLE: true_reg->smin_value = max_t(s64, true_reg->smin_value, val); - false_reg->smax_value = min_t(s64, false_reg->smax_value, val - 1); + if (!is_jmp32) + false_reg->smax_value = min_t(s64, + false_reg->smax_value, + val - 1); break; default: break; @@ -4276,6 +4324,7 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, struct bpf_reg_state *regs = this_branch->frame[this_branch->curframe]->regs; struct bpf_reg_state *dst_reg, *other_branch_regs; u8 opcode = BPF_OP(insn->code); + bool is_jmp32; int err; if (opcode > BPF_JSLE) { @@ -4284,11 +4333,13 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, } if (BPF_SRC(insn->code) == BPF_X) { - if (insn->imm != 0) { + if (insn->imm & ~BPF_JMP_SUBOP_MASK) { verbose(env, "BPF_JMP uses reserved fields\n"); return -EINVAL; } + is_jmp32 = insn->imm & BPF_JMP_SUBOP_32BIT; + /* check src1 operand */ err = check_reg_arg(env, insn->src_reg, SRC_OP); if (err) @@ -4300,10 +4351,12 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, return -EACCES; } } else { - if (insn->src_reg != BPF_REG_0) { + if (insn->src_reg & ~BPF_JMP_SUBOP_MASK) { verbose(env, "BPF_JMP uses reserved fields\n"); return -EINVAL; } + + is_jmp32 = insn->src_reg & BPF_JMP_SUBOP_32BIT; } /* check src2 operand */ @@ -4314,8 +4367,29 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, dst_reg = ®s[insn->dst_reg]; if (BPF_SRC(insn->code) == BPF_K) { - int pred = is_branch_taken(dst_reg, insn->imm, opcode); + struct bpf_reg_state *reg = dst_reg; + struct bpf_reg_state reg_lo; + int pred; + + if (is_jmp32) { + reg_lo = *dst_reg; + reg = ®_lo; + coerce_reg_to_size(reg, 4); + /* If s32 min/max has the same sign bit, then min/max + * relationship still maintain after copying value from + * unsigned range inside coerce_reg_to_size. + */ + + if (reg->umax_value > (u32)S32_MAX && + reg->umin_value <= (u32)S32_MAX) { + reg->smin_value = S32_MIN; + reg->smax_value = S32_MAX; + } + reg->smin_value = (s64)(s32)reg->smin_value; + reg->smax_value = (s64)(s32)reg->smax_value; + } + pred = is_branch_taken(reg, insn->imm, opcode); if (pred == 1) { /* only follow the goto, ignore fall-through */ *insn_idx += insn->off; @@ -4341,30 +4415,51 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, * comparable. */ if (BPF_SRC(insn->code) == BPF_X) { + struct bpf_reg_state *src_reg = ®s[insn->src_reg]; + struct bpf_reg_state lo_reg0 = *dst_reg; + struct bpf_reg_state lo_reg1 = *src_reg; + struct bpf_reg_state *src_lo, *dst_lo; + + dst_lo = &lo_reg0; + src_lo = &lo_reg1; + coerce_reg_to_size(dst_lo, 4); + coerce_reg_to_size(src_lo, 4); + if (dst_reg->type == SCALAR_VALUE && - regs[insn->src_reg].type == SCALAR_VALUE) { - if (tnum_is_const(regs[insn->src_reg].var_off)) + src_reg->type == SCALAR_VALUE) { + if (tnum_is_const(src_reg->var_off) || + (is_jmp32 && tnum_is_const(src_lo->var_off))) reg_set_min_max(&other_branch_regs[insn->dst_reg], - dst_reg, regs[insn->src_reg].var_off.value, - opcode); - else if (tnum_is_const(dst_reg->var_off)) + dst_reg, + is_jmp32 + ? src_lo->var_off.value + : src_reg->var_off.value, + opcode, is_jmp32); + else if (tnum_is_const(dst_reg->var_off) || + (is_jmp32 && tnum_is_const(dst_lo->var_off))) reg_set_min_max_inv(&other_branch_regs[insn->src_reg], - ®s[insn->src_reg], - dst_reg->var_off.value, opcode); - else if (opcode == BPF_JEQ || opcode == BPF_JNE) + src_reg, + is_jmp32 + ? dst_lo->var_off.value + : dst_reg->var_off.value, + opcode, is_jmp32); + else if (!is_jmp32 && + (opcode == BPF_JEQ || opcode == BPF_JNE)) /* Comparing for equality, we can combine knowledge */ reg_combine_min_max(&other_branch_regs[insn->src_reg], &other_branch_regs[insn->dst_reg], - ®s[insn->src_reg], - ®s[insn->dst_reg], opcode); + src_reg, dst_reg, opcode); } } else if (dst_reg->type == SCALAR_VALUE) { reg_set_min_max(&other_branch_regs[insn->dst_reg], - dst_reg, insn->imm, opcode); + dst_reg, insn->imm, opcode, is_jmp32); } - /* detect if R == 0 where R is returned from bpf_map_lookup_elem() */ - if (BPF_SRC(insn->code) == BPF_K && + /* detect if R == 0 where R is returned from bpf_map_lookup_elem(). + * NOTE: these optimizations below are related with pointer comparison + * which will always be JMP32. + */ + if (!is_jmp32 && BPF_SRC(insn->code) == BPF_K && insn->imm == 0 && (opcode == BPF_JEQ || opcode == BPF_JNE) && reg_type_may_be_null(dst_reg->type)) { /* Mark all identical registers in each branch as either @@ -4374,7 +4469,8 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env, opcode == BPF_JNE); mark_ptr_or_null_regs(other_branch, insn->dst_reg, opcode == BPF_JEQ); - } else if (!try_match_pkt_pointers(insn, dst_reg, ®s[insn->src_reg], + } else if (!is_jmp32 && + !try_match_pkt_pointers(insn, dst_reg, ®s[insn->src_reg], this_branch, other_branch) && is_pointer_value(env, insn->dst_reg)) { verbose(env, "R%d pointer comparison prohibited\n", From patchwork Wed Dec 19 22:44:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016382 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="U1QaNzDW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhl6Y8zz9sCh for ; Thu, 20 Dec 2018 09:44:55 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729535AbeLSWoy (ORCPT ); Wed, 19 Dec 2018 17:44:54 -0500 Received: from mail-wm1-f43.google.com ([209.85.128.43]:50332 "EHLO mail-wm1-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729364AbeLSWov (ORCPT ); Wed, 19 Dec 2018 17:44:51 -0500 Received: by mail-wm1-f43.google.com with SMTP id n190so102632wmd.0 for ; Wed, 19 Dec 2018 14:44:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dKibI/Ghe9KHMWWdP2XOfns97FOimgExcf97FFGBmIE=; b=U1QaNzDWCfmViZM0MeoU1JijnLph4apmYlSzKt+uCNkxETGPAbSpdkPnvZy2QHkqKf UfhqFYAxjhmA98qPfpeqAy9GGzQmcJS3z3BrcPGLJeAYctYgcUR0rzPYPftBZuUzudRu 3eB93ENGwwXJV1Av61UDUBDXSIPaqnrv/nndgtrLZWULUSn8y5s2Lx92XDleN6Y9CZu5 QBi3pSFO8mTi4pH6A7OElmtYwU7cCdX0zrRSSC3s0+j5AswfndMUAoo9A9WgYD5+sP+x qKSS1/y8IZjPstUYsmRu8HLZqkeAhJh0y2rqyrhm8E3CHX6afRdDndyFKo5k5yKxrxjx ysbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dKibI/Ghe9KHMWWdP2XOfns97FOimgExcf97FFGBmIE=; b=Si2ZhG4CZdsFAeVxf+TVae0eXh5L41vVKBIbqiBKH4CMAg+CmoEp29Wr2DJjv/5NZA s/tVjHeoMqTeeDIuRwNbCvAasLEGKFdS5XNTEroX8St8+/a/LvS2lBROKQOm7UZzDyB5 dITY550k6xwoiFnY7vF6pLiseZzMhXZBas9r041dvt/2vcAq3azow+OhlNl0+iDAGdkf zDQw74XD0N7WaM81gVNfPOWG0KGJckJh/qOCXFOh3CvuV63xySgRtTtwaQJALR+LqVjH atgbowlTQzQI6buiPB8NrZtaZn3FKHMw988iU/3p+JmHpfOUpii5mSSh6u9VCMluRhzm QTdw== X-Gm-Message-State: AA+aEWaEa3OMapy70pyBxZ0L8iXyDvJIUDtWOGkxq2MfrAg4yCZ7LOuN PABzmC0Fg6GwNHIUcRmMx2jwtg== X-Google-Smtp-Source: AFSGD/VYPSyaxnNXpbsWc7Z3juleNvm4g1oP7ulD7gLUMkgfJSnxGP7/2E4+4mw9ELDFsie3YrBCWA== X-Received: by 2002:a1c:a58a:: with SMTP id o132mr9378044wme.6.1545259487667; Wed, 19 Dec 2018 14:44:47 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:47 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 12/13] bpf: unit tests for JMP32 Date: Wed, 19 Dec 2018 17:44:19 -0500 Message-Id: <1545259460-13376-13-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds unit tests for new JMP32 instructions. Signed-off-by: Jiong Wang --- include/linux/filter.h | 19 +++ lib/test_bpf.c | 321 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 335 insertions(+), 5 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index 537e9e7..94e1000 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -271,6 +271,15 @@ struct sock_reuseport; .off = OFF, \ .imm = 0 }) +/* Likewise, but is 32-bit variant. */ +#define BPF_JMP32_REG(OP, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 1 }) + /* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */ #define BPF_JMP_IMM(OP, DST, IMM, OFF) \ @@ -281,6 +290,16 @@ struct sock_reuseport; .off = OFF, \ .imm = IMM }) +/* Likewise, but is 32-bit variant. */ + +#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 1, \ + .off = OFF, \ + .imm = IMM }) + /* Unconditional jumps, goto pc + off16 */ #define BPF_JMP_A(OFF) \ diff --git a/lib/test_bpf.c b/lib/test_bpf.c index f3e5707..c17f08b 100644 --- a/lib/test_bpf.c +++ b/lib/test_bpf.c @@ -4447,6 +4447,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSLT | BPF_K (32-bit variant) */ + { + "JMP32_JSLT_K: Signed jump: if (-2 < -1) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x1fffffffeLL), + BPF_JMP32_IMM(BPF_JSLT, R1, -1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0", .u.insns_int = { @@ -4476,6 +4491,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSGT | BPF_K (32-bit variant) */ + { + "JMP32_JSGT_K: Signed jump: if (-1 > -2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0xfffffff7ffffffffLL), + BPF_JMP32_IMM(BPF_JSGT, R1, -2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0", .u.insns_int = { @@ -4505,6 +4535,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSLE | BPF_K (32-bit variant) */ + { + "JMP32_JSLE_K: Signed jump: if (-2 <= -1) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x7ffffffffffffffeLL), + BPF_JMP32_IMM(BPF_JSLE, R1, -1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1", .u.insns_int = { @@ -4572,6 +4617,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSGE | BPF_K (32-bit variant) */ + { + "JMP32_JSGE_K: Signed jump: if (-1 >= -2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0xfffffff7ffffffffLL), + BPF_JMP32_IMM(BPF_JSGE, R1, -2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1", .u.insns_int = { @@ -4639,6 +4699,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JGT | BPF_K (32-bit variant) */ + { + "JMP32_JGT_K: if (2 > 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000002), + BPF_JMP32_IMM(BPF_JGT, R1, 3, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 0 } }, + }, { "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1", .u.insns_int = { @@ -4668,8 +4743,23 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JLT | BPF_K (32-bit variant) */ { - "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1", + "JMP32_JLT_K: if (2 < 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000002), + BPF_JMP32_IMM(BPF_JLT, R1, 3, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, + { + "JMP_JLT_K: Unsigned jump: if (1 < -1) return 1", .u.insns_int = { BPF_ALU32_IMM(BPF_MOV, R0, 0), BPF_LD_IMM64(R1, 1), @@ -4697,6 +4787,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JGE | BPF_K (32-bit variant) */ + { + "JMP32_JGE_K: if (2 >= 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000002), + BPF_JMP32_IMM(BPF_JGE, R1, 3, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 0 } }, + }, /* BPF_JMP | BPF_JLE | BPF_K */ { "JMP_JLE_K: if (2 <= 3) return 1", @@ -4712,6 +4817,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JLE | BPF_K (32-bit variant) */ + { + "JMP32_JLE_K: if (2 <= 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000002), + BPF_JMP32_IMM(BPF_JLE, R1, 3, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, /* BPF_JMP | BPF_JGT | BPF_K jump backwards */ { "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)", @@ -4787,6 +4907,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JNE | BPF_K (32-bit variant) */ + { + "JMP32_JNE_K: if (3 != 2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000003ULL), + BPF_JMP32_IMM(BPF_JNE, R1, 2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, /* BPF_JMP | BPF_JEQ | BPF_K */ { "JMP_JEQ_K: if (3 == 3) return 1", @@ -4802,6 +4937,21 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JEQ | BPF_K (32-bit variant) */ + { + "JMP32_JEQ_K: if (3 == 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000003ULL), + BPF_JMP32_IMM(BPF_JEQ, R1, 3, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, /* BPF_JMP | BPF_JSET | BPF_K */ { "JMP_JSET_K: if (0x3 & 0x2) return 1", @@ -4847,6 +4997,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSGT | BPF_X (32-bit variant) */ + { + "JMP32_JSGT_X: Signed jump: if (-1 > -2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x7fffffffffffffffULL), + BPF_LD_IMM64(R2, -2), + BPF_JMP32_REG(BPF_JSGT, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0", .u.insns_int = { @@ -4878,13 +5044,30 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSLT | BPF_X */ { - "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0", + "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1", .u.insns_int = { - BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_ALU32_IMM(BPF_MOV, R0, 0), BPF_LD_IMM64(R1, -1), - BPF_LD_IMM64(R2, -1), - BPF_JMP_REG(BPF_JSLT, R1, R2, 1), + BPF_LD_IMM64(R2, -2), + BPF_JMP_REG(BPF_JSLT, R2, R1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, + /* BPF_JMP | BPF_JSLT | BPF_X (32-bit variant) */ + { + "JMP32_JSLT_X: Signed jump: if (-1 < -1) return 0", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_LD_IMM64(R1, 0x1ffffffffULL), + BPF_LD_IMM64(R2, 0x2ffffffffULL), + BPF_JMP32_REG(BPF_JSLT, R1, R2, 1), BPF_EXIT_INSN(), BPF_ALU32_IMM(BPF_MOV, R0, 0), BPF_EXIT_INSN(), @@ -4909,6 +5092,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSGE | BPF_X (32-bit variant) */ + { + "JMP32_JSGE_X: Signed jump: if (-1 >= -2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0xfffffff7ffffffffULL), + BPF_LD_IMM64(R2, -2), + BPF_JMP32_REG(BPF_JSGE, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1", .u.insns_int = { @@ -4940,6 +5139,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JSLE | BPF_X (32-bit variant) */ + { + "JMP32_JSLE_X: Signed jump: if (-2 <= -1) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x1ffffffffULL), + BPF_LD_IMM64(R2, -2), + BPF_JMP32_REG(BPF_JSLE, R2, R1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1", .u.insns_int = { @@ -4971,6 +5186,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JGT | BPF_X (32-bit variant) */ + { + "JMP32_JGT_X: if (3 > 2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x7fffffff3ULL), + BPF_LD_IMM64(R2, 0xffffffff2ULL), + BPF_JMP32_REG(BPF_JGT, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1", .u.insns_int = { @@ -5002,6 +5233,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JLT | BPF_X (32-bit variant) */ + { + "JMP32_JLT_X: if (2 < 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000003ULL), + BPF_LD_IMM64(R2, 0x200000002ULL), + BPF_JMP32_REG(BPF_JLT, R2, R1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1", .u.insns_int = { @@ -5033,6 +5280,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JGE | BPF_X (32-bit variant) */ + { + "JMP32_JGE_X: if (3 >= 2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x123456783ULL), + BPF_LD_IMM64(R2, 0xf23456782ULL), + BPF_JMP32_REG(BPF_JGE, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JGE_X: if (3 >= 3) return 1", .u.insns_int = { @@ -5064,6 +5327,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JLE | BPF_X (32-bit variant) */ + { + "JMP32_JLE_X: if (2 <= 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x7fffffff3ULL), + BPF_LD_IMM64(R2, 0x8fffffff2ULL), + BPF_JMP32_REG(BPF_JLE, R2, R1, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, { "JMP_JLE_X: if (3 <= 3) return 1", .u.insns_int = { @@ -5184,6 +5463,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JNE | BPF_X (32-bit variant) */ + { + "JMP32_JNE_X: if (3 != 2) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x10000003ULL), + BPF_LD_IMM64(R2, 0x10000002ULL), + BPF_JMP32_REG(BPF_JNE, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, /* BPF_JMP | BPF_JEQ | BPF_X */ { "JMP_JEQ_X: if (3 == 3) return 1", @@ -5200,6 +5495,22 @@ static struct bpf_test tests[] = { { }, { { 0, 1 } }, }, + /* BPF_JMP | BPF_JEQ | BPF_X (32-bit variant) */ + { + "JMP32_JEQ_X: if (3 == 3) return 1", + .u.insns_int = { + BPF_ALU32_IMM(BPF_MOV, R0, 0), + BPF_LD_IMM64(R1, 0x100000003ULL), + BPF_LD_IMM64(R2, 0x200000003ULL), + BPF_JMP32_REG(BPF_JEQ, R1, R2, 1), + BPF_EXIT_INSN(), + BPF_ALU32_IMM(BPF_MOV, R0, 1), + BPF_EXIT_INSN(), + }, + INTERNAL, + { }, + { { 0, 1 } }, + }, /* BPF_JMP | BPF_JSET | BPF_X */ { "JMP_JSET_X: if (0x3 & 0x2) return 1", From patchwork Wed Dec 19 22:44:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 1016381 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="k4xingIL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Kqhk0tL3z9sCh for ; Thu, 20 Dec 2018 09:44:54 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729469AbeLSWox (ORCPT ); Wed, 19 Dec 2018 17:44:53 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:52030 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729373AbeLSWou (ORCPT ); Wed, 19 Dec 2018 17:44:50 -0500 Received: by mail-wm1-f65.google.com with SMTP id b11so98671wmj.1 for ; Wed, 19 Dec 2018 14:44:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PS/wRsoDCUc47lv8M6ZpHZTTjV6lWKXF1GMATC9eweY=; b=k4xingILGqG7WRB/05GR8lHL0AB3K00omeIKW9FfdfzjGMzwfEgU1FwxNPwExsKvfK FzvSCefZgELTI5bGnsB6QPdePhpeZWUYJFUDe+8ZgK5ChezITStbigou71U+5X4pzChB 3ACCondLngWuQtIWeWE/ZNxKxO3ON4rrzHaf+GzfNQGFbhI9YF+NnFDSDNWQWWkFhUWY DL0EBQl8CZjuGkRHcsGD1FrBKIqm8M5hcYTQJXtKdQhtVewfgv51P5/DVTxnRxbPEOob PS2xzMShPZJXi9URVImdLe5oSVnwpPcQos1b+dnsMdqDthvDaSjHXe31G6f0y5/uxOxs Y0BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PS/wRsoDCUc47lv8M6ZpHZTTjV6lWKXF1GMATC9eweY=; b=E2i85rlinLWRoa96QwVCIzSRaBktdVLKD1HfDwHuEntSImsD8z5I4yxIx8pCd8kqP/ BRsyNL75J6y4PBI3DfKYzl9FIHe6jQlm/hJHpWztelxcJOzS2w8UNRx5Jl5eZqdDLAJ3 zR6iNwbjc54MMQ8io7AaZueGZMIsPZQOQFsOGx+Nc4RUkvHuej/yBY72JdLLbZKKWusM KUBZzJnx8TQkx6KH9RDCCEOEKZw1NDT6J0C5fZLUGF0ZnX6H2PWPx8iiI1grn/LXzFBl KwWGYOe2rfLPylvBTnUiOTo1xLC1e/Tx9r4UD357rx4hvNwGIRygKufop6kEUW9yvOe3 m8nA== X-Gm-Message-State: AA+aEWbJAFNJDCmt+NVeXWUqt3sf2x1hmLcGQ+PH6/qcJWdRVl67Lwg5 kKT90e0RKTLB31saaR+Pia2sDg== X-Google-Smtp-Source: AFSGD/Xyz9tOk8RC2z55WcLOB8dF5QJ8wPqKkE94cb0bDbgu6T3AExA6Tu3UF+WOGx2CqPM7+nPGXA== X-Received: by 2002:a1c:4855:: with SMTP id v82mr8887519wma.15.1545259488532; Wed, 19 Dec 2018 14:44:48 -0800 (PST) Received: from cbtest28.netronome.com ([217.38.71.146]) by smtp.gmail.com with ESMTPSA id o64sm5359188wmo.47.2018.12.19.14.44.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Dec 2018 14:44:47 -0800 (PST) From: Jiong Wang To: ast@kernel.org, daniel@iogearbox.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jiong Wang Subject: [PATH bpf-next 13/13] selftests: bpf: makefile support sub-register code-gen test mode Date: Wed, 19 Dec 2018 17:44:20 -0500 Message-Id: <1545259460-13376-14-git-send-email-jiong.wang@netronome.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> References: <1545259460-13376-1-git-send-email-jiong.wang@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a new BPF_SELFTEST_32BIT variable to enable sub-register code-gen test mode. For example: make BPF_SELFTEST_32BIT=1 -C tools/testing/selftests/bpf run_tests will compile all bpf C program with sub-register code-gen enabled, ALU32 and JMP32 instructions will be used. Signed-off-by: Jiong Wang --- tools/testing/selftests/bpf/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 73aa6d8..70bccf6 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -146,6 +146,10 @@ endif endif endif +ifneq ($(BPF_SELFTEST_32BIT),) + LLC_FLAGS += -mattr=alu32 +endif + # Have one program compiled without "-target bpf" to test whether libbpf loads # it successfully $(OUTPUT)/test_xdp.o: test_xdp.c