Blame view
arch/x86/net/bpf_jit.S
2.74 KB
0a14842f5 net: filter: Just... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
/* bpf_jit.S : BPF JIT helper functions * * Copyright (C) 2011 Eric Dumazet (eric.dumazet@gmail.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; version 2 * of the License. */ #include <linux/linkage.h> #include <asm/dwarf2.h> /* * Calling convention : * rdi : skb pointer * esi : offset of byte(s) to fetch in skb (can be scratched) * r8 : copy of skb->data * r9d : hlen = skb->len - skb->data_len */ #define SKBDATA %r8 sk_load_word_ind: .globl sk_load_word_ind add %ebx,%esi /* offset += X */ # test %esi,%esi /* if (offset < 0) goto bpf_error; */ js bpf_error sk_load_word: .globl sk_load_word mov %r9d,%eax # hlen sub %esi,%eax # hlen - offset cmp $3,%eax jle bpf_slow_path_word mov (SKBDATA,%rsi),%eax bswap %eax /* ntohl() */ ret sk_load_half_ind: .globl sk_load_half_ind add %ebx,%esi /* offset += X */ js bpf_error sk_load_half: .globl sk_load_half mov %r9d,%eax sub %esi,%eax # hlen - offset cmp $1,%eax jle bpf_slow_path_half movzwl (SKBDATA,%rsi),%eax rol $8,%ax # ntohs() ret sk_load_byte_ind: .globl sk_load_byte_ind add %ebx,%esi /* offset += X */ js bpf_error sk_load_byte: .globl sk_load_byte cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ jle bpf_slow_path_byte movzbl (SKBDATA,%rsi),%eax ret /** * sk_load_byte_msh - BPF_S_LDX_B_MSH helper * * Implements BPF_S_LDX_B_MSH : ldxb 4*([offset]&0xf) * Must preserve A accumulator (%eax) * Inputs : %esi is the offset value, already known positive */ ENTRY(sk_load_byte_msh) CFI_STARTPROC cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte_msh */ jle bpf_slow_path_byte_msh movzbl (SKBDATA,%rsi),%ebx and $15,%bl shl $2,%bl ret CFI_ENDPROC ENDPROC(sk_load_byte_msh) bpf_error: # force a return 0 from jit handler xor %eax,%eax mov -8(%rbp),%rbx leaveq ret /* rsi contains offset and can be scratched */ #define bpf_slow_path_common(LEN) \ push %rdi; /* save skb */ \ push %r9; \ push SKBDATA; \ /* rsi already has offset */ \ mov $LEN,%ecx; /* len */ \ lea -12(%rbp),%rdx; \ call skb_copy_bits; \ test %eax,%eax; \ pop SKBDATA; \ pop %r9; \ pop %rdi bpf_slow_path_word: bpf_slow_path_common(4) js bpf_error mov -12(%rbp),%eax bswap %eax ret bpf_slow_path_half: bpf_slow_path_common(2) js bpf_error mov -12(%rbp),%ax rol $8,%ax movzwl %ax,%eax ret bpf_slow_path_byte: bpf_slow_path_common(1) js bpf_error movzbl -12(%rbp),%eax ret bpf_slow_path_byte_msh: xchg %eax,%ebx /* dont lose A , X is about to be scratched */ bpf_slow_path_common(1) js bpf_error movzbl -12(%rbp),%eax and $15,%al shl $2,%al xchg %eax,%ebx ret |