1 /* DYNINST.C (c) Copyright Jan Jaeger, 2003-2009 */
2 /* Hercules Dynamic Loader */
3
4 /*-------------------------------------------------------------------*/
5 /* This module dynamically loads instructions. Instruction routine */
6 /* names must be registered under the name of s370_opcode_B220 for */
7 /* example, where s370 may also be s390 or z900 for ESA/390 or ESAME */
8 /* mode respectively. B220 is the opcode, and is depending on the */
9 /* instruction 2 3 or 4 digits. */
10 /*-------------------------------------------------------------------*/
11
12 #include "hstdinc.h"
13 #include "hercules.h"
14
15
16 #if defined(OPTION_DYNAMIC_LOAD)
17
18
19 #if defined(WIN32) && !defined(HDL_USE_LIBTOOL) && !defined(_MSVC_)
20 /* We need to do some special tricks for windows here, since windows */
21 /* does not support backlink and we need to resolve symbols during */
22 /* dll initialisation (REGISTER/RESOLVER). Opcode tables are renamed */
23 /* such that no naming conflicts occur. */
24 #define copy_opcode_tables copy_opcode_tables_r
25 #define opcode_table opcode_table_r
26 #define opcode_01xx opcode_01xx_r
27 #define opcode_a5xx opcode_a5xx_r
28 #define opcode_a4xx opcode_a4xx_r
29 #define opcode_a7xx opcode_a1xx_r
30 #define opcode_b2xx opcode_b2xx_r
31 #define opcode_b3xx opcode_b3xx_r
32 #define opcode_b9xx opcode_b9xx_r
33 #define opcode_c0xx opcode_c0xx_r
34 #define opcode_c2xx opcode_c2xx_r
35 #define opcode_c4xx opcode_c4xx_r /*208*/
36 #define opcode_c6xx opcode_c6xx_r /*208*/
37 #define opcode_c8xx opcode_c8xx_r
38 #define opcode_ccxx opcode_ccxx_r /*810*/
39 #define opcode_e3xx opcode_e3xx_r
40 #define opcode_e5xx opcode_e5xx_r
41 #define opcode_e6xx opcode_e6xx_r
42 #define opcode_ebxx opcode_ebxx_r
43 #define opcode_ecxx opcode_ecxx_r
44 #define opcode_edxx opcode_edxx_r
45 #endif
46
47 #include "opcode.h"
48
49 #if defined(WIN32) && !defined(HDL_USE_LIBTOOL) && !defined(_MSVC_)
50 #undef copy_opcode_tables
51 #undef opcode_table
52 #undef opcode_01xx
53 #undef opcode_a5xx
54 #undef opcode_a4xx
55 #undef opcode_a7xx
56 #undef opcode_b2xx
57 #undef opcode_b3xx
58 #undef opcode_b9xx
59 #undef opcode_c0xx
60 #undef opcode_c2xx
61 #undef opcode_c4xx /*208*/
62 #undef opcode_c6xx /*208*/
63 #undef opcode_c8xx
64 #undef opcode_ccxx /*810*/
65 #undef opcode_e3xx
66 #undef opcode_e5xx
67 #undef opcode_e6xx
68 #undef opcode_ebxx
69 #undef opcode_ecxx
70 #undef opcode_edxx
71 #endif
72
73 #include "inline.h"
74
75
76 #if !defined(_GEN_ARCH)
77
78 #if defined(_ARCHMODE2)
79 #define _GEN_ARCH _ARCHMODE2
80 #include "dyninst.c"
81 #endif
82
83 #if defined(_ARCHMODE3)
84 #undef _GEN_ARCH
85 #define _GEN_ARCH _ARCHMODE3
86 #include "dyninst.c"
87 #endif
88
89
90 static zz_func save_table[256][GEN_MAXARCH];
91 static zz_func save_01xx[256][GEN_MAXARCH];
92 #if defined (FEATURE_VECTOR_FACILITY)
93 static zz_func save_a4xx[256][GEN_MAXARCH];
94 #endif
95 static zz_func save_a5xx[16][GEN_MAXARCH];
96 static zz_func save_a7xx[16][GEN_MAXARCH];
97 static zz_func save_b2xx[256][GEN_MAXARCH];
98 static zz_func save_b3xx[256][GEN_MAXARCH];
99 static zz_func save_b9xx[256][GEN_MAXARCH];
100 static zz_func save_c0xx[16][GEN_MAXARCH];
101 static zz_func save_c2xx[16][GEN_MAXARCH]; /*@Z9*/
102 static zz_func save_c4xx[16][GEN_MAXARCH]; /*208*/
103 static zz_func save_c6xx[16][GEN_MAXARCH]; /*208*/
104 static zz_func save_c8xx[16][GEN_MAXARCH];
105 static zz_func save_ccxx[16][GEN_MAXARCH]; /*810*/
106 static zz_func save_e3xx[256][GEN_MAXARCH];
107 static zz_func save_e5xx[256][GEN_MAXARCH];
108 static zz_func save_e6xx[256][GEN_MAXARCH];
109 static zz_func save_ebxx[256][GEN_MAXARCH];
110 static zz_func save_ecxx[256][GEN_MAXARCH];
111 static zz_func save_edxx[256][GEN_MAXARCH];
112
113 #if defined(WIN32) && !defined(HDL_USE_LIBTOOL) && !defined(_MSVC_)
114 static int opcodes_saved;
115 static void copy_opcode_tables ();
116 static void * opcode_table;
117 static void * opcode_01xx;
118 #if defined (FEATURE_VECTOR_FACILITY)
119 static void * opcode_a4xx;
120 #endif
121 static void * opcode_a5xx;
122 static void * opcode_a7xx;
123 static void * opcode_b2xx;
124 static void * opcode_b3xx;
125 static void * opcode_b9xx;
126 static void * opcode_c0xx;
127 static void * opcode_c2xx; /*@Z9*/
128 static void * opcode_c4xx; /*208*/
129 static void * opcode_c6xx; /*208*/
130 static void * opcode_c8xx;
131 static void * opcode_ccxx; /*810*/
132 static void * opcode_e3xx;
133 static void * opcode_e5xx;
134 static void * opcode_e6xx;
135 static void * opcode_ebxx;
136 static void * opcode_ecxx;
137 static void * opcode_edxx;
138 #endif
139
140 static char *prefix[] = {
141 #if defined(_370)
142 "s370_dyninst_opcode_",
143 #endif
144 #if defined(_390)
145 "s390_dyninst_opcode_",
146 #endif
147 #if defined(_900)
148 "z900_dyninst_opcode_"
149 #endif
150 };
151
152
opcode_save()153 static void opcode_save()
154 {
155 memcpy(save_table,opcode_table,sizeof(save_table));
156 memcpy(save_01xx,opcode_01xx,sizeof(save_01xx));
157 #if defined (FEATURE_VECTOR_FACILITY)
158 memcpy(save_a4xx,opcode_a4xx,sizeof(save_a4xx));
159 #endif
160 memcpy(save_a5xx,opcode_a5xx,sizeof(save_a5xx));
161 memcpy(save_a7xx,opcode_a7xx,sizeof(save_a7xx));
162 memcpy(save_b2xx,opcode_b2xx,sizeof(save_b2xx));
163 memcpy(save_b3xx,opcode_b3xx,sizeof(save_b3xx));
164 memcpy(save_b9xx,opcode_b9xx,sizeof(save_b9xx));
165 memcpy(save_c0xx,opcode_c0xx,sizeof(save_c0xx));
166 memcpy(save_c2xx,opcode_c2xx,sizeof(save_c2xx)); /*@Z9*/
167 memcpy(save_c4xx,opcode_c4xx,sizeof(save_c4xx)); /*208*/
168 memcpy(save_c6xx,opcode_c6xx,sizeof(save_c6xx)); /*208*/
169 memcpy(save_c8xx,opcode_c8xx,sizeof(save_c8xx));
170 memcpy(save_ccxx,opcode_ccxx,sizeof(save_ccxx)); /*810*/
171 memcpy(save_e3xx,opcode_e3xx,sizeof(save_e3xx));
172 memcpy(save_e5xx,opcode_e5xx,sizeof(save_e5xx));
173 memcpy(save_e6xx,opcode_e6xx,sizeof(save_e6xx));
174 memcpy(save_ebxx,opcode_ebxx,sizeof(save_ebxx));
175 memcpy(save_ecxx,opcode_ecxx,sizeof(save_ecxx));
176 memcpy(save_edxx,opcode_edxx,sizeof(save_edxx));
177 }
178
179
opcode_restore()180 static void opcode_restore()
181 {
182 memcpy(opcode_table,save_table,sizeof(save_table));
183 memcpy(opcode_01xx,save_01xx,sizeof(save_01xx));
184 #if defined (FEATURE_VECTOR_FACILITY)
185 memcpy(opcode_a4xx,save_a4xx,sizeof(save_a4xx));
186 #endif
187 memcpy(opcode_a5xx,save_a5xx,sizeof(save_a5xx));
188 memcpy(opcode_a7xx,save_a7xx,sizeof(save_a7xx));
189 memcpy(opcode_b2xx,save_b2xx,sizeof(save_b2xx));
190 memcpy(opcode_b3xx,save_b3xx,sizeof(save_b3xx));
191 memcpy(opcode_b9xx,save_b9xx,sizeof(save_b9xx));
192 memcpy(opcode_c0xx,save_c0xx,sizeof(save_c0xx));
193 memcpy(opcode_c2xx,save_c2xx,sizeof(save_c2xx)); /*@Z9*/
194 memcpy(opcode_c4xx,save_c4xx,sizeof(save_c4xx)); /*208*/
195 memcpy(opcode_c6xx,save_c6xx,sizeof(save_c6xx)); /*208*/
196 memcpy(opcode_c8xx,save_c8xx,sizeof(save_c8xx));
197 memcpy(opcode_ccxx,save_ccxx,sizeof(save_ccxx)); /*810*/
198 memcpy(opcode_e3xx,save_e3xx,sizeof(save_e3xx));
199 memcpy(opcode_e5xx,save_e5xx,sizeof(save_e5xx));
200 memcpy(opcode_e6xx,save_e6xx,sizeof(save_e6xx));
201 memcpy(opcode_ebxx,save_ebxx,sizeof(save_ebxx));
202 memcpy(opcode_ecxx,save_ecxx,sizeof(save_ecxx));
203 memcpy(opcode_edxx,save_edxx,sizeof(save_edxx));
204 }
205
206
assign_extop1(int opcode,int extop,zz_func table[256][GEN_MAXARCH],zz_func saved[256][GEN_MAXARCH])207 static void assign_extop1(int opcode, int extop, zz_func table[256][GEN_MAXARCH],
208 zz_func saved[256][GEN_MAXARCH])
209 {
210 int arch;
211 void *tmp;
212
213 for(arch = 0; arch < GEN_MAXARCH - 2; arch++)
214 {
215 char name[32];
216
217 sprintf(name,"%s%02X%1X",prefix[arch],opcode,extop);
218
219 if((tmp = HDL_FINDSYM(name)))
220 table[extop][arch] = tmp;
221 else
222 table[extop][arch] = saved[extop][arch];
223
224 }
225
226
227 }
228
229
assign_extop(int opcode,int extop,zz_func table[256][GEN_MAXARCH],zz_func saved[256][GEN_MAXARCH])230 static void assign_extop(int opcode, int extop, zz_func table[256][GEN_MAXARCH],
231 zz_func saved[256][GEN_MAXARCH])
232 {
233 int arch;
234 void *tmp;
235
236 for(arch = 0; arch < GEN_MAXARCH - 2; arch++)
237 {
238 char name[32];
239
240 sprintf(name,"%s%02X%02X",prefix[arch],opcode,extop);
241
242 if((tmp = HDL_FINDSYM(name)))
243 table[extop][arch] = tmp;
244 else
245 table[extop][arch] = saved[extop][arch];
246
247 }
248
249
250 }
251
252
assign_opcode(int opcode,zz_func table[256][GEN_MAXARCH],zz_func saved[256][GEN_MAXARCH])253 static void assign_opcode(int opcode, zz_func table[256][GEN_MAXARCH],
254 zz_func saved[256][GEN_MAXARCH])
255 {
256 int arch;
257 void *tmp;
258
259 for(arch = 0; arch < GEN_MAXARCH - 2; arch++)
260 {
261 char name[32];
262
263 sprintf(name,"%s%02X",prefix[arch],opcode);
264
265 if((tmp = HDL_FINDSYM(name)))
266 table[opcode][arch] = tmp;
267 else
268 table[opcode][arch] = saved[opcode][arch];
269
270 }
271
272
273 }
274
275
276 /* Libtool static name colision resolution */
277 /* note : lt_dlopen will look for symbol & modulename_LTX_symbol */
278 #if !defined(HDL_BUILD_SHARED) && defined(HDL_USE_LIBTOOL)
279 #define hdl_ddev dyninst_LTX_hdl_ddev
280 #define hdl_depc dyninst_LTX_hdl_depc
281 #define hdl_reso dyninst_LTX_hdl_reso
282 #define hdl_init dyninst_LTX_hdl_init
283 #define hdl_fini dyninst_LTX_hdl_fini
284 #endif
285
286
287 HDL_DEPENDENCY_SECTION;
288 {
289 HDL_DEPENDENCY (HERCULES);
290 HDL_DEPENDENCY (REGS);
291 HDL_DEPENDENCY (DEVBLK);
292 HDL_DEPENDENCY (SYSBLK);
293
294 } END_DEPENDENCY_SECTION
295
296
297 HDL_REGISTER_SECTION;
298 {
299 #if defined(WIN32) && !defined(HDL_USE_LIBTOOL) && !defined(_MSVC_)
300 opcodes_saved = 0;
301 #else
302 opcode_save();
303 #endif
304 }
305 END_REGISTER_SECTION
306
307
308 HDL_RESOLVER_SECTION;
309 {
310 int opcode, extop;
311
312 #if 0
313 #if defined(WIN32) && !defined(HDL_USE_LIBTOOL) && !defined(_MSVC_)
314 if(!opcodes_saved)
315 {
316 HDL_RESOLVE(copy_opcode_tables);
317 HDL_RESOLVE(opcode_table);
318 HDL_RESOLVE(opcode_01xx);
319 #if defined(FEATURE_VECTOR_FACILITY)
320 HDL_RESOLVE(opcode_a4xx);
321 #endif
322 HDL_RESOLVE(opcode_a5xx);
323 HDL_RESOLVE(opcode_a7xx);
324 HDL_RESOLVE(opcode_b2xx);
325 HDL_RESOLVE(opcode_b3xx);
326 HDL_RESOLVE(opcode_b9xx);
327 HDL_RESOLVE(opcode_c0xx);
328 HDL_RESOLVE(opcode_c2xx); /*@Z9*/
329 HDL_RESOLVE(opcode_c4xx); /*208*/
330 HDL_RESOLVE(opcode_c6xx); /*208*/
331 HDL_RESOLVE(opcode_c8xx);
332 HDL_RESOLVE(opcode_ccxx); /*810*/
333 HDL_RESOLVE(opcode_e3xx);
334 HDL_RESOLVE(opcode_e5xx);
335 HDL_RESOLVE(opcode_e6xx);
336 HDL_RESOLVE(opcode_ebxx);
337 HDL_RESOLVE(opcode_ecxx);
338 HDL_RESOLVE(opcode_edxx);
339
340 opcode_save();
341
342 opcodes_saved = 1;
343 }
344 #endif
345 #endif
346
347 for(opcode = 0; opcode < 256; opcode++)
348 {
349 switch(opcode)
350 {
351 case 0x01:
352 for(extop = 0; extop < 256; extop++)
353 assign_extop(opcode, extop, opcode_01xx, save_01xx);
354 break;
355
356 #if defined (FEATURE_VECTOR_FACILITY)
357 case 0xA4:
358 for(extop = 0; extop < 256; extop++)
359 assign_extop(opcode, extop, v_opcode_a4xx, save_a4xx);
360 break;
361 #endif
362
363 case 0xA5:
364 for(extop = 0; extop < 16; extop++)
365 assign_extop1(opcode, extop, opcode_a5xx, save_a5xx);
366 break;
367
368 case 0xA7:
369 for(extop = 0; extop < 16; extop++)
370 assign_extop1(opcode, extop, opcode_a7xx, save_a7xx);
371 break;
372
373 case 0xB2:
374 for(extop = 0; extop < 256; extop++)
375 assign_extop(opcode, extop, opcode_b2xx, save_b2xx);
376 break;
377
378 case 0xB3:
379 for(extop = 0; extop < 256; extop++)
380 assign_extop(opcode, extop, opcode_b3xx, save_b3xx);
381 break;
382
383 case 0xB9:
384 for(extop = 0; extop < 256; extop++)
385 assign_extop(opcode, extop, opcode_b9xx, save_b9xx);
386 break;
387
388 case 0xC0:
389 for(extop = 0; extop < 16; extop++)
390 assign_extop1(opcode, extop, opcode_c0xx, save_c0xx);
391 break;
392
393 case 0xC2: /*@Z9*/
394 for(extop = 0; extop < 16; extop++) /*@Z9*/
395 assign_extop1(opcode, extop, opcode_c2xx, save_c2xx); /*@Z9*/
396 break; /*@Z9*/
397
398 case 0xC4: /*208*/
399 for(extop = 0; extop < 16; extop++) /*208*/
400 assign_extop1(opcode, extop, opcode_c4xx, save_c4xx); /*208*/
401 break; /*208*/
402
403 case 0xC6: /*208*/
404 for(extop = 0; extop < 16; extop++) /*208*/
405 assign_extop1(opcode, extop, opcode_c6xx, save_c6xx); /*208*/
406 break; /*208*/
407
408 case 0xC8:
409 for(extop = 0; extop < 16; extop++)
410 assign_extop1(opcode, extop, opcode_c8xx, save_c8xx);
411 break;
412
413 case 0xCC: /*810*/
414 for(extop = 0; extop < 16; extop++) /*810*/
415 assign_extop1(opcode, extop, opcode_ccxx, save_ccxx); /*810*/
416 break; /*810*/
417
418 case 0xE3:
419 for(extop = 0; extop < 256; extop++)
420 assign_extop(opcode, extop, opcode_e3xx, save_e3xx);
421 break;
422
423 case 0xE5:
424 for(extop = 0; extop < 256; extop++)
425 assign_extop(opcode, extop, opcode_e5xx, save_e5xx);
426 break;
427
428 case 0xE6:
429 for(extop = 0; extop < 256; extop++)
430 assign_extop(opcode, extop, opcode_e6xx, save_e6xx);
431 break;
432
433 case 0xEB:
434 for(extop = 0; extop < 256; extop++)
435 assign_extop(opcode, extop, opcode_ebxx, save_ebxx);
436 break;
437
438 case 0xEC:
439 for(extop = 0; extop < 256; extop++)
440 assign_extop(opcode, extop, opcode_ecxx, save_ecxx);
441 break;
442
443 case 0xED:
444 for(extop = 0; extop < 256; extop++)
445 assign_extop(opcode, extop, opcode_edxx, save_edxx);
446 break;
447
448 default:
449 assign_opcode(opcode, opcode_table, save_table);
450 }
451
452 }
453
454 /* Copy opcodes to performance shadow tables */
455 copy_opcode_tables();
456
457 } END_RESOLVER_SECTION
458
459
460 HDL_FINAL_SECTION;
461 {
462
463 opcode_restore();
464
465 } END_FINAL_SECTION
466
467
468 #endif /*!defined(_GEN_ARCH)*/
469
470 #endif /*defined(OPTION_DYNAMIC_LOAD)*/
471