diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2008-08-18 21:17:47 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2008-08-18 21:17:47 +0000 |
commit | 520ba9d94a8f4fae966606aae86087458c74f3d4 (patch) | |
tree | 842ae0886f3617b9452b0240a94c38c598f82c88 | |
parent | 69e08c86a568f617573858e2505777601c66e48e (diff) | |
download | src-520ba9d94a8f4fae966606aae86087458c74f3d4.tar.gz src-520ba9d94a8f4fae966606aae86087458c74f3d4.zip |
MFamd64: Correctly check unsignedness of all registers used
for load instructions with direct or indirect offsets.
Notes
Notes:
svn path=/head/; revision=181853
-rw-r--r-- | sys/i386/i386/bpf_jit_machdep.c | 90 | ||||
-rw-r--r-- | sys/i386/i386/bpf_jit_machdep.h | 18 |
2 files changed, 70 insertions, 38 deletions
diff --git a/sys/i386/i386/bpf_jit_machdep.c b/sys/i386/i386/bpf_jit_machdep.c index a2597f034995..78b585256120 100644 --- a/sys/i386/i386/bpf_jit_machdep.c +++ b/sys/i386/i386/bpf_jit_machdep.c @@ -174,11 +174,13 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_W|BPF_ABS: - MOVid(ins->k, ECX); - MOVrd(ECX, ESI); - ADDib(sizeof(int32_t), ECX); - CMPrd(EDI, ECX); - JBEb(7); + MOVid(ins->k, ESI); + CMPrd(EDI, ESI); + JAb(12); + MOVrd(EDI, ECX); + SUBrd(ESI, ECX); + CMPid(sizeof(int32_t), ECX); + JAEb(7); ZEROrd(EAX); POP(EBX); POP(ESI); @@ -190,11 +192,13 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_LD|BPF_H|BPF_ABS: ZEROrd(EAX); - MOVid(ins->k, ECX); - MOVrd(ECX, ESI); - ADDib(sizeof(int16_t), ECX); - CMPrd(EDI, ECX); - JBEb(5); + MOVid(ins->k, ESI); + CMPrd(EDI, ESI); + JAb(12); + MOVrd(EDI, ECX); + SUBrd(ESI, ECX); + CMPid(sizeof(int16_t), ECX); + JAEb(5); POP(EBX); POP(ESI); POP(EDI); @@ -205,14 +209,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_LD|BPF_B|BPF_ABS: ZEROrd(EAX); - MOVid(ins->k, ECX); - CMPrd(EDI, ECX); - JBEb(5); + MOVid(ins->k, ESI); + CMPrd(EDI, ESI); + JBb(5); POP(EBX); POP(ESI); POP(EDI); LEAVE_RET(); - MOVobb(EBX, ECX, AL); + MOVobb(EBX, ESI, AL); break; case BPF_LD|BPF_W|BPF_LEN: @@ -224,12 +228,18 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_W|BPF_IND: - MOVid(ins->k, ECX); - ADDrd(EDX, ECX); - MOVrd(ECX, ESI); - ADDib(sizeof(int32_t), ECX); - CMPrd(EDI, ECX); - JBEb(7); + CMPrd(EDI, EDX); + JAb(27); + MOVid(ins->k, ESI); + MOVrd(EDI, ECX); + SUBrd(EDX, ECX); + CMPrd(ESI, ECX); + JBb(14); + ADDrd(EDX, ESI); + MOVrd(EDI, ECX); + SUBrd(ESI, ECX); + CMPid(sizeof(int32_t), ECX); + JAEb(7); ZEROrd(EAX); POP(EBX); POP(ESI); @@ -241,12 +251,18 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_LD|BPF_H|BPF_IND: ZEROrd(EAX); - MOVid(ins->k, ECX); - ADDrd(EDX, ECX); - MOVrd(ECX, ESI); - ADDib(sizeof(int16_t), ECX); - CMPrd(EDI, ECX); - JBEb(5); + CMPrd(EDI, EDX); + JAb(27); + MOVid(ins->k, ESI); + MOVrd(EDI, ECX); + SUBrd(EDX, ECX); + CMPrd(ESI, ECX); + JBb(14); + ADDrd(EDX, ESI); + MOVrd(EDI, ECX); + SUBrd(ESI, ECX); + CMPid(sizeof(int16_t), ECX); + JAEb(5); POP(EBX); POP(ESI); POP(EDI); @@ -257,28 +273,32 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_LD|BPF_B|BPF_IND: ZEROrd(EAX); - MOVid(ins->k, ECX); - ADDrd(EDX, ECX); - CMPrd(EDI, ECX); - JBEb(5); + CMPrd(EDI, EDX); + JAEb(13); + MOVid(ins->k, ESI); + MOVrd(EDI, ECX); + SUBrd(EDX, ECX); + CMPrd(ESI, ECX); + JAb(5); POP(EBX); POP(ESI); POP(EDI); LEAVE_RET(); - MOVobb(EBX, ECX, AL); + ADDrd(EDX, ESI); + MOVobb(EBX, ESI, AL); break; case BPF_LDX|BPF_MSH|BPF_B: - MOVid(ins->k, ECX); - CMPrd(EDI, ECX); - JBEb(7); + MOVid(ins->k, ESI); + CMPrd(EDI, ESI); + JBb(7); ZEROrd(EAX); POP(EBX); POP(ESI); POP(EDI); LEAVE_RET(); ZEROrd(EDX); - MOVobb(EBX, ECX, DL); + MOVobb(EBX, ESI, DL); ANDib(0x0f, DL); SHLib(2, EDX); break; diff --git a/sys/i386/i386/bpf_jit_machdep.h b/sys/i386/i386/bpf_jit_machdep.h index c3c06cfd806b..6a0d785b17ab 100644 --- a/sys/i386/i386/bpf_jit_machdep.h +++ b/sys/i386/i386/bpf_jit_machdep.h @@ -331,15 +331,27 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); } \ } while (0) +/* jb off8 */ +#define JBb(off8) do { \ + emitm(&stream, 0x72, 1); \ + emitm(&stream, off8, 1); \ +} while (0) + +/* jae off8 */ +#define JAEb(off8) do { \ + emitm(&stream, 0x73, 1); \ + emitm(&stream, off8, 1); \ +} while (0) + /* jne off8 */ #define JNEb(off8) do { \ emitm(&stream, 0x75, 1); \ emitm(&stream, off8, 1); \ } while (0) -/* jbe off8 */ -#define JBEb(off8) do { \ - emitm(&stream, 0x76, 1); \ +/* ja off8 */ +#define JAb(off8) do { \ + emitm(&stream, 0x77, 1); \ emitm(&stream, off8, 1); \ } while (0) |