[RFC PATCH 3/4] powerpc ppc-opcode: move ppc instuction encoding from test_emulate_step

Naveen N. Rao naveen.n.rao at linux.vnet.ibm.com
Thu Apr 2 03:51:55 AEDT 2020


Balamuruhan S wrote:
> Few ppc instructions are encoded in test_emulate_step.c, consolidate them to
> ppc-opcode.h, fix redefintion errors in bpf_jit caused due to this consolidation.
> Reuse the macros from ppc-opcode.h
> 
> Signed-off-by: Balamuruhan S <bala24 at linux.ibm.com>
> ---
>  arch/powerpc/include/asm/ppc-opcode.h |  34 ++++++
>  arch/powerpc/lib/test_emulate_step.c  | 155 ++++++++++----------------
>  arch/powerpc/net/bpf_jit.h            |   8 --
>  arch/powerpc/net/bpf_jit32.h          |  10 +-
>  arch/powerpc/net/bpf_jit64.h          |   4 +-
>  arch/powerpc/net/bpf_jit_comp.c       |   2 +-
>  arch/powerpc/net/bpf_jit_comp64.c     |  14 +--
>  7 files changed, 105 insertions(+), 122 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
> index ea5e0f864b20..2ed8a285f1ec 100644
> --- a/arch/powerpc/include/asm/ppc-opcode.h
> +++ b/arch/powerpc/include/asm/ppc-opcode.h
> @@ -76,6 +76,9 @@
>  #define	__REGA0_R30	30
>  #define	__REGA0_R31	31
> 
> +#define IMM_L(i)               ((uintptr_t)(i) & 0xffff)
> +#define IMM_DS(i)              ((uintptr_t)(i) & 0xfffc)
> +
>  /* opcode and xopcode for instructions */
>  #define OP_TRAP 3
>  #define OP_TRAP_64 2
> @@ -614,6 +617,37 @@
>  						___PPC_RA(vra) | \
>  						___PPC_RB(vrb) | __PPC_RC21)
> 
> +#define PPC_ENCODE_LD(r, base, i)     (PPC_INST_LD | ___PPC_RT(r) |           \
> +				___PPC_RA(base) | IMM_DS(i))
> +#define PPC_ENCODE_LWZ(r, base, i)    (PPC_INST_LWZ | ___PPC_RT(r) |          \
> +				___PPC_RA(base) | IMM_L(i))
> +#define PPC_ENCODE_LWZX(t, a, b)      (PPC_INST_LWZX | ___PPC_RT(t) |         \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_STD(r, base, i)    (PPC_INST_STD | ___PPC_RS(r) |          \
> +				___PPC_RA(base) | IMM_DS(i))
> +#define PPC_ENCODE_STDCX(s, a, b)     (PPC_INST_STDCX | ___PPC_RS(s) |        \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_LFSX(t, a, b)      (PPC_INST_LFSX | ___PPC_RT(t) |         \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_STFSX(s, a, b)     (PPC_INST_STFSX | ___PPC_RS(s) |        \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_LFDX(t, a, b)      (PPC_INST_LFDX | ___PPC_RT(t) |         \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_STFDX(s, a, b)     (PPC_INST_STFDX | ___PPC_RS(s) |        \
> +				 ___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_LVX(t, a, b)       (PPC_INST_LVX | ___PPC_RT(t) |          \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_STVX(s, a, b)      (PPC_INST_STVX | ___PPC_RS(s) |         \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_ADD(t, a, b)       (PPC_INST_ADD | ___PPC_RT(t) |          \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_ADD_DOT(t, a, b)   (PPC_INST_ADD | ___PPC_RT(t) |          \
> +				___PPC_RA(a) | ___PPC_RB(b) | 0x1)
> +#define PPC_ENCODE_ADDC(t, a, b)      (PPC_INST_ADDC | ___PPC_RT(t) |         \
> +				___PPC_RA(a) | ___PPC_RB(b))
> +#define PPC_ENCODE_ADDC_DOT(t, a, b)  (PPC_INST_ADDC | ___PPC_RT(t) |         \
> +				___PPC_RA(a) | ___PPC_RB(b) | 0x1)
> +
>  #define PPC_CP_ABORT        stringify_in_c(.long PPC_ENCODE_CP_ABORT)
>  #define PPC_COPY(a, b)      stringify_in_c(.long PPC_ENCODE_COPY(a, b))
>  #define PPC_DARN(t, l)      stringify_in_c(.long PPC_ENCODE_DARN(t, l))
> diff --git a/arch/powerpc/lib/test_emulate_step.c b/arch/powerpc/lib/test_emulate_step.c
> index 53df4146dd32..45b485edfee1 100644
> --- a/arch/powerpc/lib/test_emulate_step.c
> +++ b/arch/powerpc/lib/test_emulate_step.c
> @@ -12,49 +12,6 @@
>  #include <asm/ppc-opcode.h>
>  #include <asm/code-patching.h>
> 
> -#define IMM_L(i)		((uintptr_t)(i) & 0xffff)
> -#define IMM_DS(i)		((uintptr_t)(i) & 0xfffc)
> -
> -/*
> - * Defined with TEST_ prefix so it does not conflict with other
> - * definitions.
> - */
> -#define TEST_LD(r, base, i)	(PPC_INST_LD | ___PPC_RT(r) |		\
> -					___PPC_RA(base) | IMM_DS(i))
> -#define TEST_LWZ(r, base, i)	(PPC_INST_LWZ | ___PPC_RT(r) |		\
> -					___PPC_RA(base) | IMM_L(i))
> -#define TEST_LWZX(t, a, b)	(PPC_INST_LWZX | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_STD(r, base, i)	(PPC_INST_STD | ___PPC_RS(r) |		\
> -					___PPC_RA(base) | IMM_DS(i))
> -#define TEST_LDARX(t, a, b, eh)	(PPC_INST_LDARX | ___PPC_RT(t) |	\
> -					___PPC_RA(a) | ___PPC_RB(b) |	\
> -					__PPC_EH(eh))
> -#define TEST_STDCX(s, a, b)	(PPC_INST_STDCX | ___PPC_RS(s) |	\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_LFSX(t, a, b)	(PPC_INST_LFSX | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_STFSX(s, a, b)	(PPC_INST_STFSX | ___PPC_RS(s) |	\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_LFDX(t, a, b)	(PPC_INST_LFDX | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_STFDX(s, a, b)	(PPC_INST_STFDX | ___PPC_RS(s) |	\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_LVX(t, a, b)	(PPC_INST_LVX | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_STVX(s, a, b)	(PPC_INST_STVX | ___PPC_RS(s) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_LXVD2X(s, a, b)	(PPC_INST_LXVD2X | VSX_XX1((s), R##a, R##b))
> -#define TEST_STXVD2X(s, a, b)	(PPC_INST_STXVD2X | VSX_XX1((s), R##a, R##b))
> -#define TEST_ADD(t, a, b)	(PPC_INST_ADD | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_ADD_DOT(t, a, b)	(PPC_INST_ADD | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b) | 0x1)
> -#define TEST_ADDC(t, a, b)	(PPC_INST_ADDC | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b))
> -#define TEST_ADDC_DOT(t, a, b)	(PPC_INST_ADDC | ___PPC_RT(t) |		\
> -					___PPC_RA(a) | ___PPC_RB(b) | 0x1)
> -
>  #define MAX_SUBTESTS	16
> 
>  #define IGNORE_GPR(n)	(0x1UL << (n))
> @@ -104,7 +61,7 @@ static void __init test_ld(void)
>  	regs.gpr[3] = (unsigned long) &a;
> 
>  	/* ld r5, 0(r3) */
> -	stepped = emulate_step(&regs, TEST_LD(5, 3, 0));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LD(5, 3, 0));
> 
>  	if (stepped == 1 && regs.gpr[5] == a)
>  		show_result("ld", "PASS");
> @@ -122,7 +79,7 @@ static void __init test_lwz(void)
>  	regs.gpr[3] = (unsigned long) &a;
> 
>  	/* lwz r5, 0(r3) */
> -	stepped = emulate_step(&regs, TEST_LWZ(5, 3, 0));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LWZ(5, 3, 0));
> 
>  	if (stepped == 1 && regs.gpr[5] == a)
>  		show_result("lwz", "PASS");
> @@ -142,7 +99,7 @@ static void __init test_lwzx(void)
>  	regs.gpr[5] = 0x8765;
> 
>  	/* lwzx r5, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_LWZX(5, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LWZX(5, 3, 4));
>  	if (stepped == 1 && regs.gpr[5] == a[2])
>  		show_result("lwzx", "PASS");
>  	else
> @@ -160,7 +117,7 @@ static void __init test_std(void)
>  	regs.gpr[5] = 0x5678;
> 
>  	/* std r5, 0(r3) */
> -	stepped = emulate_step(&regs, TEST_STD(5, 3, 0));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STD(5, 3, 0));
>  	if (stepped == 1 && regs.gpr[5] == a)
>  		show_result("std", "PASS");
>  	else
> @@ -185,7 +142,7 @@ static void __init test_ldarx_stdcx(void)
>  	regs.gpr[5] = 0x5678;
> 
>  	/* ldarx r5, r3, r4, 0 */
> -	stepped = emulate_step(&regs, TEST_LDARX(5, 3, 4, 0));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LDARX(5, 3, 4, 0));
> 
>  	/*
>  	 * Don't touch 'a' here. Touching 'a' can do Load/store
> @@ -203,7 +160,7 @@ static void __init test_ldarx_stdcx(void)
>  	regs.gpr[5] = 0x9ABC;
> 
>  	/* stdcx. r5, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_STDCX(5, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STDCX(5, 3, 4));
> 
>  	/*
>  	 * Two possible scenarios that indicates successful emulation
> @@ -243,7 +200,7 @@ static void __init test_lfsx_stfsx(void)
>  	regs.gpr[4] = 0;
> 
>  	/* lfsx frt10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_LFSX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LFSX(10, 3, 4));
> 
>  	if (stepped == 1)
>  		show_result("lfsx", "PASS");
> @@ -256,7 +213,7 @@ static void __init test_lfsx_stfsx(void)
>  	c.a = 678.91;
> 
>  	/* stfsx frs10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_STFSX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STFSX(10, 3, 4));
> 
>  	if (stepped == 1 && c.b == cached_b)
>  		show_result("stfsx", "PASS");
> @@ -286,7 +243,7 @@ static void __init test_lfdx_stfdx(void)
>  	regs.gpr[4] = 0;
> 
>  	/* lfdx frt10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_LFDX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LFDX(10, 3, 4));
> 
>  	if (stepped == 1)
>  		show_result("lfdx", "PASS");
> @@ -299,7 +256,7 @@ static void __init test_lfdx_stfdx(void)
>  	c.a = 987654.32;
> 
>  	/* stfdx frs10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_STFDX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STFDX(10, 3, 4));
> 
>  	if (stepped == 1 && c.b == cached_b)
>  		show_result("stfdx", "PASS");
> @@ -345,7 +302,7 @@ static void __init test_lvx_stvx(void)
>  	regs.gpr[4] = 0;
> 
>  	/* lvx vrt10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_LVX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LVX(10, 3, 4));
> 
>  	if (stepped == 1)
>  		show_result("lvx", "PASS");
> @@ -361,7 +318,7 @@ static void __init test_lvx_stvx(void)
>  	c.b[3] = 498532;
> 
>  	/* stvx vrs10, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_STVX(10, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STVX(10, 3, 4));
> 
>  	if (stepped == 1 && cached_b[0] == c.b[0] && cached_b[1] == c.b[1] &&
>  	    cached_b[2] == c.b[2] && cached_b[3] == c.b[3])
> @@ -402,7 +359,7 @@ static void __init test_lxvd2x_stxvd2x(void)
>  	regs.gpr[4] = 0;
> 
>  	/* lxvd2x vsr39, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_LXVD2X(39, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_LXVD2X(39, R3, R4));
> 
>  	if (stepped == 1 && cpu_has_feature(CPU_FTR_VSX)) {
>  		show_result("lxvd2x", "PASS");
> @@ -422,7 +379,7 @@ static void __init test_lxvd2x_stxvd2x(void)
>  	c.b[3] = 4;
> 
>  	/* stxvd2x vsr39, r3, r4 */
> -	stepped = emulate_step(&regs, TEST_STXVD2X(39, 3, 4));
> +	stepped = emulate_step(&regs, PPC_ENCODE_STXVD2X(39, R3, R4));
> 
>  	if (stepped == 1 && cached_b[0] == c.b[0] && cached_b[1] == c.b[1] &&
>  	    cached_b[2] == c.b[2] && cached_b[3] == c.b[3] &&
> @@ -484,7 +441,7 @@ static struct compute_test compute_tests[] = {
>  		.subtests = {
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MIN",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MIN,
> @@ -492,7 +449,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MAX,
> @@ -500,7 +457,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MAX, RB = LONG_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MAX,
>  					.gpr[22] = LONG_MAX,
> @@ -508,7 +465,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = ULONG_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = ULONG_MAX,
> @@ -516,7 +473,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = 0x1",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = 0x1,
> @@ -524,7 +481,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MIN",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MIN,
> @@ -532,7 +489,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MAX,
> @@ -540,7 +497,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MAX, RB = INT_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MAX,
>  					.gpr[22] = INT_MAX,
> @@ -548,7 +505,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = UINT_MAX",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = UINT_MAX,
> @@ -556,7 +513,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = 0x1",
> -				.instr = TEST_ADD(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = 0x1,
> @@ -570,7 +527,7 @@ static struct compute_test compute_tests[] = {
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MIN",
>  				.flags = IGNORE_CCR,
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MIN,
> @@ -578,7 +535,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MAX",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MAX,
> @@ -587,7 +544,7 @@ static struct compute_test compute_tests[] = {
>  			{
>  				.descr = "RA = LONG_MAX, RB = LONG_MAX",
>  				.flags = IGNORE_CCR,
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MAX,
>  					.gpr[22] = LONG_MAX,
> @@ -595,7 +552,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = ULONG_MAX",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = ULONG_MAX,
> @@ -603,7 +560,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = 0x1",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = 0x1,
> @@ -611,7 +568,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MIN",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MIN,
> @@ -619,7 +576,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MAX",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MAX,
> @@ -627,7 +584,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MAX, RB = INT_MAX",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MAX,
>  					.gpr[22] = INT_MAX,
> @@ -635,7 +592,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = UINT_MAX",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = UINT_MAX,
> @@ -643,7 +600,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = 0x1",
> -				.instr = TEST_ADD_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADD_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = 0x1,
> @@ -656,7 +613,7 @@ static struct compute_test compute_tests[] = {
>  		.subtests = {
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MIN",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MIN,
> @@ -664,7 +621,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MAX,
> @@ -672,7 +629,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MAX, RB = LONG_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MAX,
>  					.gpr[22] = LONG_MAX,
> @@ -680,7 +637,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = ULONG_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = ULONG_MAX,
> @@ -688,7 +645,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = 0x1",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = 0x1,
> @@ -696,7 +653,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MIN",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MIN,
> @@ -704,7 +661,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MAX,
> @@ -712,7 +669,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MAX, RB = INT_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MAX,
>  					.gpr[22] = INT_MAX,
> @@ -720,7 +677,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = UINT_MAX",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = UINT_MAX,
> @@ -728,7 +685,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = 0x1",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = 0x1,
> @@ -736,7 +693,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN | INT_MIN, RB = LONG_MIN | INT_MIN",
> -				.instr = TEST_ADDC(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN | (uint)INT_MIN,
>  					.gpr[22] = LONG_MIN | (uint)INT_MIN,
> @@ -750,7 +707,7 @@ static struct compute_test compute_tests[] = {
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MIN",
>  				.flags = IGNORE_CCR,
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MIN,
> @@ -758,7 +715,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN, RB = LONG_MAX",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN,
>  					.gpr[22] = LONG_MAX,
> @@ -767,7 +724,7 @@ static struct compute_test compute_tests[] = {
>  			{
>  				.descr = "RA = LONG_MAX, RB = LONG_MAX",
>  				.flags = IGNORE_CCR,
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MAX,
>  					.gpr[22] = LONG_MAX,
> @@ -775,7 +732,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = ULONG_MAX",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = ULONG_MAX,
> @@ -783,7 +740,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = ULONG_MAX, RB = 0x1",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = ULONG_MAX,
>  					.gpr[22] = 0x1,
> @@ -791,7 +748,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MIN",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MIN,
> @@ -799,7 +756,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MIN, RB = INT_MAX",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MIN,
>  					.gpr[22] = INT_MAX,
> @@ -807,7 +764,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = INT_MAX, RB = INT_MAX",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = INT_MAX,
>  					.gpr[22] = INT_MAX,
> @@ -815,7 +772,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = UINT_MAX",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = UINT_MAX,
> @@ -823,7 +780,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = UINT_MAX, RB = 0x1",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = UINT_MAX,
>  					.gpr[22] = 0x1,
> @@ -831,7 +788,7 @@ static struct compute_test compute_tests[] = {
>  			},
>  			{
>  				.descr = "RA = LONG_MIN | INT_MIN, RB = LONG_MIN | INT_MIN",
> -				.instr = TEST_ADDC_DOT(20, 21, 22),
> +				.instr = PPC_ENCODE_ADDC_DOT(20, 21, 22),
>  				.regs = {
>  					.gpr[21] = LONG_MIN | (uint)INT_MIN,
>  					.gpr[22] = LONG_MIN | (uint)INT_MIN,
> diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
> index 55d4377ccfae..fdb09e0e16c0 100644
> --- a/arch/powerpc/net/bpf_jit.h
> +++ b/arch/powerpc/net/bpf_jit.h
> @@ -45,8 +45,6 @@
>  #define PPC_ADDIS(d, a, i)	EMIT(PPC_INST_ADDIS |			      \
>  				     ___PPC_RT(d) | ___PPC_RA(a) | IMM_L(i))
>  #define PPC_LIS(r, i)		PPC_ADDIS(r, 0, i)
> -#define PPC_STD(r, base, i)	EMIT(PPC_INST_STD | ___PPC_RS(r) |	      \
> -				     ___PPC_RA(base) | ((i) & 0xfffc))
>  #define PPC_STDX(r, base, b)	EMIT(PPC_INST_STDX | ___PPC_RS(r) |	      \
>  				     ___PPC_RA(base) | ___PPC_RB(b))
>  #define PPC_STDU(r, base, i)	EMIT(PPC_INST_STDU | ___PPC_RS(r) |	      \
> @@ -62,12 +60,8 @@
> 
>  #define PPC_LBZ(r, base, i)	EMIT(PPC_INST_LBZ | ___PPC_RT(r) |	      \
>  				     ___PPC_RA(base) | IMM_L(i))
> -#define PPC_LD(r, base, i)	EMIT(PPC_INST_LD | ___PPC_RT(r) |	      \
> -				     ___PPC_RA(base) | ((i) & 0xfffc))
>  #define PPC_LDX(r, base, b)	EMIT(PPC_INST_LDX | ___PPC_RT(r) |	      \
>  				     ___PPC_RA(base) | ___PPC_RB(b))
> -#define PPC_LWZ(r, base, i)	EMIT(PPC_INST_LWZ | ___PPC_RT(r) |	      \
> -				     ___PPC_RA(base) | IMM_L(i))
>  #define PPC_LHZ(r, base, i)	EMIT(PPC_INST_LHZ | ___PPC_RT(r) |	      \
>  				     ___PPC_RA(base) | IMM_L(i))
>  #define PPC_LHBRX(r, base, b)	EMIT(PPC_INST_LHBRX | ___PPC_RT(r) |	      \
> @@ -100,8 +94,6 @@
> 
>  #define PPC_SUB(d, a, b)	EMIT(PPC_INST_SUB | ___PPC_RT(d) |	      \
>  				     ___PPC_RB(a) | ___PPC_RA(b))
> -#define PPC_ADD(d, a, b)	EMIT(PPC_INST_ADD | ___PPC_RT(d) |	      \
> -				     ___PPC_RA(a) | ___PPC_RB(b))
>  #define PPC_MULD(d, a, b)	EMIT(PPC_INST_MULLD | ___PPC_RT(d) |	      \
>  				     ___PPC_RA(a) | ___PPC_RB(b))
>  #define PPC_MULW(d, a, b)	EMIT(PPC_INST_MULLW | ___PPC_RT(d) |	      \
> diff --git a/arch/powerpc/net/bpf_jit32.h b/arch/powerpc/net/bpf_jit32.h
> index 4ec2a9f14f84..8a9f16a7262e 100644
> --- a/arch/powerpc/net/bpf_jit32.h
> +++ b/arch/powerpc/net/bpf_jit32.h
> @@ -76,13 +76,13 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
>  		else {	PPC_ADDIS(r, base, IMM_HA(i));			      \
>  			PPC_LBZ(r, r, IMM_L(i)); } } while(0)
> 
> -#define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i);     \
> +#define _OFFS(r, base, i) do { if ((i) < 32768) EMIT(PPC_ENCODE_LD(r, base, i));     \
	   ^^^^^
Should be PPC_LD_OFFS. For the next version, please also build ppc32 and 
booke codebase to confirm that your changes in those areas are fine.

PPC_ENCODE_* also looks quite verbose, so perhaps PPC_ENC_* might be 
better. Otherwise, this patchset looks good to me and should help reuse 
some of those macros, especially from the eBPF codebase.

Michael,
Can you let us know if this looks ok to you? Based on your feedback, we 
will also update the eBPF codebase.


Thanks,
Naveen



More information about the Linuxppc-dev mailing list