1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*--- begin                                        dispatch.c ---*/
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/*---------------------------------------------------------------*/
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "basictypes.h"
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------------------------------------------------------- */
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* TRANSLATION TABLE/CACHE                                   */
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* --------------------------------------------------------- */
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar* find_translation ( char* orig )
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < n_transtab_used; i++)
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (transtab[i].orig == orig)
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return transtab[i].trans;
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define N_TT_ENTRIES 1000
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct {
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char* orig;
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int   orig_size;
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char* trans;
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int   trans_size;
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   TTEntry;
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint n_transtab_used = 0;
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovTTEntry transtab[N_TT_ENTRIES];
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Call here to add a translation to the trans cache.
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Supplied translation is in mallocville.  add_translation should
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   copy it out as the caller will free it on return.  */
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* EXPORTED */
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid add_translation ( char* orig, int orig_size, char* trans, int trans_size )
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i;
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assert(n_transtab_used < N_TT_ENTRIES);
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   transtab[n_transtab_used].orig       = orig;
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   transtab[n_transtab_used].orig_size  = orig_size;
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   transtab[n_transtab_used].trans_size = trans_size;
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   transtab[n_transtab_used].trans = malloc(trans_size);
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   assert(transtab[n_transtab_used].trans != NULL);
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for (i = 0; i < trans_size; i++)
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      transtab[n_transtab_used].trans[i] = trans[i];
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef arm_TARGET_ARCH
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   arm_notify_new_code(transtab[n_transtab_used].trans, trans_size);
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   n_transtab_used++;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Run the simulated machine for a while.  Returns when a new BB needs
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to be translated, and returns its address.  Returns NULL when we
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   want to stop. */
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* EXPORTED */
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar* run_machine ( void )
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char* nextpc_orig;
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char* nextpc_trans;
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (1) {
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      nextpc_orig = (char*)(regs_arm[REG_PC]);
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (nextpc_orig == stop_at)
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return NULL;
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      nextpc_trans = find_translation(nextpc_orig);
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (nextpc_trans == NULL)
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return nextpc_orig;
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      run_translation(nextpc_trans, (char*) &regs_arm[0] );
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* HOW TO USE:
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   for a main fn :: void main ( void )
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   * load .o's, link, etc
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   * call initialise_machine with & main
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   * call run_machine repeatedly.  If it returns NULL, stop.  Else
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     make a translation of the returned address, pass it to
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     add_translation, and resume running by calling run_machine.
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
98