Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp870873pxb; Tue, 1 Feb 2022 12:08:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJwb7+Ay3NVw9gqgPivsWxP5QsP/POqtCfavEB251QE9Bxm2D4YpBKXwG6oxa7CubmjCUMRS X-Received: by 2002:a17:907:94d0:: with SMTP id dn16mr22995385ejc.95.1643746091975; Tue, 01 Feb 2022 12:08:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643746091; cv=none; d=google.com; s=arc-20160816; b=EaoZIxMHyXbxH9sJupUNJLahUOXaRxCNmM/ghJJgD12YcUWeGJl1HHYTj+g+kBa6Uy eV3luxQ3+2LjCX2uCL3C5q2ZClbdMKJw3C08pinDBeQoPS3JaCr64hBk/PffioGTzaip biOJqHWCP7iqgSxbnufwUHjXohjL2LdSORiUmoXxzQBMP2RTN1MtLn5gKDSjevDHgx21 6RSRUCmZcQCd9ZI9f33bu3dqHrJ+KTgVQkSQZ48IWud6zwtzt8KZYfjVjZDAHmIgFogH i7sbQFjXmu3lVeqA17zoy6w8FHKNFitROWIQfEB7ASOcLj107HJPTgx5zt6YIAgEmFOT DXNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6RgOlrqYdPy2uQGTg6vqVTTZMv8JcBznt6j0ArsiMdE=; b=ep07HXMO0MOcuyh8QJuti6R9LadzNYR6oXso77hV0sC++2aJh7KFYcDZzDn8bPzXJt bY1njaN83pE5esnmVHyZGklsKR6G0+q4lTnCUxJ+X7TTQkLx7okneGuu5J+7Cj6E/dtw 0t2j0tuP7eHYVkI/K0a5pMVOA5Y+6VfPDeLjE/JGQKsbt8RTSH9tAWL6n3u4L9fFEoAi 80hZrtwAckCf4fOawmzlN3PDUQqI+xbH/OIVeDXhKS2wJTXOYGPQLakggJN+gouuBIVu cShLzbKzEY0m0v40NvVpYiCVnhL8lgbByJzzCCiFiNnI/oVlOAbEq4DyjyZb5BYNAd1H V2ZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=lOz3wX4Y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s19si9698202ejm.416.2022.02.01.12.07.45; Tue, 01 Feb 2022 12:08:11 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=lOz3wX4Y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377556AbiAaLXG (ORCPT + 99 others); Mon, 31 Jan 2022 06:23:06 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:33244 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376889AbiAaLN1 (ORCPT ); Mon, 31 Jan 2022 06:13:27 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 33E79B82A69; Mon, 31 Jan 2022 11:13:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 74C94C340E8; Mon, 31 Jan 2022 11:13:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643627605; bh=cxLfZfsDQeybGrT0LvcP/UqveDE4obs6ThtNGI0gzLQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lOz3wX4YWWPvulm05ce2Dn+GTTWX9eivkcKUSpB50Aw7o3JCAl/VnL2dCgME0og3H CUSKDKovD/rEF0liHPrz4tF3vPy4QHE9b0UeidoiD6h9QIUknUqEa5BqJoyOdJqDwe 8ysEM57Vcm/7+P4+4tLo0qM3Zj6kRh8ntdebHq8I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Johan Almbladh , "Naveen N. Rao" , Michael Ellerman , Sasha Levin Subject: [PATCH 5.15 105/171] powerpc64/bpf: Limit ldbrx to processors compliant with ISA v2.06 Date: Mon, 31 Jan 2022 11:56:10 +0100 Message-Id: <20220131105233.600744911@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220131105229.959216821@linuxfoundation.org> References: <20220131105229.959216821@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Naveen N. Rao [ Upstream commit 3f5f766d5f7f95a69a630da3544a1a0cee1cdddf ] Johan reported the below crash with test_bpf on ppc64 e5500: test_bpf: #296 ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301 jited:1 Oops: Exception in kernel mode, sig: 4 [#1] BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500 Modules linked in: test_bpf(+) CPU: 0 PID: 76 Comm: insmod Not tainted 5.14.0-03771-g98c2059e008a-dirty #1 NIP: 8000000000061c3c LR: 80000000006dea64 CTR: 8000000000061c18 REGS: c0000000032d3420 TRAP: 0700 Not tainted (5.14.0-03771-g98c2059e008a-dirty) MSR: 0000000080089000 CR: 88002822 XER: 20000000 IRQMASK: 0 <...> NIP [8000000000061c3c] 0x8000000000061c3c LR [80000000006dea64] .__run_one+0x104/0x17c [test_bpf] Call Trace: .__run_one+0x60/0x17c [test_bpf] (unreliable) .test_bpf_init+0x6a8/0xdc8 [test_bpf] .do_one_initcall+0x6c/0x28c .do_init_module+0x68/0x28c .load_module+0x2460/0x2abc .__do_sys_init_module+0x120/0x18c .system_call_exception+0x110/0x1b8 system_call_common+0xf0/0x210 --- interrupt: c00 at 0x101d0acc <...> ---[ end trace 47b2bf19090bb3d0 ]--- Illegal instruction The illegal instruction turned out to be 'ldbrx' emitted for BPF_FROM_[L|B]E, which was only introduced in ISA v2.06. Guard use of the same and implement an alternative approach for older processors. Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF") Reported-by: Johan Almbladh Signed-off-by: Naveen N. Rao Tested-by: Johan Almbladh Acked-by: Johan Almbladh Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/d1e51c6fdf572062cf3009a751c3406bda01b832.1641468127.git.naveen.n.rao@linux.vnet.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/net/bpf_jit_comp64.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index baea657bc8687..bca31a61e57f8 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -498,6 +498,7 @@ #define PPC_RAW_LDX(r, base, b) (0x7c00002a | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b)) #define PPC_RAW_LHZ(r, base, i) (0xa0000000 | ___PPC_RT(r) | ___PPC_RA(base) | IMM_L(i)) #define PPC_RAW_LHBRX(r, base, b) (0x7c00062c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b)) +#define PPC_RAW_LWBRX(r, base, b) (0x7c00042c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b)) #define PPC_RAW_LDBRX(r, base, b) (0x7c000428 | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b)) #define PPC_RAW_STWCX(s, a, b) (0x7c00012d | ___PPC_RS(s) | ___PPC_RA(a) | ___PPC_RB(b)) #define PPC_RAW_CMPWI(a, i) (0x2c000000 | ___PPC_RA(a) | IMM_L(i)) diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c index 95a337b5dc2b4..57e1b6680365c 100644 --- a/arch/powerpc/net/bpf_jit_comp64.c +++ b/arch/powerpc/net/bpf_jit_comp64.c @@ -633,17 +633,21 @@ bpf_alu32_trunc: EMIT(PPC_RAW_MR(dst_reg, b2p[TMP_REG_1])); break; case 64: - /* - * Way easier and faster(?) to store the value - * into stack and then use ldbrx - * - * ctx->seen will be reliable in pass2, but - * the instructions generated will remain the - * same across all passes - */ + /* Store the value to stack and then use byte-reverse loads */ PPC_BPF_STL(dst_reg, 1, bpf_jit_stack_local(ctx)); EMIT(PPC_RAW_ADDI(b2p[TMP_REG_1], 1, bpf_jit_stack_local(ctx))); - EMIT(PPC_RAW_LDBRX(dst_reg, 0, b2p[TMP_REG_1])); + if (cpu_has_feature(CPU_FTR_ARCH_206)) { + EMIT(PPC_RAW_LDBRX(dst_reg, 0, b2p[TMP_REG_1])); + } else { + EMIT(PPC_RAW_LWBRX(dst_reg, 0, b2p[TMP_REG_1])); + if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN)) + EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, 32)); + EMIT(PPC_RAW_LI(b2p[TMP_REG_2], 4)); + EMIT(PPC_RAW_LWBRX(b2p[TMP_REG_2], b2p[TMP_REG_2], b2p[TMP_REG_1])); + if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) + EMIT(PPC_RAW_SLDI(b2p[TMP_REG_2], b2p[TMP_REG_2], 32)); + EMIT(PPC_RAW_OR(dst_reg, dst_reg, b2p[TMP_REG_2])); + } break; } break; -- 2.34.1