1
2 #include <asm/ptrace.h>
3
4 #include "bpf_jit_32.h"
5
6 #define SAVE_SZ 96
7 #define SCRATCH_OFF 72
8 #define BE_PTR(label) be label
9 #define SIGN_EXTEND(reg)
10
11 #define SKF_MAX_NEG_OFF (-0x200000)
12
13 .text
14 .globl bpf_jit_load_word
15 bpf_jit_load_word:
16 cmp r_OFF, 0
17 bl bpf_slow_path_word_neg
18 nop
19 .globl bpf_jit_load_word_positive_offset
20 bpf_jit_load_word_positive_offset:
21 sub r_HEADLEN, r_OFF, r_TMP
22 cmp r_TMP, 3
23 ble bpf_slow_path_word
24 add r_SKB_DATA, r_OFF, r_TMP
25 andcc r_TMP, 3, %g0
26 bne load_word_unaligned
27 nop
28 retl
29 ld [r_TMP], r_A
30 load_word_unaligned:
31 ldub [r_TMP + 0x0], r_OFF
32 ldub [r_TMP + 0x1], r_TMP2
33 sll r_OFF, 8, r_OFF
34 or r_OFF, r_TMP2, r_OFF
35 ldub [r_TMP + 0x2], r_TMP2
36 sll r_OFF, 8, r_OFF
37 or r_OFF, r_TMP2, r_OFF
38 ldub [r_TMP + 0x3], r_TMP2
39 sll r_OFF, 8, r_OFF
40 retl
41 or r_OFF, r_TMP2, r_A
42
43 .globl bpf_jit_load_half
44 bpf_jit_load_half:
45 cmp r_OFF, 0
46 bl bpf_slow_path_half_neg
47 nop
48 .globl bpf_jit_load_half_positive_offset
49 bpf_jit_load_half_positive_offset:
50 sub r_HEADLEN, r_OFF, r_TMP
51 cmp r_TMP, 1
52 ble bpf_slow_path_half
53 add r_SKB_DATA, r_OFF, r_TMP
54 andcc r_TMP, 1, %g0
55 bne load_half_unaligned
56 nop
57 retl
58 lduh [r_TMP], r_A
59 load_half_unaligned:
60 ldub [r_TMP + 0x0], r_OFF
61 ldub [r_TMP + 0x1], r_TMP2
62 sll r_OFF, 8, r_OFF
63 retl
64 or r_OFF, r_TMP2, r_A
65
66 .globl bpf_jit_load_byte
67 bpf_jit_load_byte:
68 cmp r_OFF, 0
69 bl bpf_slow_path_byte_neg
70 nop
71 .globl bpf_jit_load_byte_positive_offset
72 bpf_jit_load_byte_positive_offset:
73 cmp r_OFF, r_HEADLEN
74 bge bpf_slow_path_byte
75 nop
76 retl
77 ldub [r_SKB_DATA + r_OFF], r_A
78
79 .globl bpf_jit_load_byte_msh
80 bpf_jit_load_byte_msh:
81 cmp r_OFF, 0
82 bl bpf_slow_path_byte_msh_neg
83 nop
84 .globl bpf_jit_load_byte_msh_positive_offset
85 bpf_jit_load_byte_msh_positive_offset:
86 cmp r_OFF, r_HEADLEN
87 bge bpf_slow_path_byte_msh
88 nop
89 ldub [r_SKB_DATA + r_OFF], r_OFF
90 and r_OFF, 0xf, r_OFF
91 retl
92 sll r_OFF, 2, r_X
93
94 #define bpf_slow_path_common(LEN) \
95 save %sp, -SAVE_SZ, %sp; \
96 mov %i0, %o0; \
97 mov r_OFF, %o1; \
98 add %fp, SCRATCH_OFF, %o2; \
99 call skb_copy_bits; \
100 mov (LEN), %o3; \
101 cmp %o0, 0; \
102 restore;
103
104 bpf_slow_path_word:
105 bpf_slow_path_common(4)
106 bl bpf_error
107 ld [%sp + SCRATCH_OFF], r_A
108 retl
109 nop
110 bpf_slow_path_half:
111 bpf_slow_path_common(2)
112 bl bpf_error
113 lduh [%sp + SCRATCH_OFF], r_A
114 retl
115 nop
116 bpf_slow_path_byte:
117 bpf_slow_path_common(1)
118 bl bpf_error
119 ldub [%sp + SCRATCH_OFF], r_A
120 retl
121 nop
122 bpf_slow_path_byte_msh:
123 bpf_slow_path_common(1)
124 bl bpf_error
125 ldub [%sp + SCRATCH_OFF], r_A
126 and r_OFF, 0xf, r_OFF
127 retl
128 sll r_OFF, 2, r_X
129
130 #define bpf_negative_common(LEN) \
131 save %sp, -SAVE_SZ, %sp; \
132 mov %i0, %o0; \
133 mov r_OFF, %o1; \
134 SIGN_EXTEND(%o1); \
135 call bpf_internal_load_pointer_neg_helper; \
136 mov (LEN), %o2; \
137 mov %o0, r_TMP; \
138 cmp %o0, 0; \
139 BE_PTR(bpf_error); \
140 restore;
141
142 bpf_slow_path_word_neg:
143 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
144 cmp r_OFF, r_TMP
145 bl bpf_error
146 nop
147 .globl bpf_jit_load_word_negative_offset
148 bpf_jit_load_word_negative_offset:
149 bpf_negative_common(4)
150 andcc r_TMP, 3, %g0
151 bne load_word_unaligned
152 nop
153 retl
154 ld [r_TMP], r_A
155
156 bpf_slow_path_half_neg:
157 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
158 cmp r_OFF, r_TMP
159 bl bpf_error
160 nop
161 .globl bpf_jit_load_half_negative_offset
162 bpf_jit_load_half_negative_offset:
163 bpf_negative_common(2)
164 andcc r_TMP, 1, %g0
165 bne load_half_unaligned
166 nop
167 retl
168 lduh [r_TMP], r_A
169
170 bpf_slow_path_byte_neg:
171 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
172 cmp r_OFF, r_TMP
173 bl bpf_error
174 nop
175 .globl bpf_jit_load_byte_negative_offset
176 bpf_jit_load_byte_negative_offset:
177 bpf_negative_common(1)
178 retl
179 ldub [r_TMP], r_A
180
181 bpf_slow_path_byte_msh_neg:
182 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
183 cmp r_OFF, r_TMP
184 bl bpf_error
185 nop
186 .globl bpf_jit_load_byte_msh_negative_offset
187 bpf_jit_load_byte_msh_negative_offset:
188 bpf_negative_common(1)
189 ldub [r_TMP], r_OFF
190 and r_OFF, 0xf, r_OFF
191 retl
192 sll r_OFF, 2, r_X
193
194 bpf_error:
195
196
197
198
199
200
201 jmpl r_saved_O7 + 8, %g0
202 clr %o0