2 * BPF Jit compiler for s390, help functions.
4 * Copyright IBM Corp. 2012
6 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
8 #include <linux/linkage.h>
12 * registers %r2, %r6-%r8, %r10-%r11, %r13, %r15 are call saved
14 * %r3: offset parameter
15 * %r5: BPF A accumulator
17 * %r9: save register for skb pointer
19 * %r11: skb->len - skb->data_len (headlen)
20 * %r12: BPF X accumulator
22 * skb_copy_bits takes 4 parameters:
24 * %r3 = offset into skb data
25 * %r4 = pointer to temp buffer
26 * %r5 = length to copy
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
35 /* A = *(u32 *) (skb->data+K) */
37 llgfr %r1,%r3 # extend offset
38 ahi %r3,4 # offset + 4
39 clr %r11,%r3 # hlen <= offset + 4 ?
41 l %r5,0(%r1,%r10) # get word from skb
42 xr %r1,%r1 # set cc to zero
46 lgr %r9,%r2 # save %r2
48 la %r4,160(%r15) # pointer to temp buffer
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
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
61 /* A = *(u16 *) (skb->data+K) */
63 llgfr %r1,%r3 # extend offset
64 ahi %r3,2 # offset + 2
65 clr %r11,%r3 # hlen <= offset + 2 ?
67 llgh %r5,0(%r1,%r10) # get half from skb
68 xr %r1,%r1 # set cc to zero
72 lgr %r9,%r2 # save %r2
74 la %r4,162(%r15) # pointer to temp buffer
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
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
88 /* A = *(u8 *) (skb->data+K) */
90 llgfr %r1,%r3 # extend offset
91 clr %r11,%r3 # hlen < offset ?
94 ic %r5,0(%r1,%r10) # get byte from skb
95 xr %r1,%r1 # set cc to zero
99 lgr %r9,%r2 # save %r2
100 la %r4,163(%r15) # pointer to temp buffer
102 brasl %r14,skb_copy_bits # get data from skb
103 xc 160(3,%r15),160(%r15)
104 l %r5,160(%r15) # load result from temp buffer
105 ltgr %r2,%r2 # set cc to (%r2 != 0)
106 lgr %r2,%r9 # restore %r2
109 /* A = (*(u8 *)(skb->data+K) & 0xf) << 2 */
110 ENTRY(sk_load_byte_msh)
111 llgfr %r1,%r3 # extend offset
112 clr %r11,%r3 # hlen < offset ?
113 jle sk_load_byte_slow
115 ic %r12,0(%r1,%r10) # get byte from skb
118 xr %r1,%r1 # set cc to zero
121 sk_load_byte_msh_slow:
122 lgr %r9,%r2 # save %r2
123 la %r4,162(%r15) # pointer to temp buffer
125 brasl %r14,skb_copy_bits # get data from skb
126 xc 160(3,%r15),160(%r15)
127 l %r12,160(%r15) # load result from temp buffer
130 ltgr %r2,%r2 # set cc to (%r2 != 0)
131 lgr %r2,%r9 # restore %r2