Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull more s390 updates from Martin Schwidefsky:
"The big thing in this second merge for s390 is the new eBPF JIT from
Michael which replaces the old 32-bit backend.

The remaining commits are bug fixes"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/pci: add locking for fmb access
s390/pci: extract software counters from fmb
s390/dasd: Fix unresumed device after suspend/resume having no paths
s390/dasd: fix unresumed device after suspend/resume
s390/dasd: fix inability to set a DASD device offline
s390/mm: Fix memory hotplug for unaligned standby memory
s390/bpf: Add s390x eBPF JIT compiler backend
s390: Use bool function return values of true/false not 1/0

+1375 -868
+1 -1
arch/s390/Kconfig
··· 115 115 select HAVE_ARCH_SECCOMP_FILTER 116 116 select HAVE_ARCH_TRACEHOOK 117 117 select HAVE_ARCH_TRANSPARENT_HUGEPAGE 118 - select HAVE_BPF_JIT if PACK_STACK 118 + select HAVE_BPF_JIT if PACK_STACK && HAVE_MARCH_Z9_109_FEATURES 119 119 select HAVE_CMPXCHG_DOUBLE 120 120 select HAVE_CMPXCHG_LOCAL 121 121 select HAVE_DEBUG_KMEMLEAK
+1 -1
arch/s390/include/asm/dma-mapping.h
··· 42 42 static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) 43 43 { 44 44 if (!dev->dma_mask) 45 - return 0; 45 + return false; 46 46 return addr + size - 1 <= *dev->dma_mask; 47 47 } 48 48
+6 -4
arch/s390/include/asm/pci.h
··· 7 7 #define PCI_BAR_COUNT 6 8 8 9 9 #include <linux/pci.h> 10 + #include <linux/mutex.h> 10 11 #include <asm-generic/pci.h> 11 12 #include <asm-generic/pci-dma-compat.h> 12 13 #include <asm/pci_clp.h> ··· 45 44 u64 rpcit_ops; 46 45 u64 dma_rbytes; 47 46 u64 dma_wbytes; 48 - /* software counters */ 49 - atomic64_t allocated_pages; 50 - atomic64_t mapped_pages; 51 - atomic64_t unmapped_pages; 52 47 } __packed __aligned(16); 53 48 54 49 enum zpci_state { ··· 77 80 u8 pft; /* pci function type */ 78 81 u16 domain; 79 82 83 + struct mutex lock; 80 84 u8 pfip[CLP_PFIP_NR_SEGMENTS]; /* pci function internal path */ 81 85 u32 uid; /* user defined id */ 82 86 u8 util_str[CLP_UTIL_STR_LEN]; /* utility string */ ··· 109 111 /* Function measurement block */ 110 112 struct zpci_fmb *fmb; 111 113 u16 fmb_update; /* update interval */ 114 + /* software counters */ 115 + atomic64_t allocated_pages; 116 + atomic64_t mapped_pages; 117 + atomic64_t unmapped_pages; 112 118 113 119 enum pci_bus_speed max_bus_speed; 114 120
+89 -108
arch/s390/net/bpf_jit.S
··· 1 1 /* 2 2 * BPF Jit compiler for s390, help functions. 3 3 * 4 - * Copyright IBM Corp. 2012 4 + * Copyright IBM Corp. 2012,2015 5 5 * 6 6 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> 7 + * Michael Holzheu <holzheu@linux.vnet.ibm.com> 7 8 */ 9 + 8 10 #include <linux/linkage.h> 11 + #include "bpf_jit.h" 9 12 10 13 /* 11 14 * Calling convention: 12 - * registers %r2, %r6-%r8, %r10-%r11, %r13, %r15 are call saved 13 - * %r2: skb pointer 14 - * %r3: offset parameter 15 - * %r5: BPF A accumulator 16 - * %r8: return address 17 - * %r9: save register for skb pointer 18 - * %r10: skb->data 19 - * %r11: skb->len - skb->data_len (headlen) 20 - * %r12: BPF X accumulator 15 + * registers %r7-%r10, %r11,%r13, and %r15 are call saved 16 + * 17 + * Input (64 bit): 18 + * %r3 (%b2) = offset into skb data 19 + * %r6 (%b5) = return address 20 + * %r7 (%b6) = skb pointer 21 + * %r12 = skb data pointer 22 + * 23 + * Output: 24 + * %r14= %b0 = return value (read skb value) 25 + * 26 + * Work registers: %r2,%r4,%r5,%r14 21 27 * 22 28 * skb_copy_bits takes 4 parameters: 23 29 * %r2 = skb pointer 24 30 * %r3 = offset into skb data 25 31 * %r4 = pointer to temp buffer 26 32 * %r5 = length to copy 33 + * Return value in %r2: 0 = ok 34 + * 35 + * bpf_internal_load_pointer_neg_helper takes 3 parameters: 36 + * %r2 = skb pointer 37 + * %r3 = offset into data 38 + * %r4 = length to copy 39 + * Return value in %r2: Pointer to data 27 40 */ 28 - #define SKBDATA %r8 29 41 30 - /* A = *(u32 *) (skb->data+K+X) */ 31 - ENTRY(sk_load_word_ind) 32 - ar %r3,%r12 # offset += X 33 - bmr %r8 # < 0 -> return with cc 42 + #define SKF_MAX_NEG_OFF -0x200000 /* SKF_LL_OFF from filter.h */ 34 43 35 - /* A = *(u32 *) (skb->data+K) */ 36 - ENTRY(sk_load_word) 37 - llgfr %r1,%r3 # extend offset 38 - ahi %r3,4 # offset + 4 39 - clr %r11,%r3 # hlen <= offset + 4 ? 40 - jl sk_load_word_slow 41 - l %r5,0(%r1,%r10) # get word from skb 42 - xr %r1,%r1 # set cc to zero 43 - br %r8 44 + /* 45 + * Load SIZE bytes from SKB 46 + */ 47 + #define sk_load_common(NAME, SIZE, LOAD) \ 48 + ENTRY(sk_load_##NAME); \ 49 + ltgr %r3,%r3; /* Is offset negative? */ \ 50 + jl sk_load_##NAME##_slow_neg; \ 51 + ENTRY(sk_load_##NAME##_pos); \ 52 + aghi %r3,SIZE; /* Offset + SIZE */ \ 53 + clg %r3,STK_OFF_HLEN(%r15); /* Offset + SIZE > hlen? */ \ 54 + jh sk_load_##NAME##_slow; \ 55 + LOAD %r14,-SIZE(%r3,%r12); /* Get data from skb */ \ 56 + b OFF_OK(%r6); /* Return */ \ 57 + \ 58 + sk_load_##NAME##_slow:; \ 59 + lgr %r2,%r7; /* Arg1 = skb pointer */ \ 60 + aghi %r3,-SIZE; /* Arg2 = offset */ \ 61 + la %r4,STK_OFF_TMP(%r15); /* Arg3 = temp bufffer */ \ 62 + lghi %r5,SIZE; /* Arg4 = size */ \ 63 + brasl %r14,skb_copy_bits; /* Get data from skb */ \ 64 + LOAD %r14,STK_OFF_TMP(%r15); /* Load from temp bufffer */ \ 65 + ltgr %r2,%r2; /* Set cc to (%r2 != 0) */ \ 66 + br %r6; /* Return */ 44 67 45 - sk_load_word_slow: 46 - lgr %r9,%r2 # save %r2 47 - lgr %r3,%r1 # offset 48 - la %r4,160(%r15) # pointer to temp buffer 49 - lghi %r5,4 # 4 bytes 50 - brasl %r14,skb_copy_bits # get data from skb 51 - l %r5,160(%r15) # load result from temp buffer 52 - ltgr %r2,%r2 # set cc to (%r2 != 0) 53 - lgr %r2,%r9 # restore %r2 54 - br %r8 68 + sk_load_common(word, 4, llgf) /* r14 = *(u32 *) (skb->data+offset) */ 69 + sk_load_common(half, 2, llgh) /* r14 = *(u16 *) (skb->data+offset) */ 55 70 56 - /* A = *(u16 *) (skb->data+K+X) */ 57 - ENTRY(sk_load_half_ind) 58 - ar %r3,%r12 # offset += X 59 - bmr %r8 # < 0 -> return with cc 60 - 61 - /* A = *(u16 *) (skb->data+K) */ 62 - ENTRY(sk_load_half) 63 - llgfr %r1,%r3 # extend offset 64 - ahi %r3,2 # offset + 2 65 - clr %r11,%r3 # hlen <= offset + 2 ? 66 - jl sk_load_half_slow 67 - llgh %r5,0(%r1,%r10) # get half from skb 68 - xr %r1,%r1 # set cc to zero 69 - br %r8 70 - 71 - sk_load_half_slow: 72 - lgr %r9,%r2 # save %r2 73 - lgr %r3,%r1 # offset 74 - la %r4,162(%r15) # pointer to temp buffer 75 - lghi %r5,2 # 2 bytes 76 - brasl %r14,skb_copy_bits # get data from skb 77 - xc 160(2,%r15),160(%r15) 78 - l %r5,160(%r15) # load result from temp buffer 79 - ltgr %r2,%r2 # set cc to (%r2 != 0) 80 - lgr %r2,%r9 # restore %r2 81 - br %r8 82 - 83 - /* A = *(u8 *) (skb->data+K+X) */ 84 - ENTRY(sk_load_byte_ind) 85 - ar %r3,%r12 # offset += X 86 - bmr %r8 # < 0 -> return with cc 87 - 88 - /* A = *(u8 *) (skb->data+K) */ 71 + /* 72 + * Load 1 byte from SKB (optimized version) 73 + */ 74 + /* r14 = *(u8 *) (skb->data+offset) */ 89 75 ENTRY(sk_load_byte) 90 - llgfr %r1,%r3 # extend offset 91 - clr %r11,%r3 # hlen < offset ? 92 - jle sk_load_byte_slow 93 - lhi %r5,0 94 - ic %r5,0(%r1,%r10) # get byte from skb 95 - xr %r1,%r1 # set cc to zero 96 - br %r8 76 + ltgr %r3,%r3 # Is offset negative? 77 + jl sk_load_byte_slow_neg 78 + ENTRY(sk_load_byte_pos) 79 + clg %r3,STK_OFF_HLEN(%r15) # Offset >= hlen? 80 + jnl sk_load_byte_slow 81 + llgc %r14,0(%r3,%r12) # Get byte from skb 82 + b OFF_OK(%r6) # Return OK 97 83 98 84 sk_load_byte_slow: 99 - lgr %r9,%r2 # save %r2 100 - lgr %r3,%r1 # offset 101 - la %r4,163(%r15) # pointer to temp buffer 102 - lghi %r5,1 # 1 byte 103 - brasl %r14,skb_copy_bits # get data from skb 104 - xc 160(3,%r15),160(%r15) 105 - l %r5,160(%r15) # load result from temp buffer 106 - ltgr %r2,%r2 # set cc to (%r2 != 0) 107 - lgr %r2,%r9 # restore %r2 108 - br %r8 85 + lgr %r2,%r7 # Arg1 = skb pointer 86 + # Arg2 = offset 87 + la %r4,STK_OFF_TMP(%r15) # Arg3 = pointer to temp buffer 88 + lghi %r5,1 # Arg4 = size (1 byte) 89 + brasl %r14,skb_copy_bits # Get data from skb 90 + llgc %r14,STK_OFF_TMP(%r15) # Load result from temp buffer 91 + ltgr %r2,%r2 # Set cc to (%r2 != 0) 92 + br %r6 # Return cc 109 93 110 - /* X = (*(u8 *)(skb->data+K) & 0xf) << 2 */ 111 - ENTRY(sk_load_byte_msh) 112 - llgfr %r1,%r3 # extend offset 113 - clr %r11,%r3 # hlen < offset ? 114 - jle sk_load_byte_msh_slow 115 - lhi %r12,0 116 - ic %r12,0(%r1,%r10) # get byte from skb 117 - nill %r12,0x0f 118 - sll %r12,2 119 - xr %r1,%r1 # set cc to zero 120 - br %r8 94 + #define sk_negative_common(NAME, SIZE, LOAD) \ 95 + sk_load_##NAME##_slow_neg:; \ 96 + cgfi %r3,SKF_MAX_NEG_OFF; \ 97 + jl bpf_error; \ 98 + lgr %r2,%r7; /* Arg1 = skb pointer */ \ 99 + /* Arg2 = offset */ \ 100 + lghi %r4,SIZE; /* Arg3 = size */ \ 101 + brasl %r14,bpf_internal_load_pointer_neg_helper; \ 102 + ltgr %r2,%r2; \ 103 + jz bpf_error; \ 104 + LOAD %r14,0(%r2); /* Get data from pointer */ \ 105 + xr %r3,%r3; /* Set cc to zero */ \ 106 + br %r6; /* Return cc */ 121 107 122 - sk_load_byte_msh_slow: 123 - lgr %r9,%r2 # save %r2 124 - lgr %r3,%r1 # offset 125 - la %r4,163(%r15) # pointer to temp buffer 126 - lghi %r5,1 # 1 byte 127 - brasl %r14,skb_copy_bits # get data from skb 128 - xc 160(3,%r15),160(%r15) 129 - l %r12,160(%r15) # load result from temp buffer 130 - nill %r12,0x0f 131 - sll %r12,2 132 - ltgr %r2,%r2 # set cc to (%r2 != 0) 133 - lgr %r2,%r9 # restore %r2 134 - br %r8 108 + sk_negative_common(word, 4, llgf) 109 + sk_negative_common(half, 2, llgh) 110 + sk_negative_common(byte, 1, llgc) 111 + 112 + bpf_error: 113 + # force a return 0 from jit handler 114 + ltgr %r15,%r15 # Set condition code 115 + br %r6
+58
arch/s390/net/bpf_jit.h
··· 1 + /* 2 + * BPF Jit compiler defines 3 + * 4 + * Copyright IBM Corp. 2012,2015 5 + * 6 + * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> 7 + * Michael Holzheu <holzheu@linux.vnet.ibm.com> 8 + */ 9 + 10 + #ifndef __ARCH_S390_NET_BPF_JIT_H 11 + #define __ARCH_S390_NET_BPF_JIT_H 12 + 13 + #ifndef __ASSEMBLY__ 14 + 15 + #include <linux/filter.h> 16 + #include <linux/types.h> 17 + 18 + extern u8 sk_load_word_pos[], sk_load_half_pos[], sk_load_byte_pos[]; 19 + extern u8 sk_load_word[], sk_load_half[], sk_load_byte[]; 20 + 21 + #endif /* __ASSEMBLY__ */ 22 + 23 + /* 24 + * Stackframe layout (packed stack): 25 + * 26 + * ^ high 27 + * +---------------+ | 28 + * | old backchain | | 29 + * +---------------+ | 30 + * | r15 - r6 | | 31 + * BFP -> +===============+ | 32 + * | | | 33 + * | BPF stack | | 34 + * | | | 35 + * +---------------+ | 36 + * | 8 byte hlen | | 37 + * R15+168 -> +---------------+ | 38 + * | 4 byte align | | 39 + * +---------------+ | 40 + * | 4 byte temp | | 41 + * | for bpf_jit.S | | 42 + * R15+160 -> +---------------+ | 43 + * | new backchain | | 44 + * R15+152 -> +---------------+ | 45 + * | + 152 byte SA | | 46 + * R15 -> +---------------+ + low 47 + * 48 + * We get 160 bytes stack space from calling function, but only use 49 + * 11 * 8 byte (old backchain + r15 - r6) for storing registers. 50 + */ 51 + #define STK_OFF (MAX_BPF_STACK + 8 + 4 + 4 + (160 - 11 * 8)) 52 + #define STK_OFF_TMP 160 /* Offset of tmp buffer on stack */ 53 + #define STK_OFF_HLEN 168 /* Offset of SKB header length on stack */ 54 + 55 + /* Offset to skip condition code check */ 56 + #define OFF_OK 4 57 + 58 + #endif /* __ARCH_S390_NET_BPF_JIT_H */
+1113 -721
arch/s390/net/bpf_jit_comp.c
··· 1 1 /* 2 2 * BPF Jit compiler for s390. 3 3 * 4 - * Copyright IBM Corp. 2012 4 + * Minimum build requirements: 5 + * 6 + * - HAVE_MARCH_Z196_FEATURES: laal, laalg 7 + * - HAVE_MARCH_Z10_FEATURES: msfi, cgrj, clgrj 8 + * - HAVE_MARCH_Z9_109_FEATURES: alfi, llilf, clfi, oilf, nilf 9 + * - PACK_STACK 10 + * - 64BIT 11 + * 12 + * Copyright IBM Corp. 2012,2015 5 13 * 6 14 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> 15 + * Michael Holzheu <holzheu@linux.vnet.ibm.com> 7 16 */ 17 + 18 + #define KMSG_COMPONENT "bpf_jit" 19 + #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 20 + 8 21 #include <linux/netdevice.h> 9 - #include <linux/if_vlan.h> 10 22 #include <linux/filter.h> 11 23 #include <linux/init.h> 12 24 #include <asm/cacheflush.h> 13 - #include <asm/facility.h> 14 25 #include <asm/dis.h> 26 + #include "bpf_jit.h" 15 27 16 - /* 17 - * Conventions: 18 - * %r2 = skb pointer 19 - * %r3 = offset parameter 20 - * %r4 = scratch register / length parameter 21 - * %r5 = BPF A accumulator 22 - * %r8 = return address 23 - * %r9 = save register for skb pointer 24 - * %r10 = skb->data 25 - * %r11 = skb->len - skb->data_len (headlen) 26 - * %r12 = BPF X accumulator 27 - * %r13 = literal pool pointer 28 - * 0(%r15) - 63(%r15) scratch memory array with BPF_MEMWORDS 29 - */ 30 28 int bpf_jit_enable __read_mostly; 31 29 32 - /* 33 - * assembly code in arch/x86/net/bpf_jit.S 34 - */ 35 - extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[]; 36 - extern u8 sk_load_word_ind[], sk_load_half_ind[], sk_load_byte_ind[]; 37 - 38 30 struct bpf_jit { 39 - unsigned int seen; 40 - u8 *start; 41 - u8 *prg; 42 - u8 *mid; 43 - u8 *lit; 44 - u8 *end; 45 - u8 *base_ip; 46 - u8 *ret0_ip; 47 - u8 *exit_ip; 48 - unsigned int off_load_word; 49 - unsigned int off_load_half; 50 - unsigned int off_load_byte; 51 - unsigned int off_load_bmsh; 52 - unsigned int off_load_iword; 53 - unsigned int off_load_ihalf; 54 - unsigned int off_load_ibyte; 31 + u32 seen; /* Flags to remember seen eBPF instructions */ 32 + u32 seen_reg[16]; /* Array to remember which registers are used */ 33 + u32 *addrs; /* Array with relative instruction addresses */ 34 + u8 *prg_buf; /* Start of program */ 35 + int size; /* Size of program and literal pool */ 36 + int size_prg; /* Size of program */ 37 + int prg; /* Current position in program */ 38 + int lit_start; /* Start of literal pool */ 39 + int lit; /* Current position in literal pool */ 40 + int base_ip; /* Base address for literal pool */ 41 + int ret0_ip; /* Address of return 0 */ 42 + int exit_ip; /* Address of exit */ 55 43 }; 56 44 57 45 #define BPF_SIZE_MAX 4096 /* Max size for program */ 58 46 59 - #define SEEN_DATAREF 1 /* might call external helpers */ 60 - #define SEEN_XREG 2 /* ebx is used */ 61 - #define SEEN_MEM 4 /* use mem[] for temporary storage */ 62 - #define SEEN_RET0 8 /* pc_ret0 points to a valid return 0 */ 63 - #define SEEN_LITERAL 16 /* code uses literals */ 64 - #define SEEN_LOAD_WORD 32 /* code uses sk_load_word */ 65 - #define SEEN_LOAD_HALF 64 /* code uses sk_load_half */ 66 - #define SEEN_LOAD_BYTE 128 /* code uses sk_load_byte */ 67 - #define SEEN_LOAD_BMSH 256 /* code uses sk_load_byte_msh */ 68 - #define SEEN_LOAD_IWORD 512 /* code uses sk_load_word_ind */ 69 - #define SEEN_LOAD_IHALF 1024 /* code uses sk_load_half_ind */ 70 - #define SEEN_LOAD_IBYTE 2048 /* code uses sk_load_byte_ind */ 47 + #define SEEN_SKB 1 /* skb access */ 48 + #define SEEN_MEM 2 /* use mem[] for temporary storage */ 49 + #define SEEN_RET0 4 /* ret0_ip points to a valid return 0 */ 50 + #define SEEN_LITERAL 8 /* code uses literals */ 51 + #define SEEN_FUNC 16 /* calls C functions */ 52 + #define SEEN_STACK (SEEN_FUNC | SEEN_MEM | SEEN_SKB) 71 53 72 - #define EMIT2(op) \ 73 - ({ \ 74 - if (jit->prg + 2 <= jit->mid) \ 75 - *(u16 *) jit->prg = op; \ 76 - jit->prg += 2; \ 77 - }) 54 + /* 55 + * s390 registers 56 + */ 57 + #define REG_W0 (__MAX_BPF_REG+0) /* Work register 1 (even) */ 58 + #define REG_W1 (__MAX_BPF_REG+1) /* Work register 2 (odd) */ 59 + #define REG_SKB_DATA (__MAX_BPF_REG+2) /* SKB data register */ 60 + #define REG_L (__MAX_BPF_REG+3) /* Literal pool register */ 61 + #define REG_15 (__MAX_BPF_REG+4) /* Register 15 */ 62 + #define REG_0 REG_W0 /* Register 0 */ 63 + #define REG_2 BPF_REG_1 /* Register 2 */ 64 + #define REG_14 BPF_REG_0 /* Register 14 */ 78 65 79 - #define EMIT4(op) \ 80 - ({ \ 81 - if (jit->prg + 4 <= jit->mid) \ 82 - *(u32 *) jit->prg = op; \ 83 - jit->prg += 4; \ 84 - }) 66 + /* 67 + * Mapping of BPF registers to s390 registers 68 + */ 69 + static const int reg2hex[] = { 70 + /* Return code */ 71 + [BPF_REG_0] = 14, 72 + /* Function parameters */ 73 + [BPF_REG_1] = 2, 74 + [BPF_REG_2] = 3, 75 + [BPF_REG_3] = 4, 76 + [BPF_REG_4] = 5, 77 + [BPF_REG_5] = 6, 78 + /* Call saved registers */ 79 + [BPF_REG_6] = 7, 80 + [BPF_REG_7] = 8, 81 + [BPF_REG_8] = 9, 82 + [BPF_REG_9] = 10, 83 + /* BPF stack pointer */ 84 + [BPF_REG_FP] = 13, 85 + /* SKB data pointer */ 86 + [REG_SKB_DATA] = 12, 87 + /* Work registers for s390x backend */ 88 + [REG_W0] = 0, 89 + [REG_W1] = 1, 90 + [REG_L] = 11, 91 + [REG_15] = 15, 92 + }; 85 93 86 - #define EMIT4_DISP(op, disp) \ 87 - ({ \ 88 - unsigned int __disp = (disp) & 0xfff; \ 89 - EMIT4(op | __disp); \ 90 - }) 91 - 92 - #define EMIT4_IMM(op, imm) \ 93 - ({ \ 94 - unsigned int __imm = (imm) & 0xffff; \ 95 - EMIT4(op | __imm); \ 96 - }) 97 - 98 - #define EMIT4_PCREL(op, pcrel) \ 99 - ({ \ 100 - long __pcrel = ((pcrel) >> 1) & 0xffff; \ 101 - EMIT4(op | __pcrel); \ 102 - }) 103 - 104 - #define EMIT6(op1, op2) \ 105 - ({ \ 106 - if (jit->prg + 6 <= jit->mid) { \ 107 - *(u32 *) jit->prg = op1; \ 108 - *(u16 *) (jit->prg + 4) = op2; \ 109 - } \ 110 - jit->prg += 6; \ 111 - }) 112 - 113 - #define EMIT6_DISP(op1, op2, disp) \ 114 - ({ \ 115 - unsigned int __disp = (disp) & 0xfff; \ 116 - EMIT6(op1 | __disp, op2); \ 117 - }) 118 - 119 - #define EMIT6_IMM(op, imm) \ 120 - ({ \ 121 - unsigned int __imm = (imm); \ 122 - EMIT6(op | (__imm >> 16), __imm & 0xffff); \ 123 - }) 124 - 125 - #define EMIT_CONST(val) \ 126 - ({ \ 127 - unsigned int ret; \ 128 - ret = (unsigned int) (jit->lit - jit->base_ip); \ 129 - jit->seen |= SEEN_LITERAL; \ 130 - if (jit->lit + 4 <= jit->end) \ 131 - *(u32 *) jit->lit = val; \ 132 - jit->lit += 4; \ 133 - ret; \ 134 - }) 135 - 136 - #define EMIT_FN_CONST(bit, fn) \ 137 - ({ \ 138 - unsigned int ret; \ 139 - ret = (unsigned int) (jit->lit - jit->base_ip); \ 140 - if (jit->seen & bit) { \ 141 - jit->seen |= SEEN_LITERAL; \ 142 - if (jit->lit + 8 <= jit->end) \ 143 - *(void **) jit->lit = fn; \ 144 - jit->lit += 8; \ 145 - } \ 146 - ret; \ 147 - }) 148 - 149 - static void bpf_jit_fill_hole(void *area, unsigned int size) 94 + static inline u32 reg(u32 dst_reg, u32 src_reg) 150 95 { 151 - /* Fill whole space with illegal instructions */ 96 + return reg2hex[dst_reg] << 4 | reg2hex[src_reg]; 97 + } 98 + 99 + static inline u32 reg_high(u32 reg) 100 + { 101 + return reg2hex[reg] << 4; 102 + } 103 + 104 + static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) 105 + { 106 + u32 r1 = reg2hex[b1]; 107 + 108 + if (!jit->seen_reg[r1] && r1 >= 6 && r1 <= 15) 109 + jit->seen_reg[r1] = 1; 110 + } 111 + 112 + #define REG_SET_SEEN(b1) \ 113 + ({ \ 114 + reg_set_seen(jit, b1); \ 115 + }) 116 + 117 + #define REG_SEEN(b1) jit->seen_reg[reg2hex[(b1)]] 118 + 119 + /* 120 + * EMIT macros for code generation 121 + */ 122 + 123 + #define _EMIT2(op) \ 124 + ({ \ 125 + if (jit->prg_buf) \ 126 + *(u16 *) (jit->prg_buf + jit->prg) = op; \ 127 + jit->prg += 2; \ 128 + }) 129 + 130 + #define EMIT2(op, b1, b2) \ 131 + ({ \ 132 + _EMIT2(op | reg(b1, b2)); \ 133 + REG_SET_SEEN(b1); \ 134 + REG_SET_SEEN(b2); \ 135 + }) 136 + 137 + #define _EMIT4(op) \ 138 + ({ \ 139 + if (jit->prg_buf) \ 140 + *(u32 *) (jit->prg_buf + jit->prg) = op; \ 141 + jit->prg += 4; \ 142 + }) 143 + 144 + #define EMIT4(op, b1, b2) \ 145 + ({ \ 146 + _EMIT4(op | reg(b1, b2)); \ 147 + REG_SET_SEEN(b1); \ 148 + REG_SET_SEEN(b2); \ 149 + }) 150 + 151 + #define EMIT4_RRF(op, b1, b2, b3) \ 152 + ({ \ 153 + _EMIT4(op | reg_high(b3) << 8 | reg(b1, b2)); \ 154 + REG_SET_SEEN(b1); \ 155 + REG_SET_SEEN(b2); \ 156 + REG_SET_SEEN(b3); \ 157 + }) 158 + 159 + #define _EMIT4_DISP(op, disp) \ 160 + ({ \ 161 + unsigned int __disp = (disp) & 0xfff; \ 162 + _EMIT4(op | __disp); \ 163 + }) 164 + 165 + #define EMIT4_DISP(op, b1, b2, disp) \ 166 + ({ \ 167 + _EMIT4_DISP(op | reg_high(b1) << 16 | \ 168 + reg_high(b2) << 8, disp); \ 169 + REG_SET_SEEN(b1); \ 170 + REG_SET_SEEN(b2); \ 171 + }) 172 + 173 + #define EMIT4_IMM(op, b1, imm) \ 174 + ({ \ 175 + unsigned int __imm = (imm) & 0xffff; \ 176 + _EMIT4(op | reg_high(b1) << 16 | __imm); \ 177 + REG_SET_SEEN(b1); \ 178 + }) 179 + 180 + #define EMIT4_PCREL(op, pcrel) \ 181 + ({ \ 182 + long __pcrel = ((pcrel) >> 1) & 0xffff; \ 183 + _EMIT4(op | __pcrel); \ 184 + }) 185 + 186 + #define _EMIT6(op1, op2) \ 187 + ({ \ 188 + if (jit->prg_buf) { \ 189 + *(u32 *) (jit->prg_buf + jit->prg) = op1; \ 190 + *(u16 *) (jit->prg_buf + jit->prg + 4) = op2; \ 191 + } \ 192 + jit->prg += 6; \ 193 + }) 194 + 195 + #define _EMIT6_DISP(op1, op2, disp) \ 196 + ({ \ 197 + unsigned int __disp = (disp) & 0xfff; \ 198 + _EMIT6(op1 | __disp, op2); \ 199 + }) 200 + 201 + #define EMIT6_DISP(op1, op2, b1, b2, b3, disp) \ 202 + ({ \ 203 + _EMIT6_DISP(op1 | reg(b1, b2) << 16 | \ 204 + reg_high(b3) << 8, op2, disp); \ 205 + REG_SET_SEEN(b1); \ 206 + REG_SET_SEEN(b2); \ 207 + REG_SET_SEEN(b3); \ 208 + }) 209 + 210 + #define _EMIT6_DISP_LH(op1, op2, disp) \ 211 + ({ \ 212 + unsigned int __disp_h = ((u32)disp) & 0xff000; \ 213 + unsigned int __disp_l = ((u32)disp) & 0x00fff; \ 214 + _EMIT6(op1 | __disp_l, op2 | __disp_h >> 4); \ 215 + }) 216 + 217 + #define EMIT6_DISP_LH(op1, op2, b1, b2, b3, disp) \ 218 + ({ \ 219 + _EMIT6_DISP_LH(op1 | reg(b1, b2) << 16 | \ 220 + reg_high(b3) << 8, op2, disp); \ 221 + REG_SET_SEEN(b1); \ 222 + REG_SET_SEEN(b2); \ 223 + REG_SET_SEEN(b3); \ 224 + }) 225 + 226 + #define EMIT6_PCREL(op1, op2, b1, b2, i, off, mask) \ 227 + ({ \ 228 + /* Branch instruction needs 6 bytes */ \ 229 + int rel = (addrs[i + off + 1] - (addrs[i + 1] - 6)) / 2;\ 230 + _EMIT6(op1 | reg(b1, b2) << 16 | rel, op2 | mask); \ 231 + REG_SET_SEEN(b1); \ 232 + REG_SET_SEEN(b2); \ 233 + }) 234 + 235 + #define _EMIT6_IMM(op, imm) \ 236 + ({ \ 237 + unsigned int __imm = (imm); \ 238 + _EMIT6(op | (__imm >> 16), __imm & 0xffff); \ 239 + }) 240 + 241 + #define EMIT6_IMM(op, b1, imm) \ 242 + ({ \ 243 + _EMIT6_IMM(op | reg_high(b1) << 16, imm); \ 244 + REG_SET_SEEN(b1); \ 245 + }) 246 + 247 + #define EMIT_CONST_U32(val) \ 248 + ({ \ 249 + unsigned int ret; \ 250 + ret = jit->lit - jit->base_ip; \ 251 + jit->seen |= SEEN_LITERAL; \ 252 + if (jit->prg_buf) \ 253 + *(u32 *) (jit->prg_buf + jit->lit) = (u32) val; \ 254 + jit->lit += 4; \ 255 + ret; \ 256 + }) 257 + 258 + #define EMIT_CONST_U64(val) \ 259 + ({ \ 260 + unsigned int ret; \ 261 + ret = jit->lit - jit->base_ip; \ 262 + jit->seen |= SEEN_LITERAL; \ 263 + if (jit->prg_buf) \ 264 + *(u64 *) (jit->prg_buf + jit->lit) = (u64) val; \ 265 + jit->lit += 8; \ 266 + ret; \ 267 + }) 268 + 269 + #define EMIT_ZERO(b1) \ 270 + ({ \ 271 + /* llgfr %dst,%dst (zero extend to 64 bit) */ \ 272 + EMIT4(0xb9160000, b1, b1); \ 273 + REG_SET_SEEN(b1); \ 274 + }) 275 + 276 + /* 277 + * Fill whole space with illegal instructions 278 + */ 279 + static void jit_fill_hole(void *area, unsigned int size) 280 + { 152 281 memset(area, 0, size); 153 282 } 154 283 284 + /* 285 + * Save registers from "rs" (register start) to "re" (register end) on stack 286 + */ 287 + static void save_regs(struct bpf_jit *jit, u32 rs, u32 re) 288 + { 289 + u32 off = 72 + (rs - 6) * 8; 290 + 291 + if (rs == re) 292 + /* stg %rs,off(%r15) */ 293 + _EMIT6(0xe300f000 | rs << 20 | off, 0x0024); 294 + else 295 + /* stmg %rs,%re,off(%r15) */ 296 + _EMIT6_DISP(0xeb00f000 | rs << 20 | re << 16, 0x0024, off); 297 + } 298 + 299 + /* 300 + * Restore registers from "rs" (register start) to "re" (register end) on stack 301 + */ 302 + static void restore_regs(struct bpf_jit *jit, u32 rs, u32 re) 303 + { 304 + u32 off = 72 + (rs - 6) * 8; 305 + 306 + if (jit->seen & SEEN_STACK) 307 + off += STK_OFF; 308 + 309 + if (rs == re) 310 + /* lg %rs,off(%r15) */ 311 + _EMIT6(0xe300f000 | rs << 20 | off, 0x0004); 312 + else 313 + /* lmg %rs,%re,off(%r15) */ 314 + _EMIT6_DISP(0xeb00f000 | rs << 20 | re << 16, 0x0004, off); 315 + } 316 + 317 + /* 318 + * Return first seen register (from start) 319 + */ 320 + static int get_start(struct bpf_jit *jit, int start) 321 + { 322 + int i; 323 + 324 + for (i = start; i <= 15; i++) { 325 + if (jit->seen_reg[i]) 326 + return i; 327 + } 328 + return 0; 329 + } 330 + 331 + /* 332 + * Return last seen register (from start) (gap >= 2) 333 + */ 334 + static int get_end(struct bpf_jit *jit, int start) 335 + { 336 + int i; 337 + 338 + for (i = start; i < 15; i++) { 339 + if (!jit->seen_reg[i] && !jit->seen_reg[i + 1]) 340 + return i - 1; 341 + } 342 + return jit->seen_reg[15] ? 15 : 14; 343 + } 344 + 345 + #define REGS_SAVE 1 346 + #define REGS_RESTORE 0 347 + /* 348 + * Save and restore clobbered registers (6-15) on stack. 349 + * We save/restore registers in chunks with gap >= 2 registers. 350 + */ 351 + static void save_restore_regs(struct bpf_jit *jit, int op) 352 + { 353 + 354 + int re = 6, rs; 355 + 356 + do { 357 + rs = get_start(jit, re); 358 + if (!rs) 359 + break; 360 + re = get_end(jit, rs + 1); 361 + if (op == REGS_SAVE) 362 + save_regs(jit, rs, re); 363 + else 364 + restore_regs(jit, rs, re); 365 + re++; 366 + } while (re <= 15); 367 + } 368 + 369 + /* 370 + * Emit function prologue 371 + * 372 + * Save registers and create stack frame if necessary. 373 + * See stack frame layout desription in "bpf_jit.h"! 374 + */ 155 375 static void bpf_jit_prologue(struct bpf_jit *jit) 156 376 { 157 - /* Save registers and create stack frame if necessary */ 158 - if (jit->seen & SEEN_DATAREF) { 159 - /* stmg %r8,%r15,88(%r15) */ 160 - EMIT6(0xeb8ff058, 0x0024); 161 - /* lgr %r14,%r15 */ 162 - EMIT4(0xb90400ef); 163 - /* aghi %r15,<offset> */ 164 - EMIT4_IMM(0xa7fb0000, (jit->seen & SEEN_MEM) ? -112 : -80); 165 - /* stg %r14,152(%r15) */ 166 - EMIT6(0xe3e0f098, 0x0024); 167 - } else if ((jit->seen & SEEN_XREG) && (jit->seen & SEEN_LITERAL)) 168 - /* stmg %r12,%r13,120(%r15) */ 169 - EMIT6(0xebcdf078, 0x0024); 170 - else if (jit->seen & SEEN_XREG) 171 - /* stg %r12,120(%r15) */ 172 - EMIT6(0xe3c0f078, 0x0024); 173 - else if (jit->seen & SEEN_LITERAL) 174 - /* stg %r13,128(%r15) */ 175 - EMIT6(0xe3d0f080, 0x0024); 176 - 377 + /* Save registers */ 378 + save_restore_regs(jit, REGS_SAVE); 177 379 /* Setup literal pool */ 178 380 if (jit->seen & SEEN_LITERAL) { 179 381 /* basr %r13,0 */ 180 - EMIT2(0x0dd0); 382 + EMIT2(0x0d00, REG_L, REG_0); 181 383 jit->base_ip = jit->prg; 182 384 } 183 - jit->off_load_word = EMIT_FN_CONST(SEEN_LOAD_WORD, sk_load_word); 184 - jit->off_load_half = EMIT_FN_CONST(SEEN_LOAD_HALF, sk_load_half); 185 - jit->off_load_byte = EMIT_FN_CONST(SEEN_LOAD_BYTE, sk_load_byte); 186 - jit->off_load_bmsh = EMIT_FN_CONST(SEEN_LOAD_BMSH, sk_load_byte_msh); 187 - jit->off_load_iword = EMIT_FN_CONST(SEEN_LOAD_IWORD, sk_load_word_ind); 188 - jit->off_load_ihalf = EMIT_FN_CONST(SEEN_LOAD_IHALF, sk_load_half_ind); 189 - jit->off_load_ibyte = EMIT_FN_CONST(SEEN_LOAD_IBYTE, sk_load_byte_ind); 190 - 191 - /* Filter needs to access skb data */ 192 - if (jit->seen & SEEN_DATAREF) { 193 - /* l %r11,<len>(%r2) */ 194 - EMIT4_DISP(0x58b02000, offsetof(struct sk_buff, len)); 195 - /* s %r11,<data_len>(%r2) */ 196 - EMIT4_DISP(0x5bb02000, offsetof(struct sk_buff, data_len)); 197 - /* lg %r10,<data>(%r2) */ 198 - EMIT6_DISP(0xe3a02000, 0x0004, 199 - offsetof(struct sk_buff, data)); 385 + /* Setup stack and backchain */ 386 + if (jit->seen & SEEN_STACK) { 387 + /* lgr %bfp,%r15 (BPF frame pointer) */ 388 + EMIT4(0xb9040000, BPF_REG_FP, REG_15); 389 + /* aghi %r15,-STK_OFF */ 390 + EMIT4_IMM(0xa70b0000, REG_15, -STK_OFF); 391 + if (jit->seen & SEEN_FUNC) 392 + /* stg %bfp,152(%r15) (backchain) */ 393 + EMIT6_DISP_LH(0xe3000000, 0x0024, BPF_REG_FP, REG_0, 394 + REG_15, 152); 200 395 } 396 + /* 397 + * For SKB access %b1 contains the SKB pointer. For "bpf_jit.S" 398 + * we store the SKB header length on the stack and the SKB data 399 + * pointer in REG_SKB_DATA. 400 + */ 401 + if (jit->seen & SEEN_SKB) { 402 + /* Header length: llgf %w1,<len>(%b1) */ 403 + EMIT6_DISP_LH(0xe3000000, 0x0016, REG_W1, REG_0, BPF_REG_1, 404 + offsetof(struct sk_buff, len)); 405 + /* s %w1,<data_len>(%b1) */ 406 + EMIT4_DISP(0x5b000000, REG_W1, BPF_REG_1, 407 + offsetof(struct sk_buff, data_len)); 408 + /* stg %w1,ST_OFF_HLEN(%r0,%r15) */ 409 + EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W1, REG_0, REG_15, 410 + STK_OFF_HLEN); 411 + /* lg %skb_data,data_off(%b1) */ 412 + EMIT6_DISP_LH(0xe3000000, 0x0004, REG_SKB_DATA, REG_0, 413 + BPF_REG_1, offsetof(struct sk_buff, data)); 414 + } 415 + /* BPF compatibility: clear A (%b7) and X (%b8) registers */ 416 + if (REG_SEEN(BPF_REG_7)) 417 + /* lghi %b7,0 */ 418 + EMIT4_IMM(0xa7090000, BPF_REG_7, 0); 419 + if (REG_SEEN(BPF_REG_8)) 420 + /* lghi %b8,0 */ 421 + EMIT4_IMM(0xa7090000, BPF_REG_8, 0); 201 422 } 202 423 424 + /* 425 + * Function epilogue 426 + */ 203 427 static void bpf_jit_epilogue(struct bpf_jit *jit) 204 428 { 205 429 /* Return 0 */ 206 430 if (jit->seen & SEEN_RET0) { 207 431 jit->ret0_ip = jit->prg; 208 - /* lghi %r2,0 */ 209 - EMIT4(0xa7290000); 432 + /* lghi %b0,0 */ 433 + EMIT4_IMM(0xa7090000, BPF_REG_0, 0); 210 434 } 211 435 jit->exit_ip = jit->prg; 436 + /* Load exit code: lgr %r2,%b0 */ 437 + EMIT4(0xb9040000, REG_2, BPF_REG_0); 212 438 /* Restore registers */ 213 - if (jit->seen & SEEN_DATAREF) 214 - /* lmg %r8,%r15,<offset>(%r15) */ 215 - EMIT6_DISP(0xeb8ff000, 0x0004, 216 - (jit->seen & SEEN_MEM) ? 200 : 168); 217 - else if ((jit->seen & SEEN_XREG) && (jit->seen & SEEN_LITERAL)) 218 - /* lmg %r12,%r13,120(%r15) */ 219 - EMIT6(0xebcdf078, 0x0004); 220 - else if (jit->seen & SEEN_XREG) 221 - /* lg %r12,120(%r15) */ 222 - EMIT6(0xe3c0f078, 0x0004); 223 - else if (jit->seen & SEEN_LITERAL) 224 - /* lg %r13,128(%r15) */ 225 - EMIT6(0xe3d0f080, 0x0004); 439 + save_restore_regs(jit, REGS_RESTORE); 226 440 /* br %r14 */ 227 - EMIT2(0x07fe); 441 + _EMIT2(0x07fe); 228 442 } 229 443 230 444 /* 231 - * make sure we dont leak kernel information to user 445 + * Compile one eBPF instruction into s390x code 232 446 */ 233 - static void bpf_jit_noleaks(struct bpf_jit *jit, struct sock_filter *filter) 447 + static int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i) 234 448 { 235 - /* Clear temporary memory if (seen & SEEN_MEM) */ 236 - if (jit->seen & SEEN_MEM) 237 - /* xc 0(64,%r15),0(%r15) */ 238 - EMIT6(0xd73ff000, 0xf000); 239 - /* Clear X if (seen & SEEN_XREG) */ 240 - if (jit->seen & SEEN_XREG) 241 - /* lhi %r12,0 */ 242 - EMIT4(0xa7c80000); 243 - /* Clear A if the first register does not set it. */ 244 - switch (filter[0].code) { 245 - case BPF_LD | BPF_W | BPF_ABS: 246 - case BPF_LD | BPF_H | BPF_ABS: 247 - case BPF_LD | BPF_B | BPF_ABS: 248 - case BPF_LD | BPF_W | BPF_LEN: 249 - case BPF_LD | BPF_W | BPF_IND: 250 - case BPF_LD | BPF_H | BPF_IND: 251 - case BPF_LD | BPF_B | BPF_IND: 252 - case BPF_LD | BPF_IMM: 253 - case BPF_LD | BPF_MEM: 254 - case BPF_MISC | BPF_TXA: 255 - case BPF_RET | BPF_K: 256 - /* first instruction sets A register */ 449 + struct bpf_insn *insn = &fp->insnsi[i]; 450 + int jmp_off, last, insn_count = 1; 451 + unsigned int func_addr, mask; 452 + u32 dst_reg = insn->dst_reg; 453 + u32 src_reg = insn->src_reg; 454 + u32 *addrs = jit->addrs; 455 + s32 imm = insn->imm; 456 + s16 off = insn->off; 457 + 458 + switch (insn->code) { 459 + /* 460 + * BPF_MOV 461 + */ 462 + case BPF_ALU | BPF_MOV | BPF_X: /* dst = (u32) src */ 463 + /* llgfr %dst,%src */ 464 + EMIT4(0xb9160000, dst_reg, src_reg); 257 465 break; 258 - default: /* A = 0 */ 259 - /* lhi %r5,0 */ 260 - EMIT4(0xa7580000); 466 + case BPF_ALU64 | BPF_MOV | BPF_X: /* dst = src */ 467 + /* lgr %dst,%src */ 468 + EMIT4(0xb9040000, dst_reg, src_reg); 469 + break; 470 + case BPF_ALU | BPF_MOV | BPF_K: /* dst = (u32) imm */ 471 + /* llilf %dst,imm */ 472 + EMIT6_IMM(0xc00f0000, dst_reg, imm); 473 + break; 474 + case BPF_ALU64 | BPF_MOV | BPF_K: /* dst = imm */ 475 + /* lgfi %dst,imm */ 476 + EMIT6_IMM(0xc0010000, dst_reg, imm); 477 + break; 478 + /* 479 + * BPF_LD 64 480 + */ 481 + case BPF_LD | BPF_IMM | BPF_DW: /* dst = (u64) imm */ 482 + { 483 + /* 16 byte instruction that uses two 'struct bpf_insn' */ 484 + u64 imm64; 485 + 486 + imm64 = (u64)(u32) insn[0].imm | ((u64)(u32) insn[1].imm) << 32; 487 + /* lg %dst,<d(imm)>(%l) */ 488 + EMIT6_DISP_LH(0xe3000000, 0x0004, dst_reg, REG_0, REG_L, 489 + EMIT_CONST_U64(imm64)); 490 + insn_count = 2; 491 + break; 261 492 } 262 - } 493 + /* 494 + * BPF_ADD 495 + */ 496 + case BPF_ALU | BPF_ADD | BPF_X: /* dst = (u32) dst + (u32) src */ 497 + /* ar %dst,%src */ 498 + EMIT2(0x1a00, dst_reg, src_reg); 499 + EMIT_ZERO(dst_reg); 500 + break; 501 + case BPF_ALU64 | BPF_ADD | BPF_X: /* dst = dst + src */ 502 + /* agr %dst,%src */ 503 + EMIT4(0xb9080000, dst_reg, src_reg); 504 + break; 505 + case BPF_ALU | BPF_ADD | BPF_K: /* dst = (u32) dst + (u32) imm */ 506 + if (!imm) 507 + break; 508 + /* alfi %dst,imm */ 509 + EMIT6_IMM(0xc20b0000, dst_reg, imm); 510 + EMIT_ZERO(dst_reg); 511 + break; 512 + case BPF_ALU64 | BPF_ADD | BPF_K: /* dst = dst + imm */ 513 + if (!imm) 514 + break; 515 + /* agfi %dst,imm */ 516 + EMIT6_IMM(0xc2080000, dst_reg, imm); 517 + break; 518 + /* 519 + * BPF_SUB 520 + */ 521 + case BPF_ALU | BPF_SUB | BPF_X: /* dst = (u32) dst - (u32) src */ 522 + /* sr %dst,%src */ 523 + EMIT2(0x1b00, dst_reg, src_reg); 524 + EMIT_ZERO(dst_reg); 525 + break; 526 + case BPF_ALU64 | BPF_SUB | BPF_X: /* dst = dst - src */ 527 + /* sgr %dst,%src */ 528 + EMIT4(0xb9090000, dst_reg, src_reg); 529 + break; 530 + case BPF_ALU | BPF_SUB | BPF_K: /* dst = (u32) dst - (u32) imm */ 531 + if (!imm) 532 + break; 533 + /* alfi %dst,-imm */ 534 + EMIT6_IMM(0xc20b0000, dst_reg, -imm); 535 + EMIT_ZERO(dst_reg); 536 + break; 537 + case BPF_ALU64 | BPF_SUB | BPF_K: /* dst = dst - imm */ 538 + if (!imm) 539 + break; 540 + /* agfi %dst,-imm */ 541 + EMIT6_IMM(0xc2080000, dst_reg, -imm); 542 + break; 543 + /* 544 + * BPF_MUL 545 + */ 546 + case BPF_ALU | BPF_MUL | BPF_X: /* dst = (u32) dst * (u32) src */ 547 + /* msr %dst,%src */ 548 + EMIT4(0xb2520000, dst_reg, src_reg); 549 + EMIT_ZERO(dst_reg); 550 + break; 551 + case BPF_ALU64 | BPF_MUL | BPF_X: /* dst = dst * src */ 552 + /* msgr %dst,%src */ 553 + EMIT4(0xb90c0000, dst_reg, src_reg); 554 + break; 555 + case BPF_ALU | BPF_MUL | BPF_K: /* dst = (u32) dst * (u32) imm */ 556 + if (imm == 1) 557 + break; 558 + /* msfi %r5,imm */ 559 + EMIT6_IMM(0xc2010000, dst_reg, imm); 560 + EMIT_ZERO(dst_reg); 561 + break; 562 + case BPF_ALU64 | BPF_MUL | BPF_K: /* dst = dst * imm */ 563 + if (imm == 1) 564 + break; 565 + /* msgfi %dst,imm */ 566 + EMIT6_IMM(0xc2000000, dst_reg, imm); 567 + break; 568 + /* 569 + * BPF_DIV / BPF_MOD 570 + */ 571 + case BPF_ALU | BPF_DIV | BPF_X: /* dst = (u32) dst / (u32) src */ 572 + case BPF_ALU | BPF_MOD | BPF_X: /* dst = (u32) dst % (u32) src */ 573 + { 574 + int rc_reg = BPF_OP(insn->code) == BPF_DIV ? REG_W1 : REG_W0; 263 575 264 - static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, 265 - unsigned int *addrs, int i, int last) 266 - { 267 - unsigned int K; 268 - int offset; 269 - unsigned int mask; 270 - u16 code; 271 - 272 - K = filter->k; 273 - code = bpf_anc_helper(filter); 274 - 275 - switch (code) { 276 - case BPF_ALU | BPF_ADD | BPF_X: /* A += X */ 277 - jit->seen |= SEEN_XREG; 278 - /* ar %r5,%r12 */ 279 - EMIT2(0x1a5c); 280 - break; 281 - case BPF_ALU | BPF_ADD | BPF_K: /* A += K */ 282 - if (!K) 283 - break; 284 - if (K <= 16383) 285 - /* ahi %r5,<K> */ 286 - EMIT4_IMM(0xa75a0000, K); 287 - else if (test_facility(21)) 288 - /* alfi %r5,<K> */ 289 - EMIT6_IMM(0xc25b0000, K); 290 - else 291 - /* a %r5,<d(K)>(%r13) */ 292 - EMIT4_DISP(0x5a50d000, EMIT_CONST(K)); 293 - break; 294 - case BPF_ALU | BPF_SUB | BPF_X: /* A -= X */ 295 - jit->seen |= SEEN_XREG; 296 - /* sr %r5,%r12 */ 297 - EMIT2(0x1b5c); 298 - break; 299 - case BPF_ALU | BPF_SUB | BPF_K: /* A -= K */ 300 - if (!K) 301 - break; 302 - if (K <= 16384) 303 - /* ahi %r5,-K */ 304 - EMIT4_IMM(0xa75a0000, -K); 305 - else if (test_facility(21)) 306 - /* alfi %r5,-K */ 307 - EMIT6_IMM(0xc25b0000, -K); 308 - else 309 - /* s %r5,<d(K)>(%r13) */ 310 - EMIT4_DISP(0x5b50d000, EMIT_CONST(K)); 311 - break; 312 - case BPF_ALU | BPF_MUL | BPF_X: /* A *= X */ 313 - jit->seen |= SEEN_XREG; 314 - /* msr %r5,%r12 */ 315 - EMIT4(0xb252005c); 316 - break; 317 - case BPF_ALU | BPF_MUL | BPF_K: /* A *= K */ 318 - if (K <= 16383) 319 - /* mhi %r5,K */ 320 - EMIT4_IMM(0xa75c0000, K); 321 - else if (test_facility(34)) 322 - /* msfi %r5,<K> */ 323 - EMIT6_IMM(0xc2510000, K); 324 - else 325 - /* ms %r5,<d(K)>(%r13) */ 326 - EMIT4_DISP(0x7150d000, EMIT_CONST(K)); 327 - break; 328 - case BPF_ALU | BPF_DIV | BPF_X: /* A /= X */ 329 - jit->seen |= SEEN_XREG | SEEN_RET0; 330 - /* ltr %r12,%r12 */ 331 - EMIT2(0x12cc); 332 - /* jz <ret0> */ 333 - EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); 334 - /* lhi %r4,0 */ 335 - EMIT4(0xa7480000); 336 - /* dlr %r4,%r12 */ 337 - EMIT4(0xb997004c); 338 - break; 339 - case BPF_ALU | BPF_DIV | BPF_K: /* A /= K */ 340 - if (K == 1) 341 - break; 342 - /* lhi %r4,0 */ 343 - EMIT4(0xa7480000); 344 - /* dl %r4,<d(K)>(%r13) */ 345 - EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); 346 - break; 347 - case BPF_ALU | BPF_MOD | BPF_X: /* A %= X */ 348 - jit->seen |= SEEN_XREG | SEEN_RET0; 349 - /* ltr %r12,%r12 */ 350 - EMIT2(0x12cc); 351 - /* jz <ret0> */ 352 - EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); 353 - /* lhi %r4,0 */ 354 - EMIT4(0xa7480000); 355 - /* dlr %r4,%r12 */ 356 - EMIT4(0xb997004c); 357 - /* lr %r5,%r4 */ 358 - EMIT2(0x1854); 359 - break; 360 - case BPF_ALU | BPF_MOD | BPF_K: /* A %= K */ 361 - if (K == 1) { 362 - /* lhi %r5,0 */ 363 - EMIT4(0xa7580000); 364 - break; 365 - } 366 - /* lhi %r4,0 */ 367 - EMIT4(0xa7480000); 368 - /* dl %r4,<d(K)>(%r13) */ 369 - EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); 370 - /* lr %r5,%r4 */ 371 - EMIT2(0x1854); 372 - break; 373 - case BPF_ALU | BPF_AND | BPF_X: /* A &= X */ 374 - jit->seen |= SEEN_XREG; 375 - /* nr %r5,%r12 */ 376 - EMIT2(0x145c); 377 - break; 378 - case BPF_ALU | BPF_AND | BPF_K: /* A &= K */ 379 - if (test_facility(21)) 380 - /* nilf %r5,<K> */ 381 - EMIT6_IMM(0xc05b0000, K); 382 - else 383 - /* n %r5,<d(K)>(%r13) */ 384 - EMIT4_DISP(0x5450d000, EMIT_CONST(K)); 385 - break; 386 - case BPF_ALU | BPF_OR | BPF_X: /* A |= X */ 387 - jit->seen |= SEEN_XREG; 388 - /* or %r5,%r12 */ 389 - EMIT2(0x165c); 390 - break; 391 - case BPF_ALU | BPF_OR | BPF_K: /* A |= K */ 392 - if (test_facility(21)) 393 - /* oilf %r5,<K> */ 394 - EMIT6_IMM(0xc05d0000, K); 395 - else 396 - /* o %r5,<d(K)>(%r13) */ 397 - EMIT4_DISP(0x5650d000, EMIT_CONST(K)); 398 - break; 399 - case BPF_ANC | SKF_AD_ALU_XOR_X: /* A ^= X; */ 400 - case BPF_ALU | BPF_XOR | BPF_X: 401 - jit->seen |= SEEN_XREG; 402 - /* xr %r5,%r12 */ 403 - EMIT2(0x175c); 404 - break; 405 - case BPF_ALU | BPF_XOR | BPF_K: /* A ^= K */ 406 - if (!K) 407 - break; 408 - /* x %r5,<d(K)>(%r13) */ 409 - EMIT4_DISP(0x5750d000, EMIT_CONST(K)); 410 - break; 411 - case BPF_ALU | BPF_LSH | BPF_X: /* A <<= X; */ 412 - jit->seen |= SEEN_XREG; 413 - /* sll %r5,0(%r12) */ 414 - EMIT4(0x8950c000); 415 - break; 416 - case BPF_ALU | BPF_LSH | BPF_K: /* A <<= K */ 417 - if (K == 0) 418 - break; 419 - /* sll %r5,K */ 420 - EMIT4_DISP(0x89500000, K); 421 - break; 422 - case BPF_ALU | BPF_RSH | BPF_X: /* A >>= X; */ 423 - jit->seen |= SEEN_XREG; 424 - /* srl %r5,0(%r12) */ 425 - EMIT4(0x8850c000); 426 - break; 427 - case BPF_ALU | BPF_RSH | BPF_K: /* A >>= K; */ 428 - if (K == 0) 429 - break; 430 - /* srl %r5,K */ 431 - EMIT4_DISP(0x88500000, K); 432 - break; 433 - case BPF_ALU | BPF_NEG: /* A = -A */ 434 - /* lcr %r5,%r5 */ 435 - EMIT2(0x1355); 436 - break; 437 - case BPF_JMP | BPF_JA: /* ip += K */ 438 - offset = addrs[i + K] + jit->start - jit->prg; 439 - EMIT4_PCREL(0xa7f40000, offset); 440 - break; 441 - case BPF_JMP | BPF_JGT | BPF_K: /* ip += (A > K) ? jt : jf */ 442 - mask = 0x200000; /* jh */ 443 - goto kbranch; 444 - case BPF_JMP | BPF_JGE | BPF_K: /* ip += (A >= K) ? jt : jf */ 445 - mask = 0xa00000; /* jhe */ 446 - goto kbranch; 447 - case BPF_JMP | BPF_JEQ | BPF_K: /* ip += (A == K) ? jt : jf */ 448 - mask = 0x800000; /* je */ 449 - kbranch: /* Emit compare if the branch targets are different */ 450 - if (filter->jt != filter->jf) { 451 - if (test_facility(21)) 452 - /* clfi %r5,<K> */ 453 - EMIT6_IMM(0xc25f0000, K); 454 - else 455 - /* cl %r5,<d(K)>(%r13) */ 456 - EMIT4_DISP(0x5550d000, EMIT_CONST(K)); 457 - } 458 - branch: if (filter->jt == filter->jf) { 459 - if (filter->jt == 0) 460 - break; 461 - /* j <jt> */ 462 - offset = addrs[i + filter->jt] + jit->start - jit->prg; 463 - EMIT4_PCREL(0xa7f40000, offset); 464 - break; 465 - } 466 - if (filter->jt != 0) { 467 - /* brc <mask>,<jt> */ 468 - offset = addrs[i + filter->jt] + jit->start - jit->prg; 469 - EMIT4_PCREL(0xa7040000 | mask, offset); 470 - } 471 - if (filter->jf != 0) { 472 - /* brc <mask^15>,<jf> */ 473 - offset = addrs[i + filter->jf] + jit->start - jit->prg; 474 - EMIT4_PCREL(0xa7040000 | (mask ^ 0xf00000), offset); 475 - } 476 - break; 477 - case BPF_JMP | BPF_JSET | BPF_K: /* ip += (A & K) ? jt : jf */ 478 - mask = 0x700000; /* jnz */ 479 - /* Emit test if the branch targets are different */ 480 - if (filter->jt != filter->jf) { 481 - if (K > 65535) { 482 - /* lr %r4,%r5 */ 483 - EMIT2(0x1845); 484 - /* n %r4,<d(K)>(%r13) */ 485 - EMIT4_DISP(0x5440d000, EMIT_CONST(K)); 486 - } else 487 - /* tmll %r5,K */ 488 - EMIT4_IMM(0xa7510000, K); 489 - } 490 - goto branch; 491 - case BPF_JMP | BPF_JGT | BPF_X: /* ip += (A > X) ? jt : jf */ 492 - mask = 0x200000; /* jh */ 493 - goto xbranch; 494 - case BPF_JMP | BPF_JGE | BPF_X: /* ip += (A >= X) ? jt : jf */ 495 - mask = 0xa00000; /* jhe */ 496 - goto xbranch; 497 - case BPF_JMP | BPF_JEQ | BPF_X: /* ip += (A == X) ? jt : jf */ 498 - mask = 0x800000; /* je */ 499 - xbranch: /* Emit compare if the branch targets are different */ 500 - if (filter->jt != filter->jf) { 501 - jit->seen |= SEEN_XREG; 502 - /* clr %r5,%r12 */ 503 - EMIT2(0x155c); 504 - } 505 - goto branch; 506 - case BPF_JMP | BPF_JSET | BPF_X: /* ip += (A & X) ? jt : jf */ 507 - mask = 0x700000; /* jnz */ 508 - /* Emit test if the branch targets are different */ 509 - if (filter->jt != filter->jf) { 510 - jit->seen |= SEEN_XREG; 511 - /* lr %r4,%r5 */ 512 - EMIT2(0x1845); 513 - /* nr %r4,%r12 */ 514 - EMIT2(0x144c); 515 - } 516 - goto branch; 517 - case BPF_LD | BPF_W | BPF_ABS: /* A = *(u32 *) (skb->data+K) */ 518 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_WORD; 519 - offset = jit->off_load_word; 520 - goto load_abs; 521 - case BPF_LD | BPF_H | BPF_ABS: /* A = *(u16 *) (skb->data+K) */ 522 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_HALF; 523 - offset = jit->off_load_half; 524 - goto load_abs; 525 - case BPF_LD | BPF_B | BPF_ABS: /* A = *(u8 *) (skb->data+K) */ 526 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_BYTE; 527 - offset = jit->off_load_byte; 528 - load_abs: if ((int) K < 0) 529 - goto out; 530 - call_fn: /* lg %r1,<d(function)>(%r13) */ 531 - EMIT6_DISP(0xe310d000, 0x0004, offset); 532 - /* l %r3,<d(K)>(%r13) */ 533 - EMIT4_DISP(0x5830d000, EMIT_CONST(K)); 534 - /* basr %r8,%r1 */ 535 - EMIT2(0x0d81); 536 - /* jnz <ret0> */ 537 - EMIT4_PCREL(0xa7740000, (jit->ret0_ip - jit->prg)); 538 - break; 539 - case BPF_LD | BPF_W | BPF_IND: /* A = *(u32 *) (skb->data+K+X) */ 540 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_IWORD; 541 - offset = jit->off_load_iword; 542 - goto call_fn; 543 - case BPF_LD | BPF_H | BPF_IND: /* A = *(u16 *) (skb->data+K+X) */ 544 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_IHALF; 545 - offset = jit->off_load_ihalf; 546 - goto call_fn; 547 - case BPF_LD | BPF_B | BPF_IND: /* A = *(u8 *) (skb->data+K+X) */ 548 - jit->seen |= SEEN_DATAREF | SEEN_RET0 | SEEN_LOAD_IBYTE; 549 - offset = jit->off_load_ibyte; 550 - goto call_fn; 551 - case BPF_LDX | BPF_B | BPF_MSH: 552 - /* X = (*(u8 *)(skb->data+K) & 0xf) << 2 */ 553 576 jit->seen |= SEEN_RET0; 554 - if ((int) K < 0) { 555 - /* j <ret0> */ 556 - EMIT4_PCREL(0xa7f40000, (jit->ret0_ip - jit->prg)); 577 + /* ltr %src,%src (if src == 0 goto fail) */ 578 + EMIT2(0x1200, src_reg, src_reg); 579 + /* jz <ret0> */ 580 + EMIT4_PCREL(0xa7840000, jit->ret0_ip - jit->prg); 581 + /* lhi %w0,0 */ 582 + EMIT4_IMM(0xa7080000, REG_W0, 0); 583 + /* lr %w1,%dst */ 584 + EMIT2(0x1800, REG_W1, dst_reg); 585 + /* dlr %w0,%src */ 586 + EMIT4(0xb9970000, REG_W0, src_reg); 587 + /* llgfr %dst,%rc */ 588 + EMIT4(0xb9160000, dst_reg, rc_reg); 589 + break; 590 + } 591 + case BPF_ALU64 | BPF_DIV | BPF_X: /* dst = dst / (u32) src */ 592 + case BPF_ALU64 | BPF_MOD | BPF_X: /* dst = dst % (u32) src */ 593 + { 594 + int rc_reg = BPF_OP(insn->code) == BPF_DIV ? REG_W1 : REG_W0; 595 + 596 + jit->seen |= SEEN_RET0; 597 + /* ltgr %src,%src (if src == 0 goto fail) */ 598 + EMIT4(0xb9020000, src_reg, src_reg); 599 + /* jz <ret0> */ 600 + EMIT4_PCREL(0xa7840000, jit->ret0_ip - jit->prg); 601 + /* lghi %w0,0 */ 602 + EMIT4_IMM(0xa7090000, REG_W0, 0); 603 + /* lgr %w1,%dst */ 604 + EMIT4(0xb9040000, REG_W1, dst_reg); 605 + /* llgfr %dst,%src (u32 cast) */ 606 + EMIT4(0xb9160000, dst_reg, src_reg); 607 + /* dlgr %w0,%dst */ 608 + EMIT4(0xb9870000, REG_W0, dst_reg); 609 + /* lgr %dst,%rc */ 610 + EMIT4(0xb9040000, dst_reg, rc_reg); 611 + break; 612 + } 613 + case BPF_ALU | BPF_DIV | BPF_K: /* dst = (u32) dst / (u32) imm */ 614 + case BPF_ALU | BPF_MOD | BPF_K: /* dst = (u32) dst % (u32) imm */ 615 + { 616 + int rc_reg = BPF_OP(insn->code) == BPF_DIV ? REG_W1 : REG_W0; 617 + 618 + if (imm == 1) { 619 + if (BPF_OP(insn->code) == BPF_MOD) 620 + /* lhgi %dst,0 */ 621 + EMIT4_IMM(0xa7090000, dst_reg, 0); 557 622 break; 558 623 } 559 - jit->seen |= SEEN_DATAREF | SEEN_LOAD_BMSH; 560 - offset = jit->off_load_bmsh; 561 - goto call_fn; 562 - case BPF_LD | BPF_W | BPF_LEN: /* A = skb->len; */ 563 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4); 564 - /* l %r5,<d(len)>(%r2) */ 565 - EMIT4_DISP(0x58502000, offsetof(struct sk_buff, len)); 624 + /* lhi %w0,0 */ 625 + EMIT4_IMM(0xa7080000, REG_W0, 0); 626 + /* lr %w1,%dst */ 627 + EMIT2(0x1800, REG_W1, dst_reg); 628 + /* dl %w0,<d(imm)>(%l) */ 629 + EMIT6_DISP_LH(0xe3000000, 0x0097, REG_W0, REG_0, REG_L, 630 + EMIT_CONST_U32(imm)); 631 + /* llgfr %dst,%rc */ 632 + EMIT4(0xb9160000, dst_reg, rc_reg); 566 633 break; 567 - case BPF_LDX | BPF_W | BPF_LEN: /* X = skb->len; */ 568 - jit->seen |= SEEN_XREG; 569 - /* l %r12,<d(len)>(%r2) */ 570 - EMIT4_DISP(0x58c02000, offsetof(struct sk_buff, len)); 634 + } 635 + case BPF_ALU64 | BPF_DIV | BPF_K: /* dst = dst / (u32) imm */ 636 + case BPF_ALU64 | BPF_MOD | BPF_K: /* dst = dst % (u32) imm */ 637 + { 638 + int rc_reg = BPF_OP(insn->code) == BPF_DIV ? REG_W1 : REG_W0; 639 + 640 + if (imm == 1) { 641 + if (BPF_OP(insn->code) == BPF_MOD) 642 + /* lhgi %dst,0 */ 643 + EMIT4_IMM(0xa7090000, dst_reg, 0); 644 + break; 645 + } 646 + /* lghi %w0,0 */ 647 + EMIT4_IMM(0xa7090000, REG_W0, 0); 648 + /* lgr %w1,%dst */ 649 + EMIT4(0xb9040000, REG_W1, dst_reg); 650 + /* dlg %w0,<d(imm)>(%l) */ 651 + EMIT6_DISP_LH(0xe3000000, 0x0087, REG_W0, REG_0, REG_L, 652 + EMIT_CONST_U64((u32) imm)); 653 + /* lgr %dst,%rc */ 654 + EMIT4(0xb9040000, dst_reg, rc_reg); 571 655 break; 572 - case BPF_LD | BPF_IMM: /* A = K */ 573 - if (K <= 16383) 574 - /* lhi %r5,K */ 575 - EMIT4_IMM(0xa7580000, K); 576 - else if (test_facility(21)) 577 - /* llilf %r5,<K> */ 578 - EMIT6_IMM(0xc05f0000, K); 579 - else 580 - /* l %r5,<d(K)>(%r13) */ 581 - EMIT4_DISP(0x5850d000, EMIT_CONST(K)); 656 + } 657 + /* 658 + * BPF_AND 659 + */ 660 + case BPF_ALU | BPF_AND | BPF_X: /* dst = (u32) dst & (u32) src */ 661 + /* nr %dst,%src */ 662 + EMIT2(0x1400, dst_reg, src_reg); 663 + EMIT_ZERO(dst_reg); 582 664 break; 583 - case BPF_LDX | BPF_IMM: /* X = K */ 584 - jit->seen |= SEEN_XREG; 585 - if (K <= 16383) 586 - /* lhi %r12,<K> */ 587 - EMIT4_IMM(0xa7c80000, K); 588 - else if (test_facility(21)) 589 - /* llilf %r12,<K> */ 590 - EMIT6_IMM(0xc0cf0000, K); 591 - else 592 - /* l %r12,<d(K)>(%r13) */ 593 - EMIT4_DISP(0x58c0d000, EMIT_CONST(K)); 665 + case BPF_ALU64 | BPF_AND | BPF_X: /* dst = dst & src */ 666 + /* ngr %dst,%src */ 667 + EMIT4(0xb9800000, dst_reg, src_reg); 594 668 break; 595 - case BPF_LD | BPF_MEM: /* A = mem[K] */ 596 - jit->seen |= SEEN_MEM; 597 - /* l %r5,<K>(%r15) */ 598 - EMIT4_DISP(0x5850f000, 599 - (jit->seen & SEEN_DATAREF) ? 160 + K*4 : K*4); 669 + case BPF_ALU | BPF_AND | BPF_K: /* dst = (u32) dst & (u32) imm */ 670 + /* nilf %dst,imm */ 671 + EMIT6_IMM(0xc00b0000, dst_reg, imm); 672 + EMIT_ZERO(dst_reg); 600 673 break; 601 - case BPF_LDX | BPF_MEM: /* X = mem[K] */ 602 - jit->seen |= SEEN_XREG | SEEN_MEM; 603 - /* l %r12,<K>(%r15) */ 604 - EMIT4_DISP(0x58c0f000, 605 - (jit->seen & SEEN_DATAREF) ? 160 + K*4 : K*4); 674 + case BPF_ALU64 | BPF_AND | BPF_K: /* dst = dst & imm */ 675 + /* ng %dst,<d(imm)>(%l) */ 676 + EMIT6_DISP_LH(0xe3000000, 0x0080, dst_reg, REG_0, REG_L, 677 + EMIT_CONST_U64(imm)); 606 678 break; 607 - case BPF_MISC | BPF_TAX: /* X = A */ 608 - jit->seen |= SEEN_XREG; 609 - /* lr %r12,%r5 */ 610 - EMIT2(0x18c5); 679 + /* 680 + * BPF_OR 681 + */ 682 + case BPF_ALU | BPF_OR | BPF_X: /* dst = (u32) dst | (u32) src */ 683 + /* or %dst,%src */ 684 + EMIT2(0x1600, dst_reg, src_reg); 685 + EMIT_ZERO(dst_reg); 611 686 break; 612 - case BPF_MISC | BPF_TXA: /* A = X */ 613 - jit->seen |= SEEN_XREG; 614 - /* lr %r5,%r12 */ 615 - EMIT2(0x185c); 687 + case BPF_ALU64 | BPF_OR | BPF_X: /* dst = dst | src */ 688 + /* ogr %dst,%src */ 689 + EMIT4(0xb9810000, dst_reg, src_reg); 616 690 break; 617 - case BPF_RET | BPF_K: 618 - if (K == 0) { 619 - jit->seen |= SEEN_RET0; 620 - if (last) 621 - break; 622 - /* j <ret0> */ 623 - EMIT4_PCREL(0xa7f40000, jit->ret0_ip - jit->prg); 624 - } else { 625 - if (K <= 16383) 626 - /* lghi %r2,K */ 627 - EMIT4_IMM(0xa7290000, K); 628 - else 629 - /* llgf %r2,<K>(%r13) */ 630 - EMIT6_DISP(0xe320d000, 0x0016, EMIT_CONST(K)); 631 - /* j <exit> */ 632 - if (last && !(jit->seen & SEEN_RET0)) 633 - break; 634 - EMIT4_PCREL(0xa7f40000, jit->exit_ip - jit->prg); 691 + case BPF_ALU | BPF_OR | BPF_K: /* dst = (u32) dst | (u32) imm */ 692 + /* oilf %dst,imm */ 693 + EMIT6_IMM(0xc00d0000, dst_reg, imm); 694 + EMIT_ZERO(dst_reg); 695 + break; 696 + case BPF_ALU64 | BPF_OR | BPF_K: /* dst = dst | imm */ 697 + /* og %dst,<d(imm)>(%l) */ 698 + EMIT6_DISP_LH(0xe3000000, 0x0081, dst_reg, REG_0, REG_L, 699 + EMIT_CONST_U64(imm)); 700 + break; 701 + /* 702 + * BPF_XOR 703 + */ 704 + case BPF_ALU | BPF_XOR | BPF_X: /* dst = (u32) dst ^ (u32) src */ 705 + /* xr %dst,%src */ 706 + EMIT2(0x1700, dst_reg, src_reg); 707 + EMIT_ZERO(dst_reg); 708 + break; 709 + case BPF_ALU64 | BPF_XOR | BPF_X: /* dst = dst ^ src */ 710 + /* xgr %dst,%src */ 711 + EMIT4(0xb9820000, dst_reg, src_reg); 712 + break; 713 + case BPF_ALU | BPF_XOR | BPF_K: /* dst = (u32) dst ^ (u32) imm */ 714 + if (!imm) 715 + break; 716 + /* xilf %dst,imm */ 717 + EMIT6_IMM(0xc0070000, dst_reg, imm); 718 + EMIT_ZERO(dst_reg); 719 + break; 720 + case BPF_ALU64 | BPF_XOR | BPF_K: /* dst = dst ^ imm */ 721 + /* xg %dst,<d(imm)>(%l) */ 722 + EMIT6_DISP_LH(0xe3000000, 0x0082, dst_reg, REG_0, REG_L, 723 + EMIT_CONST_U64(imm)); 724 + break; 725 + /* 726 + * BPF_LSH 727 + */ 728 + case BPF_ALU | BPF_LSH | BPF_X: /* dst = (u32) dst << (u32) src */ 729 + /* sll %dst,0(%src) */ 730 + EMIT4_DISP(0x89000000, dst_reg, src_reg, 0); 731 + EMIT_ZERO(dst_reg); 732 + break; 733 + case BPF_ALU64 | BPF_LSH | BPF_X: /* dst = dst << src */ 734 + /* sllg %dst,%dst,0(%src) */ 735 + EMIT6_DISP_LH(0xeb000000, 0x000d, dst_reg, dst_reg, src_reg, 0); 736 + break; 737 + case BPF_ALU | BPF_LSH | BPF_K: /* dst = (u32) dst << (u32) imm */ 738 + if (imm == 0) 739 + break; 740 + /* sll %dst,imm(%r0) */ 741 + EMIT4_DISP(0x89000000, dst_reg, REG_0, imm); 742 + EMIT_ZERO(dst_reg); 743 + break; 744 + case BPF_ALU64 | BPF_LSH | BPF_K: /* dst = dst << imm */ 745 + if (imm == 0) 746 + break; 747 + /* sllg %dst,%dst,imm(%r0) */ 748 + EMIT6_DISP_LH(0xeb000000, 0x000d, dst_reg, dst_reg, REG_0, imm); 749 + break; 750 + /* 751 + * BPF_RSH 752 + */ 753 + case BPF_ALU | BPF_RSH | BPF_X: /* dst = (u32) dst >> (u32) src */ 754 + /* srl %dst,0(%src) */ 755 + EMIT4_DISP(0x88000000, dst_reg, src_reg, 0); 756 + EMIT_ZERO(dst_reg); 757 + break; 758 + case BPF_ALU64 | BPF_RSH | BPF_X: /* dst = dst >> src */ 759 + /* srlg %dst,%dst,0(%src) */ 760 + EMIT6_DISP_LH(0xeb000000, 0x000c, dst_reg, dst_reg, src_reg, 0); 761 + break; 762 + case BPF_ALU | BPF_RSH | BPF_K: /* dst = (u32) dst >> (u32) imm */ 763 + if (imm == 0) 764 + break; 765 + /* srl %dst,imm(%r0) */ 766 + EMIT4_DISP(0x88000000, dst_reg, REG_0, imm); 767 + EMIT_ZERO(dst_reg); 768 + break; 769 + case BPF_ALU64 | BPF_RSH | BPF_K: /* dst = dst >> imm */ 770 + if (imm == 0) 771 + break; 772 + /* srlg %dst,%dst,imm(%r0) */ 773 + EMIT6_DISP_LH(0xeb000000, 0x000c, dst_reg, dst_reg, REG_0, imm); 774 + break; 775 + /* 776 + * BPF_ARSH 777 + */ 778 + case BPF_ALU64 | BPF_ARSH | BPF_X: /* ((s64) dst) >>= src */ 779 + /* srag %dst,%dst,0(%src) */ 780 + EMIT6_DISP_LH(0xeb000000, 0x000a, dst_reg, dst_reg, src_reg, 0); 781 + break; 782 + case BPF_ALU64 | BPF_ARSH | BPF_K: /* ((s64) dst) >>= imm */ 783 + if (imm == 0) 784 + break; 785 + /* srag %dst,%dst,imm(%r0) */ 786 + EMIT6_DISP_LH(0xeb000000, 0x000a, dst_reg, dst_reg, REG_0, imm); 787 + break; 788 + /* 789 + * BPF_NEG 790 + */ 791 + case BPF_ALU | BPF_NEG: /* dst = (u32) -dst */ 792 + /* lcr %dst,%dst */ 793 + EMIT2(0x1300, dst_reg, dst_reg); 794 + EMIT_ZERO(dst_reg); 795 + break; 796 + case BPF_ALU64 | BPF_NEG: /* dst = -dst */ 797 + /* lcgr %dst,%dst */ 798 + EMIT4(0xb9130000, dst_reg, dst_reg); 799 + break; 800 + /* 801 + * BPF_FROM_BE/LE 802 + */ 803 + case BPF_ALU | BPF_END | BPF_FROM_BE: 804 + /* s390 is big endian, therefore only clear high order bytes */ 805 + switch (imm) { 806 + case 16: /* dst = (u16) cpu_to_be16(dst) */ 807 + /* llghr %dst,%dst */ 808 + EMIT4(0xb9850000, dst_reg, dst_reg); 809 + break; 810 + case 32: /* dst = (u32) cpu_to_be32(dst) */ 811 + /* llgfr %dst,%dst */ 812 + EMIT4(0xb9160000, dst_reg, dst_reg); 813 + break; 814 + case 64: /* dst = (u64) cpu_to_be64(dst) */ 815 + break; 635 816 } 636 817 break; 637 - case BPF_RET | BPF_A: 638 - /* llgfr %r2,%r5 */ 639 - EMIT4(0xb9160025); 818 + case BPF_ALU | BPF_END | BPF_FROM_LE: 819 + switch (imm) { 820 + case 16: /* dst = (u16) cpu_to_le16(dst) */ 821 + /* lrvr %dst,%dst */ 822 + EMIT4(0xb91f0000, dst_reg, dst_reg); 823 + /* srl %dst,16(%r0) */ 824 + EMIT4_DISP(0x88000000, dst_reg, REG_0, 16); 825 + /* llghr %dst,%dst */ 826 + EMIT4(0xb9850000, dst_reg, dst_reg); 827 + break; 828 + case 32: /* dst = (u32) cpu_to_le32(dst) */ 829 + /* lrvr %dst,%dst */ 830 + EMIT4(0xb91f0000, dst_reg, dst_reg); 831 + /* llgfr %dst,%dst */ 832 + EMIT4(0xb9160000, dst_reg, dst_reg); 833 + break; 834 + case 64: /* dst = (u64) cpu_to_le64(dst) */ 835 + /* lrvgr %dst,%dst */ 836 + EMIT4(0xb90f0000, dst_reg, dst_reg); 837 + break; 838 + } 839 + break; 840 + /* 841 + * BPF_ST(X) 842 + */ 843 + case BPF_STX | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = src_reg */ 844 + /* stcy %src,off(%dst) */ 845 + EMIT6_DISP_LH(0xe3000000, 0x0072, src_reg, dst_reg, REG_0, off); 846 + jit->seen |= SEEN_MEM; 847 + break; 848 + case BPF_STX | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = src */ 849 + /* sthy %src,off(%dst) */ 850 + EMIT6_DISP_LH(0xe3000000, 0x0070, src_reg, dst_reg, REG_0, off); 851 + jit->seen |= SEEN_MEM; 852 + break; 853 + case BPF_STX | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = src */ 854 + /* sty %src,off(%dst) */ 855 + EMIT6_DISP_LH(0xe3000000, 0x0050, src_reg, dst_reg, REG_0, off); 856 + jit->seen |= SEEN_MEM; 857 + break; 858 + case BPF_STX | BPF_MEM | BPF_DW: /* (u64 *)(dst + off) = src */ 859 + /* stg %src,off(%dst) */ 860 + EMIT6_DISP_LH(0xe3000000, 0x0024, src_reg, dst_reg, REG_0, off); 861 + jit->seen |= SEEN_MEM; 862 + break; 863 + case BPF_ST | BPF_MEM | BPF_B: /* *(u8 *)(dst + off) = imm */ 864 + /* lhi %w0,imm */ 865 + EMIT4_IMM(0xa7080000, REG_W0, (u8) imm); 866 + /* stcy %w0,off(dst) */ 867 + EMIT6_DISP_LH(0xe3000000, 0x0072, REG_W0, dst_reg, REG_0, off); 868 + jit->seen |= SEEN_MEM; 869 + break; 870 + case BPF_ST | BPF_MEM | BPF_H: /* (u16 *)(dst + off) = imm */ 871 + /* lhi %w0,imm */ 872 + EMIT4_IMM(0xa7080000, REG_W0, (u16) imm); 873 + /* sthy %w0,off(dst) */ 874 + EMIT6_DISP_LH(0xe3000000, 0x0070, REG_W0, dst_reg, REG_0, off); 875 + jit->seen |= SEEN_MEM; 876 + break; 877 + case BPF_ST | BPF_MEM | BPF_W: /* *(u32 *)(dst + off) = imm */ 878 + /* llilf %w0,imm */ 879 + EMIT6_IMM(0xc00f0000, REG_W0, (u32) imm); 880 + /* sty %w0,off(%dst) */ 881 + EMIT6_DISP_LH(0xe3000000, 0x0050, REG_W0, dst_reg, REG_0, off); 882 + jit->seen |= SEEN_MEM; 883 + break; 884 + case BPF_ST | BPF_MEM | BPF_DW: /* *(u64 *)(dst + off) = imm */ 885 + /* lgfi %w0,imm */ 886 + EMIT6_IMM(0xc0010000, REG_W0, imm); 887 + /* stg %w0,off(%dst) */ 888 + EMIT6_DISP_LH(0xe3000000, 0x0024, REG_W0, dst_reg, REG_0, off); 889 + jit->seen |= SEEN_MEM; 890 + break; 891 + /* 892 + * BPF_STX XADD (atomic_add) 893 + */ 894 + case BPF_STX | BPF_XADD | BPF_W: /* *(u32 *)(dst + off) += src */ 895 + /* laal %w0,%src,off(%dst) */ 896 + EMIT6_DISP_LH(0xeb000000, 0x00fa, REG_W0, src_reg, 897 + dst_reg, off); 898 + jit->seen |= SEEN_MEM; 899 + break; 900 + case BPF_STX | BPF_XADD | BPF_DW: /* *(u64 *)(dst + off) += src */ 901 + /* laalg %w0,%src,off(%dst) */ 902 + EMIT6_DISP_LH(0xeb000000, 0x00ea, REG_W0, src_reg, 903 + dst_reg, off); 904 + jit->seen |= SEEN_MEM; 905 + break; 906 + /* 907 + * BPF_LDX 908 + */ 909 + case BPF_LDX | BPF_MEM | BPF_B: /* dst = *(u8 *)(ul) (src + off) */ 910 + /* llgc %dst,0(off,%src) */ 911 + EMIT6_DISP_LH(0xe3000000, 0x0090, dst_reg, src_reg, REG_0, off); 912 + jit->seen |= SEEN_MEM; 913 + break; 914 + case BPF_LDX | BPF_MEM | BPF_H: /* dst = *(u16 *)(ul) (src + off) */ 915 + /* llgh %dst,0(off,%src) */ 916 + EMIT6_DISP_LH(0xe3000000, 0x0091, dst_reg, src_reg, REG_0, off); 917 + jit->seen |= SEEN_MEM; 918 + break; 919 + case BPF_LDX | BPF_MEM | BPF_W: /* dst = *(u32 *)(ul) (src + off) */ 920 + /* llgf %dst,off(%src) */ 921 + jit->seen |= SEEN_MEM; 922 + EMIT6_DISP_LH(0xe3000000, 0x0016, dst_reg, src_reg, REG_0, off); 923 + break; 924 + case BPF_LDX | BPF_MEM | BPF_DW: /* dst = *(u64 *)(ul) (src + off) */ 925 + /* lg %dst,0(off,%src) */ 926 + jit->seen |= SEEN_MEM; 927 + EMIT6_DISP_LH(0xe3000000, 0x0004, dst_reg, src_reg, REG_0, off); 928 + break; 929 + /* 930 + * BPF_JMP / CALL 931 + */ 932 + case BPF_JMP | BPF_CALL: 933 + { 934 + /* 935 + * b0 = (__bpf_call_base + imm)(b1, b2, b3, b4, b5) 936 + */ 937 + const u64 func = (u64)__bpf_call_base + imm; 938 + 939 + REG_SET_SEEN(BPF_REG_5); 940 + jit->seen |= SEEN_FUNC; 941 + /* lg %w1,<d(imm)>(%l) */ 942 + EMIT6_DISP(0xe3000000, 0x0004, REG_W1, REG_0, REG_L, 943 + EMIT_CONST_U64(func)); 944 + /* basr %r14,%w1 */ 945 + EMIT2(0x0d00, REG_14, REG_W1); 946 + /* lgr %b0,%r2: load return value into %b0 */ 947 + EMIT4(0xb9040000, BPF_REG_0, REG_2); 948 + break; 949 + } 950 + case BPF_JMP | BPF_EXIT: /* return b0 */ 951 + last = (i == fp->len - 1) ? 1 : 0; 952 + if (last && !(jit->seen & SEEN_RET0)) 953 + break; 640 954 /* j <exit> */ 641 955 EMIT4_PCREL(0xa7f40000, jit->exit_ip - jit->prg); 642 956 break; 643 - case BPF_ST: /* mem[K] = A */ 644 - jit->seen |= SEEN_MEM; 645 - /* st %r5,<K>(%r15) */ 646 - EMIT4_DISP(0x5050f000, 647 - (jit->seen & SEEN_DATAREF) ? 160 + K*4 : K*4); 957 + /* 958 + * Branch relative (number of skipped instructions) to offset on 959 + * condition. 960 + * 961 + * Condition code to mask mapping: 962 + * 963 + * CC | Description | Mask 964 + * ------------------------------ 965 + * 0 | Operands equal | 8 966 + * 1 | First operand low | 4 967 + * 2 | First operand high | 2 968 + * 3 | Unused | 1 969 + * 970 + * For s390x relative branches: ip = ip + off_bytes 971 + * For BPF relative branches: insn = insn + off_insns + 1 972 + * 973 + * For example for s390x with offset 0 we jump to the branch 974 + * instruction itself (loop) and for BPF with offset 0 we 975 + * branch to the instruction behind the branch. 976 + */ 977 + case BPF_JMP | BPF_JA: /* if (true) */ 978 + mask = 0xf000; /* j */ 979 + goto branch_oc; 980 + case BPF_JMP | BPF_JSGT | BPF_K: /* ((s64) dst > (s64) imm) */ 981 + mask = 0x2000; /* jh */ 982 + goto branch_ks; 983 + case BPF_JMP | BPF_JSGE | BPF_K: /* ((s64) dst >= (s64) imm) */ 984 + mask = 0xa000; /* jhe */ 985 + goto branch_ks; 986 + case BPF_JMP | BPF_JGT | BPF_K: /* (dst_reg > imm) */ 987 + mask = 0x2000; /* jh */ 988 + goto branch_ku; 989 + case BPF_JMP | BPF_JGE | BPF_K: /* (dst_reg >= imm) */ 990 + mask = 0xa000; /* jhe */ 991 + goto branch_ku; 992 + case BPF_JMP | BPF_JNE | BPF_K: /* (dst_reg != imm) */ 993 + mask = 0x7000; /* jne */ 994 + goto branch_ku; 995 + case BPF_JMP | BPF_JEQ | BPF_K: /* (dst_reg == imm) */ 996 + mask = 0x8000; /* je */ 997 + goto branch_ku; 998 + case BPF_JMP | BPF_JSET | BPF_K: /* (dst_reg & imm) */ 999 + mask = 0x7000; /* jnz */ 1000 + /* lgfi %w1,imm (load sign extend imm) */ 1001 + EMIT6_IMM(0xc0010000, REG_W1, imm); 1002 + /* ngr %w1,%dst */ 1003 + EMIT4(0xb9800000, REG_W1, dst_reg); 1004 + goto branch_oc; 1005 + 1006 + case BPF_JMP | BPF_JSGT | BPF_X: /* ((s64) dst > (s64) src) */ 1007 + mask = 0x2000; /* jh */ 1008 + goto branch_xs; 1009 + case BPF_JMP | BPF_JSGE | BPF_X: /* ((s64) dst >= (s64) src) */ 1010 + mask = 0xa000; /* jhe */ 1011 + goto branch_xs; 1012 + case BPF_JMP | BPF_JGT | BPF_X: /* (dst > src) */ 1013 + mask = 0x2000; /* jh */ 1014 + goto branch_xu; 1015 + case BPF_JMP | BPF_JGE | BPF_X: /* (dst >= src) */ 1016 + mask = 0xa000; /* jhe */ 1017 + goto branch_xu; 1018 + case BPF_JMP | BPF_JNE | BPF_X: /* (dst != src) */ 1019 + mask = 0x7000; /* jne */ 1020 + goto branch_xu; 1021 + case BPF_JMP | BPF_JEQ | BPF_X: /* (dst == src) */ 1022 + mask = 0x8000; /* je */ 1023 + goto branch_xu; 1024 + case BPF_JMP | BPF_JSET | BPF_X: /* (dst & src) */ 1025 + mask = 0x7000; /* jnz */ 1026 + /* ngrk %w1,%dst,%src */ 1027 + EMIT4_RRF(0xb9e40000, REG_W1, dst_reg, src_reg); 1028 + goto branch_oc; 1029 + branch_ks: 1030 + /* lgfi %w1,imm (load sign extend imm) */ 1031 + EMIT6_IMM(0xc0010000, REG_W1, imm); 1032 + /* cgrj %dst,%w1,mask,off */ 1033 + EMIT6_PCREL(0xec000000, 0x0064, dst_reg, REG_W1, i, off, mask); 648 1034 break; 649 - case BPF_STX: /* mem[K] = X : mov %ebx,off8(%rbp) */ 650 - jit->seen |= SEEN_XREG | SEEN_MEM; 651 - /* st %r12,<K>(%r15) */ 652 - EMIT4_DISP(0x50c0f000, 653 - (jit->seen & SEEN_DATAREF) ? 160 + K*4 : K*4); 1035 + branch_ku: 1036 + /* lgfi %w1,imm (load sign extend imm) */ 1037 + EMIT6_IMM(0xc0010000, REG_W1, imm); 1038 + /* clgrj %dst,%w1,mask,off */ 1039 + EMIT6_PCREL(0xec000000, 0x0065, dst_reg, REG_W1, i, off, mask); 654 1040 break; 655 - case BPF_ANC | SKF_AD_PROTOCOL: /* A = ntohs(skb->protocol); */ 656 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, protocol) != 2); 657 - /* lhi %r5,0 */ 658 - EMIT4(0xa7580000); 659 - /* icm %r5,3,<d(protocol)>(%r2) */ 660 - EMIT4_DISP(0xbf532000, offsetof(struct sk_buff, protocol)); 1041 + branch_xs: 1042 + /* cgrj %dst,%src,mask,off */ 1043 + EMIT6_PCREL(0xec000000, 0x0064, dst_reg, src_reg, i, off, mask); 661 1044 break; 662 - case BPF_ANC | SKF_AD_IFINDEX: /* if (!skb->dev) return 0; 663 - * A = skb->dev->ifindex */ 664 - BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4); 665 - jit->seen |= SEEN_RET0; 666 - /* lg %r1,<d(dev)>(%r2) */ 667 - EMIT6_DISP(0xe3102000, 0x0004, offsetof(struct sk_buff, dev)); 668 - /* ltgr %r1,%r1 */ 669 - EMIT4(0xb9020011); 670 - /* jz <ret0> */ 671 - EMIT4_PCREL(0xa7840000, jit->ret0_ip - jit->prg); 672 - /* l %r5,<d(ifindex)>(%r1) */ 673 - EMIT4_DISP(0x58501000, offsetof(struct net_device, ifindex)); 1045 + branch_xu: 1046 + /* clgrj %dst,%src,mask,off */ 1047 + EMIT6_PCREL(0xec000000, 0x0065, dst_reg, src_reg, i, off, mask); 674 1048 break; 675 - case BPF_ANC | SKF_AD_MARK: /* A = skb->mark */ 676 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4); 677 - /* l %r5,<d(mark)>(%r2) */ 678 - EMIT4_DISP(0x58502000, offsetof(struct sk_buff, mark)); 1049 + branch_oc: 1050 + /* brc mask,jmp_off (branch instruction needs 4 bytes) */ 1051 + jmp_off = addrs[i + off + 1] - (addrs[i + 1] - 4); 1052 + EMIT4_PCREL(0xa7040000 | mask << 8, jmp_off); 679 1053 break; 680 - case BPF_ANC | SKF_AD_QUEUE: /* A = skb->queue_mapping */ 681 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, queue_mapping) != 2); 682 - /* lhi %r5,0 */ 683 - EMIT4(0xa7580000); 684 - /* icm %r5,3,<d(queue_mapping)>(%r2) */ 685 - EMIT4_DISP(0xbf532000, offsetof(struct sk_buff, queue_mapping)); 686 - break; 687 - case BPF_ANC | SKF_AD_HATYPE: /* if (!skb->dev) return 0; 688 - * A = skb->dev->type */ 689 - BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2); 690 - jit->seen |= SEEN_RET0; 691 - /* lg %r1,<d(dev)>(%r2) */ 692 - EMIT6_DISP(0xe3102000, 0x0004, offsetof(struct sk_buff, dev)); 693 - /* ltgr %r1,%r1 */ 694 - EMIT4(0xb9020011); 695 - /* jz <ret0> */ 696 - EMIT4_PCREL(0xa7840000, jit->ret0_ip - jit->prg); 697 - /* lhi %r5,0 */ 698 - EMIT4(0xa7580000); 699 - /* icm %r5,3,<d(type)>(%r1) */ 700 - EMIT4_DISP(0xbf531000, offsetof(struct net_device, type)); 701 - break; 702 - case BPF_ANC | SKF_AD_RXHASH: /* A = skb->hash */ 703 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4); 704 - /* l %r5,<d(hash)>(%r2) */ 705 - EMIT4_DISP(0x58502000, offsetof(struct sk_buff, hash)); 706 - break; 707 - case BPF_ANC | SKF_AD_VLAN_TAG: 708 - case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT: 709 - BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2); 710 - BUILD_BUG_ON(VLAN_TAG_PRESENT != 0x1000); 711 - /* lhi %r5,0 */ 712 - EMIT4(0xa7580000); 713 - /* icm %r5,3,<d(vlan_tci)>(%r2) */ 714 - EMIT4_DISP(0xbf532000, offsetof(struct sk_buff, vlan_tci)); 715 - if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) { 716 - /* nill %r5,0xefff */ 717 - EMIT4_IMM(0xa5570000, ~VLAN_TAG_PRESENT); 718 - } else { 719 - /* nill %r5,0x1000 */ 720 - EMIT4_IMM(0xa5570000, VLAN_TAG_PRESENT); 721 - /* srl %r5,12 */ 722 - EMIT4_DISP(0x88500000, 12); 723 - } 724 - break; 725 - case BPF_ANC | SKF_AD_PKTTYPE: 726 - /* lhi %r5,0 */ 727 - EMIT4(0xa7580000); 728 - /* ic %r5,<d(pkt_type_offset)>(%r2) */ 729 - EMIT4_DISP(0x43502000, PKT_TYPE_OFFSET()); 730 - /* srl %r5,5 */ 731 - EMIT4_DISP(0x88500000, 5); 732 - break; 733 - case BPF_ANC | SKF_AD_CPU: /* A = smp_processor_id() */ 734 - #ifdef CONFIG_SMP 735 - /* l %r5,<d(cpu_nr)> */ 736 - EMIT4_DISP(0x58500000, offsetof(struct _lowcore, cpu_nr)); 737 - #else 738 - /* lhi %r5,0 */ 739 - EMIT4(0xa7580000); 740 - #endif 1054 + /* 1055 + * BPF_LD 1056 + */ 1057 + case BPF_LD | BPF_ABS | BPF_B: /* b0 = *(u8 *) (skb->data+imm) */ 1058 + case BPF_LD | BPF_IND | BPF_B: /* b0 = *(u8 *) (skb->data+imm+src) */ 1059 + if ((BPF_MODE(insn->code) == BPF_ABS) && (imm >= 0)) 1060 + func_addr = __pa(sk_load_byte_pos); 1061 + else 1062 + func_addr = __pa(sk_load_byte); 1063 + goto call_fn; 1064 + case BPF_LD | BPF_ABS | BPF_H: /* b0 = *(u16 *) (skb->data+imm) */ 1065 + case BPF_LD | BPF_IND | BPF_H: /* b0 = *(u16 *) (skb->data+imm+src) */ 1066 + if ((BPF_MODE(insn->code) == BPF_ABS) && (imm >= 0)) 1067 + func_addr = __pa(sk_load_half_pos); 1068 + else 1069 + func_addr = __pa(sk_load_half); 1070 + goto call_fn; 1071 + case BPF_LD | BPF_ABS | BPF_W: /* b0 = *(u32 *) (skb->data+imm) */ 1072 + case BPF_LD | BPF_IND | BPF_W: /* b0 = *(u32 *) (skb->data+imm+src) */ 1073 + if ((BPF_MODE(insn->code) == BPF_ABS) && (imm >= 0)) 1074 + func_addr = __pa(sk_load_word_pos); 1075 + else 1076 + func_addr = __pa(sk_load_word); 1077 + goto call_fn; 1078 + call_fn: 1079 + jit->seen |= SEEN_SKB | SEEN_RET0 | SEEN_FUNC; 1080 + REG_SET_SEEN(REG_14); /* Return address of possible func call */ 1081 + 1082 + /* 1083 + * Implicit input: 1084 + * BPF_REG_6 (R7) : skb pointer 1085 + * REG_SKB_DATA (R12): skb data pointer 1086 + * 1087 + * Calculated input: 1088 + * BPF_REG_2 (R3) : offset of byte(s) to fetch in skb 1089 + * BPF_REG_5 (R6) : return address 1090 + * 1091 + * Output: 1092 + * BPF_REG_0 (R14): data read from skb 1093 + * 1094 + * Scratch registers (BPF_REG_1-5) 1095 + */ 1096 + 1097 + /* Call function: llilf %w1,func_addr */ 1098 + EMIT6_IMM(0xc00f0000, REG_W1, func_addr); 1099 + 1100 + /* Offset: lgfi %b2,imm */ 1101 + EMIT6_IMM(0xc0010000, BPF_REG_2, imm); 1102 + if (BPF_MODE(insn->code) == BPF_IND) 1103 + /* agfr %b2,%src (%src is s32 here) */ 1104 + EMIT4(0xb9180000, BPF_REG_2, src_reg); 1105 + 1106 + /* basr %b5,%w1 (%b5 is call saved) */ 1107 + EMIT2(0x0d00, BPF_REG_5, REG_W1); 1108 + 1109 + /* 1110 + * Note: For fast access we jump directly after the 1111 + * jnz instruction from bpf_jit.S 1112 + */ 1113 + /* jnz <ret0> */ 1114 + EMIT4_PCREL(0xa7740000, jit->ret0_ip - jit->prg); 741 1115 break; 742 1116 default: /* too complex, give up */ 743 - goto out; 1117 + pr_err("Unknown opcode %02x\n", insn->code); 1118 + return -1; 744 1119 } 745 - addrs[i] = jit->prg - jit->start; 746 - return 0; 747 - out: 748 - return -1; 1120 + return insn_count; 749 1121 } 750 1122 1123 + /* 1124 + * Compile eBPF program into s390x code 1125 + */ 1126 + static int bpf_jit_prog(struct bpf_jit *jit, struct bpf_prog *fp) 1127 + { 1128 + int i, insn_count; 1129 + 1130 + jit->lit = jit->lit_start; 1131 + jit->prg = 0; 1132 + 1133 + bpf_jit_prologue(jit); 1134 + for (i = 0; i < fp->len; i += insn_count) { 1135 + insn_count = bpf_jit_insn(jit, fp, i); 1136 + if (insn_count < 0) 1137 + return -1; 1138 + jit->addrs[i + 1] = jit->prg; /* Next instruction address */ 1139 + } 1140 + bpf_jit_epilogue(jit); 1141 + 1142 + jit->lit_start = jit->prg; 1143 + jit->size = jit->lit; 1144 + jit->size_prg = jit->prg; 1145 + return 0; 1146 + } 1147 + 1148 + /* 1149 + * Classic BPF function stub. BPF programs will be converted into 1150 + * eBPF and then bpf_int_jit_compile() will be called. 1151 + */ 751 1152 void bpf_jit_compile(struct bpf_prog *fp) 752 1153 { 753 - struct bpf_binary_header *header = NULL; 754 - unsigned long size, prg_len, lit_len; 755 - struct bpf_jit jit, cjit; 756 - unsigned int *addrs; 757 - int pass, i; 1154 + } 1155 + 1156 + /* 1157 + * Compile eBPF program "fp" 1158 + */ 1159 + void bpf_int_jit_compile(struct bpf_prog *fp) 1160 + { 1161 + struct bpf_binary_header *header; 1162 + struct bpf_jit jit; 1163 + int pass; 758 1164 759 1165 if (!bpf_jit_enable) 760 1166 return; 761 - addrs = kcalloc(fp->len, sizeof(*addrs), GFP_KERNEL); 762 - if (addrs == NULL) 1167 + memset(&jit, 0, sizeof(jit)); 1168 + jit.addrs = kcalloc(fp->len + 1, sizeof(*jit.addrs), GFP_KERNEL); 1169 + if (jit.addrs == NULL) 763 1170 return; 764 - memset(&jit, 0, sizeof(cjit)); 765 - memset(&cjit, 0, sizeof(cjit)); 766 - 767 - for (pass = 0; pass < 10; pass++) { 768 - jit.prg = jit.start; 769 - jit.lit = jit.mid; 770 - 771 - bpf_jit_prologue(&jit); 772 - bpf_jit_noleaks(&jit, fp->insns); 773 - for (i = 0; i < fp->len; i++) { 774 - if (bpf_jit_insn(&jit, fp->insns + i, addrs, i, 775 - i == fp->len - 1)) 776 - goto out; 777 - } 778 - bpf_jit_epilogue(&jit); 779 - if (jit.start) { 780 - WARN_ON(jit.prg > cjit.prg || jit.lit > cjit.lit); 781 - if (memcmp(&jit, &cjit, sizeof(jit)) == 0) 782 - break; 783 - } else if (jit.prg == cjit.prg && jit.lit == cjit.lit) { 784 - prg_len = jit.prg - jit.start; 785 - lit_len = jit.lit - jit.mid; 786 - size = prg_len + lit_len; 787 - if (size >= BPF_SIZE_MAX) 788 - goto out; 789 - header = bpf_jit_binary_alloc(size, &jit.start, 790 - 2, bpf_jit_fill_hole); 791 - if (!header) 792 - goto out; 793 - jit.prg = jit.mid = jit.start + prg_len; 794 - jit.lit = jit.end = jit.start + prg_len + lit_len; 795 - jit.base_ip += (unsigned long) jit.start; 796 - jit.exit_ip += (unsigned long) jit.start; 797 - jit.ret0_ip += (unsigned long) jit.start; 798 - } 799 - cjit = jit; 1171 + /* 1172 + * Three initial passes: 1173 + * - 1/2: Determine clobbered registers 1174 + * - 3: Calculate program size and addrs arrray 1175 + */ 1176 + for (pass = 1; pass <= 3; pass++) { 1177 + if (bpf_jit_prog(&jit, fp)) 1178 + goto free_addrs; 800 1179 } 1180 + /* 1181 + * Final pass: Allocate and generate program 1182 + */ 1183 + if (jit.size >= BPF_SIZE_MAX) 1184 + goto free_addrs; 1185 + header = bpf_jit_binary_alloc(jit.size, &jit.prg_buf, 2, jit_fill_hole); 1186 + if (!header) 1187 + goto free_addrs; 1188 + if (bpf_jit_prog(&jit, fp)) 1189 + goto free_addrs; 801 1190 if (bpf_jit_enable > 1) { 802 - bpf_jit_dump(fp->len, jit.end - jit.start, pass, jit.start); 803 - if (jit.start) 804 - print_fn_code(jit.start, jit.mid - jit.start); 1191 + bpf_jit_dump(fp->len, jit.size, pass, jit.prg_buf); 1192 + if (jit.prg_buf) 1193 + print_fn_code(jit.prg_buf, jit.size_prg); 805 1194 } 806 - if (jit.start) { 1195 + if (jit.prg_buf) { 807 1196 set_memory_ro((unsigned long)header, header->pages); 808 - fp->bpf_func = (void *) jit.start; 1197 + fp->bpf_func = (void *) jit.prg_buf; 809 1198 fp->jited = true; 810 1199 } 811 - out: 812 - kfree(addrs); 1200 + free_addrs: 1201 + kfree(jit.addrs); 813 1202 } 814 1203 1204 + /* 1205 + * Free eBPF program 1206 + */ 815 1207 void bpf_jit_free(struct bpf_prog *fp) 816 1208 { 817 1209 unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
+6
arch/s390/pci/pci.c
··· 190 190 return -ENOMEM; 191 191 WARN_ON((u64) zdev->fmb & 0xf); 192 192 193 + /* reset software counters */ 194 + atomic64_set(&zdev->allocated_pages, 0); 195 + atomic64_set(&zdev->mapped_pages, 0); 196 + atomic64_set(&zdev->unmapped_pages, 0); 197 + 193 198 args.fmb_addr = virt_to_phys(zdev->fmb); 194 199 return mod_pci(zdev, ZPCI_MOD_FC_SET_MEASURE, 0, &args); 195 200 } ··· 827 822 if (rc) 828 823 goto out; 829 824 825 + mutex_init(&zdev->lock); 830 826 if (zdev->state == ZPCI_FN_STATE_CONFIGURED) { 831 827 rc = zpci_enable_device(zdev); 832 828 if (rc)
+22 -11
arch/s390/pci/pci_debug.c
··· 31 31 "Refresh operations", 32 32 "DMA read bytes", 33 33 "DMA write bytes", 34 - /* software counters */ 34 + }; 35 + 36 + static char *pci_sw_names[] = { 35 37 "Allocated pages", 36 38 "Mapped pages", 37 39 "Unmapped pages", 38 40 }; 41 + 42 + static void pci_sw_counter_show(struct seq_file *m) 43 + { 44 + struct zpci_dev *zdev = m->private; 45 + atomic64_t *counter = &zdev->allocated_pages; 46 + int i; 47 + 48 + for (i = 0; i < ARRAY_SIZE(pci_sw_names); i++, counter++) 49 + seq_printf(m, "%26s:\t%llu\n", pci_sw_names[i], 50 + atomic64_read(counter)); 51 + } 39 52 40 53 static int pci_perf_show(struct seq_file *m, void *v) 41 54 { ··· 58 45 59 46 if (!zdev) 60 47 return 0; 48 + 49 + mutex_lock(&zdev->lock); 61 50 if (!zdev->fmb) { 51 + mutex_unlock(&zdev->lock); 62 52 seq_puts(m, "FMB statistics disabled\n"); 63 53 return 0; 64 54 } ··· 81 65 for (i = 4; i < 6; i++) 82 66 seq_printf(m, "%26s:\t%llu\n", 83 67 pci_perf_names[i], *(stat + i)); 84 - /* software counters */ 85 - for (i = 6; i < ARRAY_SIZE(pci_perf_names); i++) 86 - seq_printf(m, "%26s:\t%llu\n", 87 - pci_perf_names[i], 88 - atomic64_read((atomic64_t *) (stat + i))); 89 68 69 + pci_sw_counter_show(m); 70 + mutex_unlock(&zdev->lock); 90 71 return 0; 91 72 } 92 73 ··· 101 88 if (rc) 102 89 return rc; 103 90 91 + mutex_lock(&zdev->lock); 104 92 switch (val) { 105 93 case 0: 106 94 rc = zpci_fmb_disable_device(zdev); 107 - if (rc) 108 - return rc; 109 95 break; 110 96 case 1: 111 97 rc = zpci_fmb_enable_device(zdev); 112 - if (rc) 113 - return rc; 114 98 break; 115 99 } 116 - return count; 100 + mutex_unlock(&zdev->lock); 101 + return rc ? rc : count; 117 102 } 118 103 119 104 static int pci_perf_seq_open(struct inode *inode, struct file *filp)
+4 -4
arch/s390/pci/pci_dma.c
··· 300 300 flags |= ZPCI_TABLE_PROTECTED; 301 301 302 302 if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) { 303 - atomic64_add(nr_pages, &zdev->fmb->mapped_pages); 303 + atomic64_add(nr_pages, &zdev->mapped_pages); 304 304 return dma_addr + (offset & ~PAGE_MASK); 305 305 } 306 306 ··· 328 328 zpci_err_hex(&dma_addr, sizeof(dma_addr)); 329 329 } 330 330 331 - atomic64_add(npages, &zdev->fmb->unmapped_pages); 331 + atomic64_add(npages, &zdev->unmapped_pages); 332 332 iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT; 333 333 dma_free_iommu(zdev, iommu_page_index, npages); 334 334 } ··· 357 357 return NULL; 358 358 } 359 359 360 - atomic64_add(size / PAGE_SIZE, &zdev->fmb->allocated_pages); 360 + atomic64_add(size / PAGE_SIZE, &zdev->allocated_pages); 361 361 if (dma_handle) 362 362 *dma_handle = map; 363 363 return (void *) pa; ··· 370 370 struct zpci_dev *zdev = get_zdev(to_pci_dev(dev)); 371 371 372 372 size = PAGE_ALIGN(size); 373 - atomic64_sub(size / PAGE_SIZE, &zdev->fmb->allocated_pages); 373 + atomic64_sub(size / PAGE_SIZE, &zdev->allocated_pages); 374 374 s390_dma_unmap_pages(dev, dma_handle, size, DMA_BIDIRECTIONAL, NULL); 375 375 free_pages((unsigned long) pa, get_order(size)); 376 376 }
+27 -15
drivers/s390/block/dasd.c
··· 579 579 { 580 580 dasd_get_device(device); 581 581 /* queue call to dasd_kick_device to the kernel event daemon. */ 582 - schedule_work(&device->kick_work); 582 + if (!schedule_work(&device->kick_work)) 583 + dasd_put_device(device); 583 584 } 584 585 EXPORT_SYMBOL(dasd_kick_device); 585 586 ··· 600 599 { 601 600 dasd_get_device(device); 602 601 /* queue call to dasd_reload_device to the kernel event daemon. */ 603 - schedule_work(&device->reload_device); 602 + if (!schedule_work(&device->reload_device)) 603 + dasd_put_device(device); 604 604 } 605 605 EXPORT_SYMBOL(dasd_reload_device); 606 606 ··· 621 619 { 622 620 dasd_get_device(device); 623 621 /* queue call to dasd_restore_device to the kernel event daemon. */ 624 - schedule_work(&device->restore_device); 622 + if (!schedule_work(&device->restore_device)) 623 + dasd_put_device(device); 625 624 } 626 625 627 626 /* ··· 2166 2163 cqr->intrc = -ENOLINK; 2167 2164 continue; 2168 2165 } 2169 - /* Don't try to start requests if device is stopped */ 2170 - if (interruptible) { 2171 - rc = wait_event_interruptible( 2172 - generic_waitq, !(device->stopped)); 2173 - if (rc == -ERESTARTSYS) { 2174 - cqr->status = DASD_CQR_FAILED; 2175 - maincqr->intrc = rc; 2176 - continue; 2177 - } 2178 - } else 2179 - wait_event(generic_waitq, !(device->stopped)); 2180 - 2166 + /* 2167 + * Don't try to start requests if device is stopped 2168 + * except path verification requests 2169 + */ 2170 + if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { 2171 + if (interruptible) { 2172 + rc = wait_event_interruptible( 2173 + generic_waitq, !(device->stopped)); 2174 + if (rc == -ERESTARTSYS) { 2175 + cqr->status = DASD_CQR_FAILED; 2176 + maincqr->intrc = rc; 2177 + continue; 2178 + } 2179 + } else 2180 + wait_event(generic_waitq, !(device->stopped)); 2181 + } 2181 2182 if (!cqr->callback) 2182 2183 cqr->callback = dasd_wakeup_cb; 2183 2184 ··· 2531 2524 __blk_end_request_all(req, -EIO); 2532 2525 return; 2533 2526 } 2527 + 2528 + /* if device ist stopped do not fetch new requests */ 2529 + if (basedev->stopped) 2530 + return; 2531 + 2534 2532 /* Now we try to fetch requests from the request queue */ 2535 2533 while ((req = blk_peek_request(queue))) { 2536 2534 if (basedev->features & DASD_FEATURE_READONLY &&
+2 -1
drivers/s390/block/dasd_eckd.c
··· 1628 1628 return; 1629 1629 } 1630 1630 /* queue call to do_validate_server to the kernel event daemon. */ 1631 - schedule_work(&device->kick_validate); 1631 + if (!schedule_work(&device->kick_validate)) 1632 + dasd_put_device(device); 1632 1633 } 1633 1634 1634 1635 static u32 get_fcx_max_data(struct dasd_device *device)
+46 -2
drivers/s390/char/sclp_cmd.c
··· 315 315 rc |= sclp_assign_storage(incr->rn); 316 316 else 317 317 sclp_unassign_storage(incr->rn); 318 + if (rc == 0) 319 + incr->standby = online ? 0 : 1; 318 320 } 319 321 return rc ? -EIO : 0; 322 + } 323 + 324 + static bool contains_standby_increment(unsigned long start, unsigned long end) 325 + { 326 + struct memory_increment *incr; 327 + unsigned long istart; 328 + 329 + list_for_each_entry(incr, &sclp_mem_list, list) { 330 + istart = rn2addr(incr->rn); 331 + if (end - 1 < istart) 332 + continue; 333 + if (start > istart + sclp_rzm - 1) 334 + continue; 335 + if (incr->standby) 336 + return true; 337 + } 338 + return false; 320 339 } 321 340 322 341 static int sclp_mem_notifier(struct notifier_block *nb, ··· 353 334 for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1) 354 335 sclp_attach_storage(id); 355 336 switch (action) { 356 - case MEM_ONLINE: 357 337 case MEM_GOING_OFFLINE: 338 + /* 339 + * We do not allow to set memory blocks offline that contain 340 + * standby memory. This is done to simplify the "memory online" 341 + * case. 342 + */ 343 + if (contains_standby_increment(start, start + size)) 344 + rc = -EPERM; 345 + break; 346 + case MEM_ONLINE: 358 347 case MEM_CANCEL_OFFLINE: 359 348 break; 360 349 case MEM_GOING_ONLINE: ··· 388 361 .notifier_call = sclp_mem_notifier, 389 362 }; 390 363 364 + static void __init align_to_block_size(unsigned long long *start, 365 + unsigned long long *size) 366 + { 367 + unsigned long long start_align, size_align, alignment; 368 + 369 + alignment = memory_block_size_bytes(); 370 + start_align = roundup(*start, alignment); 371 + size_align = rounddown(*start + *size, alignment) - start_align; 372 + 373 + pr_info("Standby memory at 0x%llx (%lluM of %lluM usable)\n", 374 + *start, size_align >> 20, *size >> 20); 375 + *start = start_align; 376 + *size = size_align; 377 + } 378 + 391 379 static void __init add_memory_merged(u16 rn) 392 380 { 393 381 static u16 first_rn, num; ··· 424 382 goto skip_add; 425 383 if (memory_end_set && (start + size > memory_end)) 426 384 size = memory_end - start; 427 - add_memory(0, start, size); 385 + align_to_block_size(&start, &size); 386 + if (size) 387 + add_memory(0, start, size); 428 388 skip_add: 429 389 first_rn = rn; 430 390 num = 1;