1 #include <asm/ptrace.h>
3 #include "bpf_jit_64.h"
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
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
40 or r_OFF, r_TMP2, r_RESULT
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
57 lduh [r_TMP], r_RESULT
59 ldub [r_TMP + 0x0], r_OFF
60 ldub [r_TMP + 0x1], r_TMP2
63 or r_OFF, r_TMP2, r_RESULT
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_RESULT
78 #define bpf_slow_path_common(LEN) \
79 save %sp, -SAVE_SZ, %sp; \
82 add %fp, SCRATCH_OFF, %o2; \
89 bpf_slow_path_common(4)
91 ld [%sp + SCRATCH_OFF], r_RESULT
95 bpf_slow_path_common(2)
97 lduh [%sp + SCRATCH_OFF], r_RESULT
101 bpf_slow_path_common(1)
103 ldub [%sp + SCRATCH_OFF], r_RESULT
107 #define bpf_negative_common(LEN) \
108 save %sp, -SAVE_SZ, %sp; \
112 call bpf_internal_load_pointer_neg_helper; \
119 bpf_slow_path_word_neg:
120 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
124 .globl bpf_jit_load_word_negative_offset
125 bpf_jit_load_word_negative_offset:
126 bpf_negative_common(4)
128 bne load_word_unaligned
133 bpf_slow_path_half_neg:
134 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
138 .globl bpf_jit_load_half_negative_offset
139 bpf_jit_load_half_negative_offset:
140 bpf_negative_common(2)
142 bne load_half_unaligned
145 lduh [r_TMP], r_RESULT
147 bpf_slow_path_byte_neg:
148 sethi %hi(SKF_MAX_NEG_OFF), r_TMP
152 .globl bpf_jit_load_byte_negative_offset
153 bpf_jit_load_byte_negative_offset:
154 bpf_negative_common(1)
156 ldub [r_TMP], r_RESULT
159 /* Make the JIT program itself return zero. */
161 restore %g0, %g0, %o0