diff options
| author | Daniel Borkmann <dxchgb@gmail.com> | 2012-09-24 07:34:51 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-09-24 16:54:35 -0400 | 
| commit | 82c93fcc2e1737fede2752520f1bf8f4de6304d8 (patch) | |
| tree | 857ae8ecf17d178f5e2225aded80a1779837467a /arch/x86/net/bpf_jit_comp.c | |
| parent | 9e49e88958feb41ec701fa34b44723dabadbc28c (diff) | |
| download | olio-linux-3.10-82c93fcc2e1737fede2752520f1bf8f4de6304d8.tar.xz olio-linux-3.10-82c93fcc2e1737fede2752520f1bf8f4de6304d8.zip  | |
x86: bpf_jit_comp: add XOR instruction for BPF JIT
This patch is a follow-up for patch "filter: add XOR instruction for use
with X/K" that implements BPF x86 JIT parts for the BPF XOR operation.
Signed-off-by: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/x86/net/bpf_jit_comp.c')
| -rw-r--r-- | arch/x86/net/bpf_jit_comp.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 106c5782912..520d2bd0b9c 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -335,9 +335,18 @@ void bpf_jit_compile(struct sk_filter *fp)  					EMIT1_off32(0x0d, K);	/* or imm32,%eax */  				break;  			case BPF_S_ANC_ALU_XOR_X: /* A ^= X; */ +			case BPF_S_ALU_XOR_X:  				seen |= SEEN_XREG;  				EMIT2(0x31, 0xd8);		/* xor %ebx,%eax */  				break; +			case BPF_S_ALU_XOR_K: /* A ^= K; */ +				if (K == 0) +					break; +				if (is_imm8(K)) +					EMIT3(0x83, 0xf0, K);	/* xor imm8,%eax */ +				else +					EMIT1_off32(0x35, K);	/* xor imm32,%eax */ +				break;  			case BPF_S_ALU_LSH_X: /* A <<= X; */  				seen |= SEEN_XREG;  				EMIT4(0x89, 0xd9, 0xd3, 0xe0);	/* mov %ebx,%ecx; shl %cl,%eax */  |