diff options
Diffstat (limited to 'arch/x86/net/bpf_jit_comp32.c')
| -rw-r--r-- | arch/x86/net/bpf_jit_comp32.c | 28 | 
1 files changed, 22 insertions, 6 deletions
| diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c index 4d2a7a764602..66cd150b7e54 100644 --- a/arch/x86/net/bpf_jit_comp32.c +++ b/arch/x86/net/bpf_jit_comp32.c @@ -1847,14 +1847,16 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,  			case BPF_B:  			case BPF_H:  			case BPF_W: -				if (!bpf_prog->aux->verifier_zext) +				if (bpf_prog->aux->verifier_zext)  					break;  				if (dstk) {  					EMIT3(0xC7, add_1reg(0x40, IA32_EBP),  					      STACK_VAR(dst_hi));  					EMIT(0x0, 4);  				} else { -					EMIT3(0xC7, add_1reg(0xC0, dst_hi), 0); +					/* xor dst_hi,dst_hi */ +					EMIT2(0x33, +					      add_2reg(0xC0, dst_hi, dst_hi));  				}  				break;  			case BPF_DW: @@ -2013,8 +2015,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,  		case BPF_JMP | BPF_JSET | BPF_X:  		case BPF_JMP32 | BPF_JSET | BPF_X: {  			bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP; -			u8 dreg_lo = dstk ? IA32_EAX : dst_lo; -			u8 dreg_hi = dstk ? IA32_EDX : dst_hi; +			u8 dreg_lo = IA32_EAX; +			u8 dreg_hi = IA32_EDX;  			u8 sreg_lo = sstk ? IA32_ECX : src_lo;  			u8 sreg_hi = sstk ? IA32_EBX : src_hi; @@ -2026,6 +2028,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,  					      add_2reg(0x40, IA32_EBP,  						       IA32_EDX),  					      STACK_VAR(dst_hi)); +			} else { +				/* mov dreg_lo,dst_lo */ +				EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo)); +				if (is_jmp64) +					/* mov dreg_hi,dst_hi */ +					EMIT2(0x89, +					      add_2reg(0xC0, dreg_hi, dst_hi));  			}  			if (sstk) { @@ -2050,8 +2059,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,  		case BPF_JMP | BPF_JSET | BPF_K:  		case BPF_JMP32 | BPF_JSET | BPF_K: {  			bool is_jmp64 = BPF_CLASS(insn->code) == BPF_JMP; -			u8 dreg_lo = dstk ? IA32_EAX : dst_lo; -			u8 dreg_hi = dstk ? IA32_EDX : dst_hi; +			u8 dreg_lo = IA32_EAX; +			u8 dreg_hi = IA32_EDX;  			u8 sreg_lo = IA32_ECX;  			u8 sreg_hi = IA32_EBX;  			u32 hi; @@ -2064,6 +2073,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,  					      add_2reg(0x40, IA32_EBP,  						       IA32_EDX),  					      STACK_VAR(dst_hi)); +			} else { +				/* mov dreg_lo,dst_lo */ +				EMIT2(0x89, add_2reg(0xC0, dreg_lo, dst_lo)); +				if (is_jmp64) +					/* mov dreg_hi,dst_hi */ +					EMIT2(0x89, +					      add_2reg(0xC0, dreg_hi, dst_hi));  			}  			/* mov ecx,imm32 */ |