aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2008-08-18 21:17:47 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2008-08-18 21:17:47 +0000
commit520ba9d94a8f4fae966606aae86087458c74f3d4 (patch)
tree842ae0886f3617b9452b0240a94c38c598f82c88
parent69e08c86a568f617573858e2505777601c66e48e (diff)
downloadsrc-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.c90
-rw-r--r--sys/i386/i386/bpf_jit_machdep.h18
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)