]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/plr/server/src/instruction_length.S
update
[l4.git] / l4 / pkg / plr / server / src / instruction_length.S
1 /*
2  * MLDE32 -- a tiny instruction length decoder for x86/32
3  *
4  *      http://www.woodmann.com/collaborative/tools/index.php/Mlde32
5  */
6 .intel_syntax noprefix
7
8 .data
9 O_UNIQUE   =     0
10 O_PREFIX   =     1
11 O_IMM8     =     2
12 O_IMM16    =     3
13 O_IMM24    =     4
14 O_IMM32    =     5
15 O_IMM48    =     6
16 O_MODRM    =     7
17 O_MODRM8   =     8
18 O_MODRM32  =     9
19 O_EXTENDED =    10
20 O_WEIRD    =    11
21 O_ERROR    =    12
22
23 .text
24 .global mlde32
25 mlde32:
26         pushad
27         cld
28
29         xor edx,edx
30         mov esi, [esp+(8*4)+4]
31         mov ebp,esp
32
33         // 256 bytes, index-compressed opcode type table
34         push 0x01097f71c
35         push 0x0F71C6780
36         push 0x017389718
37         push 0x0101CB718
38         push 0x017302C17
39         push 0x018173017
40         push 0x0F715F547
41         push 0x04C103748
42         push 0x0272CE7F7
43         push 0x0F7AC6087
44         push 0x01C121C52
45         push 0x07C10871C
46         push 0x0201C701C
47         push 0x04767602B
48         push 0x020211011
49         push 0x040121625
50         push 0x082872022
51         push 0x047201220
52         push 0x013101419
53         push 0x018271013
54         push 0x028858260
55         push 0x015124045
56         push 0x05016A0C7
57         push 0x028191812
58         push 0x0F2401812
59         push 0x019154127
60         push 0x050F0F011
61         mov  ecx, 0x15124710
62         push ecx
63         push 0x11151247
64         push 0x10111512
65         push 0x47101115
66         mov  eax, 0x12472015
67         push eax
68         push eax
69         push 0x12471A10
70         add  cl, 0x10
71         push ecx
72         sub  cl, 0x20
73         push ecx
74
75         xor  ecx, ecx
76         dec  ecx
77
78         // code starts
79 .Lps:
80         inc ecx
81         mov edi, esp
82 .Lgo:
83         lodsb
84         mov bh, al
85 .Lft:
86     mov ah, [edi]
87         inc edi
88         shr  ah, 4
89         sub  al, ah
90         jnc  .Lft
91
92         mov  al, [edi-1]
93         and  al, 0xf
94
95         cmp  al, O_ERROR
96         jnz  .Li7
97
98         pop  edx
99         not  edx
100
101 .Li7:
102         inc edx
103         cmp  al, O_UNIQUE
104         jz   .Lt_exit
105
106         cmp  al, O_PREFIX
107         jz   .Lps
108
109         add  edi, 0x51          /* (.L_ettbl - .L_ttbl) */
110
111         cmp  al, O_EXTENDED
112         jz   .Lgo
113
114
115         mov  edi, [ebp+(8*4)+4]
116
117 .Li6:  inc  edx
118         cmp  al, O_IMM8
119         jz   .Lt_exit
120         cmp  al, O_MODRM
121         jz   .Lt_modrm
122         cmp  al, O_WEIRD
123         jz   .Lt_weird
124
125 .Li5:  inc  edx
126         cmp  al, O_IMM16
127         jz   .Lt_exit
128         cmp  al, O_MODRM8
129         jz   .Lt_modrm
130
131 .Li4:  inc  edx
132         cmp  al, O_IMM24
133         jz   .Lt_exit
134
135 .Li3:  inc  edx
136 .Li2:  inc  edx
137
138         pushad
139         mov  al, 0x66
140         repnz scasb
141         popad
142         jnz  .Lc32
143
144 .Ld2:  dec  edx
145         dec  edx
146 .Lc32: cmp  al, O_MODRM32
147         jz   .Lt_modrm
148         sub  al, O_IMM32
149         jz   .Lt_imm32
150
151 .Li1:  inc  edx
152
153 .Lt_exit:
154         mov  esp, ebp
155         mov  [esp+(7*4)], edx
156         popad
157         ret
158
159 /*********************************
160  * PROCESS THE MOD/RM BYTE       *
161  *                               *
162  *   7    6 5          3 2    0  *
163  *   | MOD | Reg/Opcode | R/M |  *
164  *                               *
165  *********************************
166 */
167 .Lt_modrm:
168        lodsb
169        mov  ah, al
170        shr  al, 7
171        jb   .Lprmk
172        jz   .Lprm
173
174        add  dl, 4
175
176        pushad
177        mov  al, 0x67
178        repnz scasb
179        popad
180        jnz  .Lprm
181
182 .Ld3:  sub  dl, 3
183
184        dec  al
185 .Lprmk:jnz  .Lt_exit
186        inc  edx
187        inc  eax
188 .Lprm:
189        and  ah, 0x7
190
191        pushad
192        mov  al, 0x67
193        repnz scasb
194        popad
195        jz   .Lprm67chk
196
197        cmp  ah, 4
198        jz   .Lprmsib
199
200        cmp  ah, 5
201        jnz  .Lt_exit
202
203 .Lprm5chk:
204        dec  al
205        jz   .Lt_exit
206 .Li42: add  dl, 4
207        jmp  .Lt_exit
208
209 .Lprm67chk:
210        cmp  ax, 0x0600
211        jnz  .Lt_exit
212        inc  edx
213        jmp  .Li1
214
215 .Lprmsib:
216        cmp  al, 0
217        jnz  .Li1
218        lodsb
219        and  al, 0x7
220        sub  al, 5
221        jnz  .Li1
222        inc  edx
223        jmp  .Li42
224
225 /****************************
226  * PROCESS WEIRD OPCODES    *
227  *                          *
228  * Fucking test (F6h/F7h)   *
229  *                          *
230  ****************************/
231 .Lt_weird:
232        test byte ptr [esi], 0x38
233        jnz  .Lt_modrm
234
235        mov  al, O_MODRM8
236
237        shr  bh, 1
238        adc  al, 0
239        jmp  .Li5
240
241
242 /*********************************
243  * PROCESS SOME OTHER SHIT       *
244  *                               *
245  * Fucking mov (A0h/A1h/A2h/A3h) *
246  *                               *
247  *********************************/
248 .Lt_imm32:
249        sub  bh, 0xA0
250
251        cmp  bh, 4
252        jae  .Ld2
253
254        pushad
255        mov  al, 0x67
256        repnz scasb
257        popad
258        jnz  .Lchk66t
259
260 .Ld4:  dec  edx
261        dec  edx
262
263 .Lchk66t:
264        pushad
265        mov  al, 0x66
266        repnz scasb
267        popad
268        jz   .Li1
269        jnz  .Ld2