|
@@ -475,8 +475,10 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|
|
case BPF_S_LD_W_ABS:
|
|
|
func = sk_load_word;
|
|
|
common_load: seen |= SEEN_DATAREF;
|
|
|
- if ((int)K < 0)
|
|
|
+ if ((int)K < 0) {
|
|
|
+ /* Abort the JIT because __load_pointer() is needed. */
|
|
|
goto out;
|
|
|
+ }
|
|
|
t_offset = func - (image + addrs[i]);
|
|
|
EMIT1_off32(0xbe, K); /* mov imm32,%esi */
|
|
|
EMIT1_off32(0xe8, t_offset); /* call */
|
|
@@ -489,14 +491,8 @@ common_load: seen |= SEEN_DATAREF;
|
|
|
goto common_load;
|
|
|
case BPF_S_LDX_B_MSH:
|
|
|
if ((int)K < 0) {
|
|
|
- if (pc_ret0 > 0) {
|
|
|
- /* addrs[pc_ret0 - 1] is the start address */
|
|
|
- EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]);
|
|
|
- break;
|
|
|
- }
|
|
|
- CLEAR_A();
|
|
|
- EMIT_JMP(cleanup_addr - addrs[i]);
|
|
|
- break;
|
|
|
+ /* Abort the JIT because __load_pointer() is needed. */
|
|
|
+ goto out;
|
|
|
}
|
|
|
seen |= SEEN_DATAREF | SEEN_XREG;
|
|
|
t_offset = sk_load_byte_msh - (image + addrs[i]);
|