]> Git Repo - linux.git/blob - arch/sparc/net/bpf_jit_asm_64.S
tcp: add tp->tcp_mstamp field
[linux.git] / arch / sparc / net / bpf_jit_asm_64.S
1 #include <asm/ptrace.h>
2
3 #include "bpf_jit_64.h"
4
5 #define SAVE_SZ         176
6 #define SCRATCH_OFF     STACK_BIAS + 128
7 #define BE_PTR(label)   be,pn %xcc, label
8 #define SIGN_EXTEND(reg)        sra reg, 0, reg
9
10 #define SKF_MAX_NEG_OFF (-0x200000) /* SKF_LL_OFF from filter.h */
11
12         .text
13         .globl  bpf_jit_load_word
14 bpf_jit_load_word:
15         cmp     r_OFF, 0
16         bl      bpf_slow_path_word_neg
17          nop
18         .globl  bpf_jit_load_word_positive_offset
19 bpf_jit_load_word_positive_offset:
20         sub     r_HEADLEN, r_OFF, r_TMP
21         cmp     r_TMP, 3
22         ble     bpf_slow_path_word
23          add    r_SKB_DATA, r_OFF, r_TMP
24         andcc   r_TMP, 3, %g0
25         bne     load_word_unaligned
26          nop
27         retl
28          ld     [r_TMP], r_RESULT
29 load_word_unaligned:
30         ldub    [r_TMP + 0x0], r_OFF
31         ldub    [r_TMP + 0x1], r_TMP2
32         sll     r_OFF, 8, r_OFF
33         or      r_OFF, r_TMP2, r_OFF
34         ldub    [r_TMP + 0x2], r_TMP2
35         sll     r_OFF, 8, r_OFF
36         or      r_OFF, r_TMP2, r_OFF
37         ldub    [r_TMP + 0x3], r_TMP2
38         sll     r_OFF, 8, r_OFF
39         retl
40          or     r_OFF, r_TMP2, r_RESULT
41
42         .globl  bpf_jit_load_half
43 bpf_jit_load_half:
44         cmp     r_OFF, 0
45         bl      bpf_slow_path_half_neg
46          nop
47         .globl  bpf_jit_load_half_positive_offset
48 bpf_jit_load_half_positive_offset:
49         sub     r_HEADLEN, r_OFF, r_TMP
50         cmp     r_TMP, 1
51         ble     bpf_slow_path_half
52          add    r_SKB_DATA, r_OFF, r_TMP
53         andcc   r_TMP, 1, %g0
54         bne     load_half_unaligned
55          nop
56         retl
57          lduh   [r_TMP], r_RESULT
58 load_half_unaligned:
59         ldub    [r_TMP + 0x0], r_OFF
60         ldub    [r_TMP + 0x1], r_TMP2
61         sll     r_OFF, 8, r_OFF
62         retl
63          or     r_OFF, r_TMP2, r_RESULT
64
65         .globl  bpf_jit_load_byte
66 bpf_jit_load_byte:
67         cmp     r_OFF, 0
68         bl      bpf_slow_path_byte_neg
69          nop
70         .globl  bpf_jit_load_byte_positive_offset
71 bpf_jit_load_byte_positive_offset:
72         cmp     r_OFF, r_HEADLEN
73         bge     bpf_slow_path_byte
74          nop
75         retl
76          ldub   [r_SKB_DATA + r_OFF], r_RESULT
77
78 #define bpf_slow_path_common(LEN)       \
79         save    %sp, -SAVE_SZ, %sp;     \
80         mov     %i0, %o0;               \
81         mov     %i1, %o1;               \
82         add     %fp, SCRATCH_OFF, %o2;  \
83         call    skb_copy_bits;          \
84          mov    (LEN), %o3;             \
85         cmp     %o0, 0;                 \
86         restore;
87
88 bpf_slow_path_word:
89         bpf_slow_path_common(4)
90         bl      bpf_error
91          ld     [%sp + SCRATCH_OFF], r_RESULT
92         retl
93          nop
94 bpf_slow_path_half:
95         bpf_slow_path_common(2)
96         bl      bpf_error
97          lduh   [%sp + SCRATCH_OFF], r_RESULT
98         retl
99          nop
100 bpf_slow_path_byte:
101         bpf_slow_path_common(1)
102         bl      bpf_error
103          ldub   [%sp + SCRATCH_OFF], r_RESULT
104         retl
105          nop
106
107 #define bpf_negative_common(LEN)                        \
108         save    %sp, -SAVE_SZ, %sp;                     \
109         mov     %i0, %o0;                               \
110         mov     %i1, %o1;                               \
111         SIGN_EXTEND(%o1);                               \
112         call    bpf_internal_load_pointer_neg_helper;   \
113          mov    (LEN), %o2;                             \
114         mov     %o0, r_TMP;                             \
115         cmp     %o0, 0;                                 \
116         BE_PTR(bpf_error);                              \
117          restore;
118
119 bpf_slow_path_word_neg:
120         sethi   %hi(SKF_MAX_NEG_OFF), r_TMP
121         cmp     r_OFF, r_TMP
122         bl      bpf_error
123          nop
124         .globl  bpf_jit_load_word_negative_offset
125 bpf_jit_load_word_negative_offset:
126         bpf_negative_common(4)
127         andcc   r_TMP, 3, %g0
128         bne     load_word_unaligned
129          nop
130         retl
131          ld     [r_TMP], r_RESULT
132
133 bpf_slow_path_half_neg:
134         sethi   %hi(SKF_MAX_NEG_OFF), r_TMP
135         cmp     r_OFF, r_TMP
136         bl      bpf_error
137          nop
138         .globl  bpf_jit_load_half_negative_offset
139 bpf_jit_load_half_negative_offset:
140         bpf_negative_common(2)
141         andcc   r_TMP, 1, %g0
142         bne     load_half_unaligned
143          nop
144         retl
145          lduh   [r_TMP], r_RESULT
146
147 bpf_slow_path_byte_neg:
148         sethi   %hi(SKF_MAX_NEG_OFF), r_TMP
149         cmp     r_OFF, r_TMP
150         bl      bpf_error
151          nop
152         .globl  bpf_jit_load_byte_negative_offset
153 bpf_jit_load_byte_negative_offset:
154         bpf_negative_common(1)
155         retl
156          ldub   [r_TMP], r_RESULT
157
158 bpf_error:
159         /* Make the JIT program itself return zero. */
160         ret
161         restore %g0, %g0, %o0
This page took 0.041445 seconds and 4 git commands to generate.