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