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*) ®s_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