jitter.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy)
00003  * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California)
00004  * All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  *
00010  * 1. Redistributions of source code must retain the above copyright
00011  * notice, this list of conditions and the following disclaimer.
00012  * 2. Redistributions in binary form must reproduce the above copyright
00013  * notice, this list of conditions and the following disclaimer in the
00014  * documentation and/or other materials provided with the distribution.
00015  * 3. Neither the name of the Politecnico di Torino, CACE Technologies 
00016  * nor the names of its contributors may be used to endorse or promote 
00017  * products derived from this software without specific prior written 
00018  * permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00023  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00024  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00025  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00026  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00027  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00028  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00029  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00030  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  *
00032  */
00033 
00038 //
00039 // Registers
00040 //
00041 #define EAX 0
00042 #define ECX 1
00043 #define EDX 2
00044 #define EBX 3
00045 #define ESP 4
00046 #define EBP 5
00047 #define ESI 6
00048 #define EDI 7
00049 
00050 #define AX 0
00051 #define CX 1
00052 #define DX 2
00053 #define BX 3
00054 #define SP 4
00055 #define BP 5
00056 #define SI 6
00057 #define DI 7
00058 
00059 #define AL 0
00060 #define CL 1
00061 #define DL 2
00062 #define BL 3
00063 
00065 typedef struct binary_stream{
00066     INT cur_ip;     
00067     INT bpf_pc;     
00068     PCHAR ibuf;     
00069     PUINT refs;     
00070 }binary_stream;
00071 
00072 
00078 typedef UINT (__cdecl *BPF_filter_function)( PVOID *, ULONG, UINT);
00079 
00088 typedef void (*emit_func)(binary_stream *stream, ULONG value, UINT n);
00089 
00091 typedef struct JIT_BPF_Filter{
00092     BPF_filter_function Function;   
00093     PINT mem;
00094 }
00095 JIT_BPF_Filter;
00096 
00097 
00098 
00099 
00100 /**************************/
00101 /* X86 INSTRUCTION MACROS */
00102 /**************************/
00103 
00105 #define MOVid(r32, i32) \
00106   emitm(&stream, 11 << 4 | 1 << 3 | r32 & 0x7, 1); emitm(&stream, i32, 4);
00107 
00109 #define MOVrd(dr32, sr32) \
00110   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
00111 
00113 #define MOVodd(dr32, sr32, off) \
00114   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
00115   emitm(&stream,  1 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);\
00116   emitm(&stream,  off, 1);
00117 
00119 #define MOVobd(dr32, sr32, or32) \
00120   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
00121   emitm(&stream,  (dr32 & 0x7) << 3 | 4 , 1);\
00122   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
00123 
00125 #define MOVobw(dr32, sr32, or32) \
00126   emitm(&stream, 0x66, 1); \
00127   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
00128   emitm(&stream,  (dr32 & 0x7) << 3 | 4 , 1);\
00129   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
00130 
00132 #define MOVobb(dr8, sr32, or32) \
00133   emitm(&stream, 0x8a, 1); \
00134   emitm(&stream,  (dr8 & 0x7) << 3 | 4 , 1);\
00135   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
00136 
00138 #define MOVomd(dr32, or32, sr32) \
00139   emitm(&stream, 0x89, 1); \
00140   emitm(&stream,  (sr32 & 0x7) << 3 | 4 , 1);\
00141   emitm(&stream,  (or32 & 0x7) << 3 | (dr32 & 0x7) , 1);
00142 
00144 #define BSWAP(dr32) \
00145   emitm(&stream, 0xf, 1); \
00146   emitm(&stream,  0x19 << 3 | dr32 , 1);
00147 
00149 #define SWAP_AX() \
00150   emitm(&stream, 0x86, 1); \
00151   emitm(&stream,  0xc4 , 1);
00152 
00154 #define PUSH(r32) \
00155   emitm(&stream, 5 << 4 | 0 << 3 | r32 & 0x7, 1);
00156 
00158 #define POP(r32) \
00159   emitm(&stream, 5 << 4 | 1 << 3 | r32 & 0x7, 1);
00160 
00162 #define RET() \
00163   emitm(&stream, 12 << 4 | 0 << 3 | 3, 1);
00164 
00166 #define ADDrd(dr32, sr32) \
00167   emitm(&stream, 0x03, 1);\
00168   emitm(&stream, 3 << 6 | (dr32 & 0x7) << 3 | (sr32 & 0x7), 1);
00169 
00171 #define ADD_EAXi(i32) \
00172   emitm(&stream, 0x05, 1);\
00173   emitm(&stream, i32, 4);
00174 
00176 #define ADDid(r32, i32) \
00177   emitm(&stream, 0x81, 1);\
00178   emitm(&stream, 24 << 3 | r32, 1);\
00179   emitm(&stream, i32, 4);
00180 
00182 #define ADDib(r32, i8) \
00183   emitm(&stream, 0x83, 1);\
00184   emitm(&stream, 24 << 3 | r32, 1);\
00185   emitm(&stream, i8, 1);
00186 
00188 #define SUBrd(dr32, sr32) \
00189   emitm(&stream, 0x2b, 1);\
00190   emitm(&stream, 3 << 6 | (dr32 & 0x7) << 3 | (sr32 & 0x7), 1);
00191 
00193 #define SUB_EAXi(i32) \
00194   emitm(&stream, 0x2d, 1);\
00195   emitm(&stream, i32, 4);
00196 
00198 #define MULrd(r32) \
00199   emitm(&stream, 0xf7, 1);\
00200   emitm(&stream, 7 << 5 | (r32 & 0x7), 1);
00201 
00203 #define DIVrd(r32) \
00204   emitm(&stream, 0xf7, 1);\
00205   emitm(&stream, 15 << 4 | (r32 & 0x7), 1);
00206 
00208 #define ANDib(r8, i8) \
00209   emitm(&stream, 0x80, 1);\
00210   emitm(&stream, 7 << 5 | r8, 1);\
00211   emitm(&stream, i8, 1);
00212 
00214 #define ANDid(r32, i32) \
00215   if (r32 == EAX){ \
00216   emitm(&stream, 0x25, 1);\
00217   emitm(&stream, i32, 4);}\
00218   else{ \
00219   emitm(&stream, 0x81, 1);\
00220   emitm(&stream, 7 << 5 | r32, 1);\
00221   emitm(&stream, i32, 4);}
00222 
00224 #define ANDrd(dr32, sr32) \
00225   emitm(&stream, 0x23, 1);\
00226   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
00227 
00229 #define ORrd(dr32, sr32) \
00230   emitm(&stream, 0x0b, 1);\
00231   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
00232 
00234 #define ORid(r32, i32) \
00235   if (r32 == EAX){ \
00236   emitm(&stream, 0x0d, 1);\
00237   emitm(&stream, i32, 4);}\
00238   else{ \
00239   emitm(&stream, 0x81, 1);\
00240   emitm(&stream, 25 << 3 | r32, 1);\
00241   emitm(&stream, i32, 4);}
00242 
00244 #define SHLib(r32, i8) \
00245   emitm(&stream, 0xc1, 1);\
00246   emitm(&stream, 7 << 5 | r32 & 0x7, 1);\
00247   emitm(&stream, i8, 1);
00248 
00250 #define SHL_CLrb(dr32) \
00251   emitm(&stream, 0xd3, 1);\
00252   emitm(&stream,  7 << 5 | dr32 & 0x7, 1);
00253 
00255 #define SHRib(r32, i8) \
00256   emitm(&stream, 0xc1, 1);\
00257   emitm(&stream, 29 << 3 | r32 & 0x7, 1);\
00258   emitm(&stream, i8, 1);
00259 
00261 #define SHR_CLrb(dr32) \
00262   emitm(&stream, 0xd3, 1);\
00263   emitm(&stream,  29 << 3 | dr32 & 0x7, 1);
00264 
00266 #define NEGd(r32) \
00267   emitm(&stream, 0xf7, 1);\
00268   emitm(&stream,  27 << 3 | r32 & 0x7, 1);
00269 
00271 #define CMPodd(dr32, sr32, off) \
00272   emitm(&stream, 3 << 4 | 3 | 1 << 3, 1); \
00273   emitm(&stream,  1 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);\
00274   emitm(&stream,  off, 1);
00275 
00277 #define CMPrd(dr32, sr32) \
00278   emitm(&stream, 0x3b, 1); \
00279   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
00280 
00282 #define CMPid(dr32, i32) \
00283   if (dr32 == EAX){ \
00284   emitm(&stream, 0x3d, 1); \
00285   emitm(&stream,  i32, 4);} \
00286   else{ \
00287   emitm(&stream, 0x81, 1); \
00288   emitm(&stream,  0x1f << 3 | (dr32 & 0x7), 1);\
00289   emitm(&stream,  i32, 4);}
00290 
00292 #define JNEb(off8) \
00293    emitm(&stream, 0x75, 1);\
00294    emitm(&stream, off8, 1);
00295 
00297 #define JE(off32) \
00298    emitm(&stream, 0x0f, 1);\
00299    emitm(&stream, 0x84, 1);\
00300    emitm(&stream, off32, 4);
00301 
00303 #define JLE(off32) \
00304    emitm(&stream, 0x0f, 1);\
00305    emitm(&stream, 0x8e, 1);\
00306    emitm(&stream, off32, 4);
00307 
00309 #define JLEb(off8) \
00310    emitm(&stream, 0x7e, 1);\
00311    emitm(&stream, off8, 1);
00312 
00314 #define JA(off32) \
00315    emitm(&stream, 0x0f, 1);\
00316    emitm(&stream, 0x87, 1);\
00317    emitm(&stream, off32, 4);
00318    
00320 #define JAE(off32) \
00321    emitm(&stream, 0x0f, 1);\
00322    emitm(&stream, 0x83, 1);\
00323    emitm(&stream, off32, 4);
00324 
00326 #define JG(off32) \
00327    emitm(&stream, 0x0f, 1);\
00328    emitm(&stream, 0x8f, 1);\
00329    emitm(&stream, off32, 4);
00330 
00332 #define JGE(off32) \
00333    emitm(&stream, 0x0f, 1);\
00334    emitm(&stream, 0x8d, 1);\
00335    emitm(&stream, off32, 4);
00336 
00338 #define JMP(off32) \
00339    emitm(&stream, 0xe9, 1);\
00340    emitm(&stream, off32, 4);
00341 
00346 /**************************/
00347 /* Prototypes             */
00348 /**************************/
00349 
00363 JIT_BPF_Filter* BPF_jitter(struct bpf_insn *fp, INT nins);
00364 
00376 BPF_filter_function BPFtoX86(struct bpf_insn *ins, UINT nins, INT *mem);
00383 void BPF_Destroy_JIT_Filter(JIT_BPF_Filter *Filter);
00384 

documentation. Copyright (c) 2002-2005 Politecnico di Torino. Copyright (c) 2005-2007 CACE Technologies. All rights reserved.