• Christophe Leroy's avatar
    powerpc/bpf: Implement extended BPF on PPC32 · 51c66ad8
    Christophe Leroy authored
    Implement Extended Berkeley Packet Filter on Powerpc 32
    
    Test result with test_bpf module:
    
    	test_bpf: Summary: 378 PASSED, 0 FAILED, [354/366 JIT'ed]
    
    Registers mapping:
    
    	[BPF_REG_0] = r11-r12
    	/* function arguments */
    	[BPF_REG_1] = r3-r4
    	[BPF_REG_2] = r5-r6
    	[BPF_REG_3] = r7-r8
    	[BPF_REG_4] = r9-r10
    	[BPF_REG_5] = r21-r22 (Args 9 and 10 come in via the stack)
    	/* non volatile registers */
    	[BPF_REG_6] = r23-r24
    	[BPF_REG_7] = r25-r26
    	[BPF_REG_8] = r27-r28
    	[BPF_REG_9] = r29-r30
    	/* frame pointer aka BPF_REG_10 */
    	[BPF_REG_FP] = r17-r18
    	/* eBPF jit internal registers */
    	[BPF_REG_AX] = r19-r20
    	[TMP_REG] = r31
    
    As PPC32 doesn't have a redzone in the stack, a stack frame must always
    be set in order to host at least the tail count counter.
    
    The stack frame remains for tail calls, it is set by the first callee
    and freed by the last callee.
    
    r0 is used as temporary register as much as possible. It is referenced
    directly in the code in order to avoid misusing it, because some
    instructions interpret it as value 0 instead of register r0
    (ex: addi, addis, stw, lwz, ...)
    
    The following operations are not implemented:
    
    		case BPF_ALU64 | BPF_DIV | BPF_X: /* dst /= src */
    		case BPF_ALU64 | BPF_MOD | BPF_X: /* dst %= src */
    		case BPF_STX | BPF_XADD | BPF_DW: /* *(u64 *)(dst + off) += src */
    
    The following operations are only implemented for power of two constants:
    
    		case BPF_ALU64 | BPF_MOD | BPF_K: /* dst %= imm */
    		case BPF_ALU64 | BPF_DIV | BPF_K: /* dst /= imm */
    Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/61d8b149176ddf99e7d5cef0b6dc1598583ca202.1616430991.git.christophe.leroy@csgroup.eu
    51c66ad8
bpf_jit.h 4.93 KB