1 #include <asm/ptrace.h>
3 #include "bpf_jit_32.h"
7 #define BE_PTR(label) be label
8 #define SIGN_EXTEND(reg)
10 #define SKF_MAX_NEG_OFF (-0x200000) /* SKF_LL_OFF from filter.h */
13 .globl bpf_jit_load_word
16 bl bpf_slow_path_word_neg
18 .globl bpf_jit_load_word_positive_offset
19 bpf_jit_load_word_positive_offset:
20 sub r_HEADLEN, r_OFF, r_TMP
22 ble bpf_slow_path_word
23 add r_SKB_DATA, r_OFF, r_TMP
25 bne load_word_unaligned
30 ldub [r_TMP + 0x0], r_OFF
31 ldub [r_TMP + 0x1], r_TMP2
33 or r_OFF, r_TMP2, r_OFF
34 ldub [r_TMP + 0x2], r_TMP2
36 or r_OFF, r_TMP2, r_OFF
37 ldub [r_TMP + 0x3], r_TMP2
42 .globl bpf_jit_load_half
45 bl bpf_slow_path_half_neg
47 .globl bpf_jit_load_half_positive_offset
48 bpf_jit_load_half_positive_offset:
49 sub r_HEADLEN, r_OFF, r_TMP
51 ble bpf_slow_path_half
52 add r_SKB_DATA, r_OFF, r_TMP
54 bne load_half_unaligned
59 ldub [r_TMP + 0x0], r_OFF
60 ldub [r_TMP + 0x1], r_TMP2
65 .globl bpf_jit_load_byte
68 bl bpf_slow_path_byte_neg
70 .globl bpf_jit_load_byte_positive_offset
71 bpf_jit_load_byte_positive_offset:
73 bge bpf_slow_path_byte
76 ldub [r_SKB_DATA + r_OFF], r_A
78 .globl bpf_jit_load_byte_msh
79 bpf_jit_load_byte_msh:
81 bl bpf_slow_path_byte_msh_neg
83 .globl bpf_jit_load_byte_msh_positive_offset
84 bpf_jit_load_byte_msh_positive_offset:
86 bge bpf_slow_path_byte_msh
88 ldub [r_SKB_DATA + r_OFF], r_OFF
93 #define bpf_slow_path_common(LEN) \
94 save %sp, -SAVE_SZ, %sp; \
97 add %fp, SCRATCH_OFF, %o2; \
104 bpf_slow_path_common(4)
106 ld [%sp + SCRATCH_OFF], r_A
110 bpf_slow_path_common(2)
112 lduh [%sp + SCRATCH_OFF], r_A
116 bpf_slow_path_common(1)
118 ldub [%sp + SCRATCH_OFF], r_A
121 bpf_slow_path_byte_msh:
122 bpf_slow_path_common(1)
124 ldub [%sp + SCRATCH_OFF], r_A
125 and r_OFF, 0xf, r_OFF
129 #define bpf_negative_common(LEN) \
130 save %sp, -SAVE_SZ, %sp; \
134 call bpf_internal_load_pointer_neg_helper; \
141 bpf_slow_path_word_neg:
142 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
146 .globl bpf_jit_load_word_negative_offset
147 bpf_jit_load_word_negative_offset:
148 bpf_negative_common(4)
150 bne load_word_unaligned
155 bpf_slow_path_half_neg:
156 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
160 .globl bpf_jit_load_half_negative_offset
161 bpf_jit_load_half_negative_offset:
162 bpf_negative_common(2)
164 bne load_half_unaligned
169 bpf_slow_path_byte_neg:
170 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
174 .globl bpf_jit_load_byte_negative_offset
175 bpf_jit_load_byte_negative_offset:
176 bpf_negative_common(1)
180 bpf_slow_path_byte_msh_neg:
181 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
185 .globl bpf_jit_load_byte_msh_negative_offset
186 bpf_jit_load_byte_msh_negative_offset:
187 bpf_negative_common(1)
189 and r_OFF, 0xf, r_OFF
194 /* Make the JIT program return zero. The JIT epilogue
195 * stores away the original %o7 into r_saved_O7. The
196 * normal leaf function return is to use "retl" which
197 * would evalute to "jmpl %o7 + 8, %g0" but we want to
198 * use the saved value thus the sequence you see here.
200 jmpl r_saved_O7 + 8, %g0