Main Page Modules Data Structures File List Data Fields Globals Related Pages

# jitter.h

Go to the documentation of this file.

    00001 /*
    00002  * Copyright (c) 2002
    00003  *  Politecnico di Torino.  All rights reserved.
    00004  *
    00005  * Redistribution and use in source and binary forms, with or without
    00006  * modification, are permitted provided that: (1) source code distributions
    00007  * retain the above copyright notice and this paragraph in its entirety, (2)
    00008  * distributions including binary code include the above copyright notice and
    00009  * this paragraph in its entirety in the documentation or other materials
    00010  * provided with the distribution, and (3) all advertising materials mentioning
    00011  * features or use of this software display the following acknowledgement:
    00012  * ``This product includes software developed by the Politecnico
    00013  * di Torino, and its contributors.'' Neither the name of
    00014  * the University nor the names of its contributors may be used to endorse
    00015  * or promote products derived from this software without specific prior
    00016  * written permission.
    00017  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
    00018  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
    00019  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    00020  */
    00021
    00030 //
    00031 // Registers
    00032 //
    00033 #define EAX 0
    00034 #define ECX 1
    00035 #define EDX 2
    00036 #define EBX 3
    00037 #define ESP 4
    00038 #define EBP 5
    00039 #define ESI 6
    00040 #define EDI 7
    00041
    00042 #define AX 0
    00043 #define CX 1
    00044 #define DX 2
    00045 #define BX 3
    00046 #define SP 4
    00047 #define BP 5
    00048 #define SI 6
    00049 #define DI 7
    00050
    00051 #define AL 0
    00052 #define CL 1
    00053 #define DL 2
    00054 #define BL 3
    00055
    00057 typedef struct binary_stream{
    00058     INT cur_ip;
    00059     INT bpf_pc;
    00060     PCHAR ibuf;
    00061     PUINT refs;
    00062 }binary_stream;
    00063
    00064
    00070 typedef UINT (*BPF_filter_function)( binary_stream *, ULONG, UINT);
    00071
    00080 typedef void (*emit_func)(binary_stream *stream, ULONG value, UINT n);
    00081
    00083 typedef struct JIT_BPF_Filter{
    00084     BPF_filter_function Function;
    00085     PINT mem;
    00086 }
    00087 JIT_BPF_Filter;
    00088
    00089
    00090
    00091
    00092 /**************************/
    00093 /* X86 INSTRUCTION MACROS */
    00094 /**************************/
    00095
    00097 #define MOVid(r32, i32) \
    00098   emitm(&stream, 11 << 4 | 1 << 3 | r32 & 0x7, 1); emitm(&stream, i32, 4);
    00099
    00101 #define MOVrd(dr32, sr32) \
    00102   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
    00103
    00105 #define MOVodd(dr32, sr32, off) \
    00106   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
    00107   emitm(&stream,  1 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);\
    00108   emitm(&stream,  off, 1);
    00109
    00111 #define MOVobd(dr32, sr32, or32) \
    00112   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
    00113   emitm(&stream,  (dr32 & 0x7) << 3 | 4 , 1);\
    00114   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
    00115
    00117 #define MOVobw(dr32, sr32, or32) \
    00118   emitm(&stream, 0x66, 1); \
    00119   emitm(&stream, 8 << 4 | 3 | 1 << 3, 1); \
    00120   emitm(&stream,  (dr32 & 0x7) << 3 | 4 , 1);\
    00121   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
    00122
    00124 #define MOVobb(dr8, sr32, or32) \
    00125   emitm(&stream, 0x8a, 1); \
    00126   emitm(&stream,  (dr8 & 0x7) << 3 | 4 , 1);\
    00127   emitm(&stream,  (or32 & 0x7) << 3 | (sr32 & 0x7) , 1);
    00128
    00130 #define MOVomd(dr32, or32, sr32) \
    00131   emitm(&stream, 0x89, 1); \
    00132   emitm(&stream,  (sr32 & 0x7) << 3 | 4 , 1);\
    00133   emitm(&stream,  (or32 & 0x7) << 3 | (dr32 & 0x7) , 1);
    00134
    00136 #define BSWAP(dr32) \
    00137   emitm(&stream, 0xf, 1); \
    00138   emitm(&stream,  0x19 << 3 | dr32 , 1);
    00139
    00141 #define SWAP_AX() \
    00142   emitm(&stream, 0x86, 1); \
    00143   emitm(&stream,  0xc4 , 1);
    00144
    00146 #define PUSH(r32) \
    00147   emitm(&stream, 5 << 4 | 0 << 3 | r32 & 0x7, 1);
    00148
    00150 #define POP(r32) \
    00151   emitm(&stream, 5 << 4 | 1 << 3 | r32 & 0x7, 1);
    00152
    00154 #define RET() \
    00155   emitm(&stream, 12 << 4 | 0 << 3 | 3, 1);
    00156
    00158 #define ADDrd(dr32, sr32) \
    00159   emitm(&stream, 0x03, 1);\
    00160   emitm(&stream, 3 << 6 | (dr32 & 0x7) << 3 | (sr32 & 0x7), 1);
    00161
    00163 #define ADD_EAXi(i32) \
    00164   emitm(&stream, 0x05, 1);\
    00165   emitm(&stream, i32, 4);
    00166
    00168 #define ADDid(r32, i32) \
    00169   emitm(&stream, 0x81, 1);\
    00170   emitm(&stream, 24 << 3 | r32, 1);\
    00171   emitm(&stream, i32, 4);
    00172
    00174 #define ADDib(r32, i8) \
    00175   emitm(&stream, 0x83, 1);\
    00176   emitm(&stream, 24 << 3 | r32, 1);\
    00177   emitm(&stream, i8, 1);
    00178
    00180 #define SUBrd(dr32, sr32) \
    00181   emitm(&stream, 0x2b, 1);\
    00182   emitm(&stream, 3 << 6 | (dr32 & 0x7) << 3 | (sr32 & 0x7), 1);
    00183
    00185 #define SUB_EAXi(i32) \
    00186   emitm(&stream, 0x2d, 1);\
    00187   emitm(&stream, i32, 4);
    00188
    00190 #define MULrd(r32) \
    00191   emitm(&stream, 0xf7, 1);\
    00192   emitm(&stream, 7 << 5 | (r32 & 0x7), 1);
    00193
    00195 #define DIVrd(r32) \
    00196   emitm(&stream, 0xf7, 1);\
    00197   emitm(&stream, 15 << 4 | (r32 & 0x7), 1);
    00198
    00200 #define ANDib(r8, i8) \
    00201   emitm(&stream, 0x80, 1);\
    00202   emitm(&stream, 7 << 5 | r8, 1);\
    00203   emitm(&stream, i8, 1);
    00204
    00206 #define ANDid(r32, i32) \
    00207   if (r32 == EAX){ \
    00208   emitm(&stream, 0x25, 1);\
    00209   emitm(&stream, i32, 4);}\
    00210   else{ \
    00211   emitm(&stream, 0x81, 1);\
    00212   emitm(&stream, 7 << 5 | r32, 1);\
    00213   emitm(&stream, i32, 4);}
    00214
    00216 #define ANDrd(dr32, sr32) \
    00217   emitm(&stream, 0x23, 1);\
    00218   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
    00219
    00221 #define ORrd(dr32, sr32) \
    00222   emitm(&stream, 0x0b, 1);\
    00223   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
    00224
    00226 #define ORid(r32, i32) \
    00227   if (r32 == EAX){ \
    00228   emitm(&stream, 0x0d, 1);\
    00229   emitm(&stream, i32, 4);}\
    00230   else{ \
    00231   emitm(&stream, 0x81, 1);\
    00232   emitm(&stream, 25 << 3 | r32, 1);\
    00233   emitm(&stream, i32, 4);}
    00234
    00236 #define SHLib(r32, i8) \
    00237   emitm(&stream, 0xc1, 1);\
    00238   emitm(&stream, 7 << 5 | r32 & 0x7, 1);\
    00239   emitm(&stream, i8, 1);
    00240
    00242 #define SHL_CLrb(dr32) \
    00243   emitm(&stream, 0xd3, 1);\
    00244   emitm(&stream,  7 << 5 | dr32 & 0x7, 1);
    00245
    00247 #define SHRib(r32, i8) \
    00248   emitm(&stream, 0xc1, 1);\
    00249   emitm(&stream, 29 << 3 | r32 & 0x7, 1);\
    00250   emitm(&stream, i8, 1);
    00251
    00253 #define SHR_CLrb(dr32) \
    00254   emitm(&stream, 0xd3, 1);\
    00255   emitm(&stream,  29 << 3 | dr32 & 0x7, 1);
    00256
    00258 #define NEGd(r32) \
    00259   emitm(&stream, 0xf7, 1);\
    00260   emitm(&stream,  27 << 3 | r32 & 0x7, 1);
    00261
    00263 #define CMPodd(dr32, sr32, off) \
    00264   emitm(&stream, 3 << 4 | 3 | 1 << 3, 1); \
    00265   emitm(&stream,  1 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);\
    00266   emitm(&stream,  off, 1);
    00267
    00269 #define CMPrd(dr32, sr32) \
    00270   emitm(&stream, 0x3b, 1); \
    00271   emitm(&stream,  3 << 6 | (dr32 & 0x7) << 3 | sr32 & 0x7, 1);
    00272
    00274 #define CMPid(dr32, i32) \
    00275   if (dr32 == EAX){ \
    00276   emitm(&stream, 0x3d, 1); \
    00277   emitm(&stream,  i32, 4);} \
    00278   else{ \
    00279   emitm(&stream, 0x81, 1); \
    00280   emitm(&stream,  0x1f << 3 | (dr32 & 0x7), 1);\
    00281   emitm(&stream,  i32, 4);}
    00282
    00284 #define JNEb(off8) \
    00285    emitm(&stream, 0x75, 1);\
    00286    emitm(&stream, off8, 1);
    00287
    00289 #define JE(off32) \
    00290    emitm(&stream, 0x0f, 1);\
    00291    emitm(&stream, 0x84, 1);\
    00292    emitm(&stream, off32, 4);
    00293
    00295 #define JLE(off32) \
    00296    emitm(&stream, 0x0f, 1);\
    00297    emitm(&stream, 0x8e, 1);\
    00298    emitm(&stream, off32, 4);
    00299
    00301 #define JLEb(off8) \
    00302    emitm(&stream, 0x7e, 1);\
    00303    emitm(&stream, off8, 1);
    00304
    00306 #define JA(off32) \
    00307    emitm(&stream, 0x0f, 1);\
    00308    emitm(&stream, 0x87, 1);\
    00309    emitm(&stream, off32, 4);
    00310
    00312 #define JAE(off32) \
    00313    emitm(&stream, 0x0f, 1);\
    00314    emitm(&stream, 0x83, 1);\
    00315    emitm(&stream, off32, 4);
    00316
    00318 #define JG(off32) \
    00319    emitm(&stream, 0x0f, 1);\
    00320    emitm(&stream, 0x8f, 1);\
    00321    emitm(&stream, off32, 4);
    00322
    00324 #define JGE(off32) \
    00325    emitm(&stream, 0x0f, 1);\
    00326    emitm(&stream, 0x8d, 1);\
    00327    emitm(&stream, off32, 4);
    00328
    00330 #define JMP(off32) \
    00331    emitm(&stream, 0xe9, 1);\
    00332    emitm(&stream, off32, 4);
    00333
    00342 /**************************/
    00343 /* Prototypes             */
    00344 /**************************/
    00345
    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-2003 Politecnico di Torino. All rights reserved.