diff options
-rw-r--r-- | sys/amd64/amd64/bpf_jit_machdep.c | 6 | ||||
-rw-r--r-- | sys/amd64/amd64/bpf_jit_machdep.h | 42 | ||||
-rw-r--r-- | sys/i386/i386/bpf_jit_machdep.c | 6 | ||||
-rw-r--r-- | sys/i386/i386/bpf_jit_machdep.h | 6 |
4 files changed, 36 insertions, 24 deletions
diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c index 2f9dd21..bc38abe 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.c +++ b/sys/amd64/amd64/bpf_jit_machdep.c @@ -242,7 +242,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ZERO_EAX(); POP(RBX); LEAVE_RET(); - MOVid(EDX, 0); + ZERO_EDX(); MOVobb(DL, RBX, RCX); ANDib(DL, 0xf); SHLib(EDX, 2); @@ -378,7 +378,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) POP(RBX); LEAVE_RET(); MOVrd(ECX, EDX); - MOVid(EDX, 0); + ZERO_EDX(); DIVrd(ECX); MOVrd(EDX, ECX); break; @@ -418,7 +418,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_K: MOVrd(ECX, EDX); - MOVid(EDX, 0); + ZERO_EDX(); MOVid(ESI, ins->k); DIVrd(ESI); MOVrd(EDX, ECX); diff --git a/sys/amd64/amd64/bpf_jit_machdep.h b/sys/amd64/amd64/bpf_jit_machdep.h index 028d961..dab2477 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.h +++ b/sys/amd64/amd64/bpf_jit_machdep.h @@ -133,11 +133,11 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); (3 << 6) | ((dr64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) -/* mov dr32,sr32[off] */ -#define MOVodd(dr32, sr32, off) do { \ +/* mov dr32,sr64[off] */ +#define MOVodd(dr32, sr64, off) do { \ emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ emitm(&stream, \ - (1 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \ emitm(&stream, off, 1); \ } while (0) @@ -149,33 +149,33 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, off, 1); \ } while (0) -/* mov dr32,sr32[or32] */ -#define MOVobd(dr32, sr32, or32) do { \ +/* mov dr32,sr64[or64] */ +#define MOVobd(dr32, sr64, or64) do { \ emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ emitm(&stream, ((dr32 & 0x7) << 3) | 4, 1); \ - emitm(&stream, ((or32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + emitm(&stream, ((or64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) -/* mov dr16,sr32[or32] */ -#define MOVobw(dr32, sr32, or32) do { \ +/* mov dr16,sr64[or64] */ +#define MOVobw(dr32, sr64, or64) do { \ emitm(&stream, 0x66, 1); \ emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ emitm(&stream, ((dr32 & 0x7) << 3) | 4, 1); \ - emitm(&stream, ((or32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + emitm(&stream, ((or64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) -/* mov dr8,sr32[or32] */ -#define MOVobb(dr8, sr32, or32) do { \ +/* mov dr8,sr64[or64] */ +#define MOVobb(dr8, sr64, or64) do { \ emitm(&stream, 0x8a, 1); \ emitm(&stream, ((dr8 & 0x7) << 3) | 4, 1); \ - emitm(&stream, ((or32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + emitm(&stream, ((or64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) -/* mov [dr32][or32],sr32 */ -#define MOVomd(dr32, or32, sr32) do { \ +/* mov [dr64][or64],sr32 */ +#define MOVomd(dr64, or64, sr32) do { \ emitm(&stream, 0x89, 1); \ emitm(&stream, ((sr32 & 0x7) << 3) | 4, 1); \ - emitm(&stream, ((or32 & 0x7) << 3) | (dr32 & 0x7), 1); \ + emitm(&stream, ((or64 & 0x7) << 3) | (dr64 & 0x7), 1); \ } while (0) /* bswap dr32 */ @@ -335,11 +335,11 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, (27 << 3) | (r32 & 0x7), 1); \ } while (0) -/* cmp dr32,sr32[off] */ -#define CMPodd(dr32, sr32, off) do { \ +/* cmp dr32,sr64[off] */ +#define CMPodd(dr32, sr64, off) do { \ emitm(&stream, (3 << 4) | 3 | (1 << 3), 1); \ emitm(&stream, \ - (1 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \ emitm(&stream, off, 1); \ } while (0) @@ -428,4 +428,10 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, 0xc0, 1); \ } while (0) +/* xor edx,edx */ +#define ZERO_EDX() do { \ + emitm(&stream, 0x31, 1); \ + emitm(&stream, 0xc9, 1); \ +} while (0) + #endif /* _BPF_JIT_MACHDEP_H_ */ diff --git a/sys/i386/i386/bpf_jit_machdep.c b/sys/i386/i386/bpf_jit_machdep.c index 0de6196..ea101aa 100644 --- a/sys/i386/i386/bpf_jit_machdep.c +++ b/sys/i386/i386/bpf_jit_machdep.c @@ -260,7 +260,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) POP(ESI); POP(EDI); LEAVE_RET(); - MOVid(EDX, 0); + ZERO_EDX(); MOVobb(DL, EBX, ECX); ANDib(DL, 0xf); SHLib(EDX, 2); @@ -398,7 +398,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) POP(EDI); LEAVE_RET(); MOVrd(ECX, EDX); - MOVid(EDX, 0); + ZERO_EDX(); DIVrd(ECX); MOVrd(EDX, ECX); break; @@ -438,7 +438,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_K: MOVrd(ECX, EDX); - MOVid(EDX, 0); + ZERO_EDX(); MOVid(ESI, ins->k); DIVrd(ESI); MOVrd(EDX, ECX); diff --git a/sys/i386/i386/bpf_jit_machdep.h b/sys/i386/i386/bpf_jit_machdep.h index 5f51938..42d34d4 100644 --- a/sys/i386/i386/bpf_jit_machdep.h +++ b/sys/i386/i386/bpf_jit_machdep.h @@ -395,4 +395,10 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, 0xc0, 1); \ } while (0) +/* xor edx,edx */ +#define ZERO_EDX() do { \ + emitm(&stream, 0x31, 1); \ + emitm(&stream, 0xc9, 1); \ +} while (0) + #endif /* _BPF_JIT_MACHDEP_H_ */ |