Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp2250045ybd; Mon, 24 Jun 2019 03:18:04 -0700 (PDT) X-Google-Smtp-Source: APXvYqx5GZcabQ38tPOYnHWLYDgA4r/m4VccMLQS18alnWGuZj+HJBvmfXyhUFHmFBTcgFcUAU5g X-Received: by 2002:a17:902:aa5:: with SMTP id 34mr16166330plp.166.1561371484725; Mon, 24 Jun 2019 03:18:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561371484; cv=none; d=google.com; s=arc-20160816; b=yneQ/IR8ZHxOhPwesdb37XgSThZ0Yr+amvIPyWg9I0qng0C59LQVSrfW81PFFhJo4R xih7RPPUEls3XCRAK68sF2sQoKtGp4huOdGLJiMOBHZ7L8y97K5ubdYJ1EGEfXUyC+/J sqLVZ1sDz0gail7WJ+mvAflFqE0LlBHEf3Ktcxe3JmLIx5XKW2FPTdH1aw/KQOIyM5yj F559UY31VfJrXa8RKxoOoEmZJy/EATv8/QCJwrscSoqBWVfEAEn+7+W79EWJ749DBxJY 5n06b3nPg2YwCkP7Q+nqpRv9XQsB9XaQRIh/U5LPKWW+16f8XKWKBBmjGsaBHMTCkalD XMfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=2BdDIAgja3i0ErZV2IzNChX9QLsB5AkaXRBYi/wTckE=; b=vMlgQ6vn17kNqcyoorJSjza56RBXlliKKeEwNFaGO9sxar4PNNFFYxVz8QTWDiobkv Ct2/an0BJBapzd405zonwohyZiLkejWCJ8xppR/3pG8PqicUGDdUdMhD9/bn0PmhRAMt +JXg3dBxU+5Xt0YfXbKHgFEvBSUrMpnMeP+4VY+GNdq6V3Jy0Tn7t4W9s0EzdITK+4Cy 2kW/rPnosixkt6k82smpChsESobe9drIIti9LQnWtTBk7//cLeyIOM9nZSSsa6S6aF/2 YiXOP4iT3/dpEmbOgxlIqep0XGq5vRqYC61YUlO2fcQ9eatxifAV7EJMerymnn+b0er7 cP+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="ZJ3FPi/x"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r11si9865550plo.360.2019.06.24.03.17.48; Mon, 24 Jun 2019 03:18:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="ZJ3FPi/x"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730876AbfFXKRG (ORCPT + 99 others); Mon, 24 Jun 2019 06:17:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:54612 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729631AbfFXKRD (ORCPT ); Mon, 24 Jun 2019 06:17:03 -0400 Received: from localhost (f4.8f.5177.ip4.static.sl-reverse.com [119.81.143.244]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8D13C20645; Mon, 24 Jun 2019 10:17:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1561371422; bh=2JSS8IKH4OmQiltOgzRLBWCt9V9Lbb5J6fFkHC+io+k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZJ3FPi/xKEL6plCP6JGv199eMoQgfgqezuJ0lcU40+qLCVbg20Q0qzvgU9y26115o A2Zhrvh9JPhoQFRJFwcQeVnMSVs/jGbVk1mtUMTFK6qKC5pq+Q0GuXWCLhAII8/1Oi NnhUug/Pz0FfpWDQYxOR8nMcnsuROPrWbZyOzScQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Naveen N. Rao" , Daniel Borkmann Subject: [PATCH 5.1 097/121] powerpc/bpf: use unsigned division instruction for 64-bit operations Date: Mon, 24 Jun 2019 17:57:09 +0800 Message-Id: <20190624092325.708652754@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190624092320.652599624@linuxfoundation.org> References: <20190624092320.652599624@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Naveen N. Rao commit 758f2046ea040773ae8ea7f72dd3bbd8fa984501 upstream. BPF_ALU64 div/mod operations are currently using signed division, unlike BPF_ALU32 operations. Fix the same. DIV64 and MOD64 overflow tests pass with this fix. Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF") Cc: stable@vger.kernel.org # v4.8+ Signed-off-by: Naveen N. Rao Signed-off-by: Daniel Borkmann Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/net/bpf_jit.h | 2 +- arch/powerpc/net/bpf_jit_comp64.c | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -342,6 +342,7 @@ #define PPC_INST_MADDLD 0x10000033 #define PPC_INST_DIVWU 0x7c000396 #define PPC_INST_DIVD 0x7c0003d2 +#define PPC_INST_DIVDU 0x7c000392 #define PPC_INST_RLWINM 0x54000000 #define PPC_INST_RLWINM_DOT 0x54000001 #define PPC_INST_RLWIMI 0x50000000 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h @@ -116,7 +116,7 @@ ___PPC_RA(a) | IMM_L(i)) #define PPC_DIVWU(d, a, b) EMIT(PPC_INST_DIVWU | ___PPC_RT(d) | \ ___PPC_RA(a) | ___PPC_RB(b)) -#define PPC_DIVD(d, a, b) EMIT(PPC_INST_DIVD | ___PPC_RT(d) | \ +#define PPC_DIVDU(d, a, b) EMIT(PPC_INST_DIVDU | ___PPC_RT(d) | \ ___PPC_RA(a) | ___PPC_RB(b)) #define PPC_AND(d, a, b) EMIT(PPC_INST_AND | ___PPC_RA(d) | \ ___PPC_RS(a) | ___PPC_RB(b)) --- a/arch/powerpc/net/bpf_jit_comp64.c +++ b/arch/powerpc/net/bpf_jit_comp64.c @@ -399,12 +399,12 @@ static int bpf_jit_build_body(struct bpf case BPF_ALU64 | BPF_DIV | BPF_X: /* dst /= src */ case BPF_ALU64 | BPF_MOD | BPF_X: /* dst %= src */ if (BPF_OP(code) == BPF_MOD) { - PPC_DIVD(b2p[TMP_REG_1], dst_reg, src_reg); + PPC_DIVDU(b2p[TMP_REG_1], dst_reg, src_reg); PPC_MULD(b2p[TMP_REG_1], src_reg, b2p[TMP_REG_1]); PPC_SUB(dst_reg, dst_reg, b2p[TMP_REG_1]); } else - PPC_DIVD(dst_reg, dst_reg, src_reg); + PPC_DIVDU(dst_reg, dst_reg, src_reg); break; case BPF_ALU | BPF_MOD | BPF_K: /* (u32) dst %= (u32) imm */ case BPF_ALU | BPF_DIV | BPF_K: /* (u32) dst /= (u32) imm */ @@ -432,7 +432,7 @@ static int bpf_jit_build_body(struct bpf break; case BPF_ALU64: if (BPF_OP(code) == BPF_MOD) { - PPC_DIVD(b2p[TMP_REG_2], dst_reg, + PPC_DIVDU(b2p[TMP_REG_2], dst_reg, b2p[TMP_REG_1]); PPC_MULD(b2p[TMP_REG_1], b2p[TMP_REG_1], @@ -440,7 +440,7 @@ static int bpf_jit_build_body(struct bpf PPC_SUB(dst_reg, dst_reg, b2p[TMP_REG_1]); } else - PPC_DIVD(dst_reg, dst_reg, + PPC_DIVDU(dst_reg, dst_reg, b2p[TMP_REG_1]); break; }