diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-28 19:40:19 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-28 19:40:19 (GMT) |
commit | 0f0cb560006c0ef5eb690f89c4ce720936c9d6f6 (patch) | |
tree | 09a09248b4da91cbebae8609249d02f3fbef1ef3 /tools | |
parent | 3e6c0fb01710f61e8dc9383de6be4db1188b3ee6 (diff) |
Stored instruction hooks in the data section rather than in the heap.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/d2c/hooks/manager.c | 90 | ||||
-rw-r--r-- | tools/d2c/hooks/manager.h | 3 | ||||
-rw-r--r-- | tools/d2c/spec.c | 4 |
3 files changed, 88 insertions, 9 deletions
diff --git a/tools/d2c/hooks/manager.c b/tools/d2c/hooks/manager.c index 67c09f8..2db4bbc 100644 --- a/tools/d2c/hooks/manager.c +++ b/tools/d2c/hooks/manager.c @@ -137,7 +137,7 @@ void register_hook_function(instr_hooks *hooks, char *type, char *name) * top = indique si l'écriture se réalise au plus haut niveau.* * fd = descripteur d'un flux ouvert en écriture. * * * -* Description : Associe dans le code des fonctions à une instruction. * +* Description : Déclare des opérations complémentaires pour une instruction. * * * * Retour : Bilan de l'opération. * * * @@ -145,29 +145,101 @@ void register_hook_function(instr_hooks *hooks, char *type, char *name) * * ******************************************************************************/ -bool write_hook_functions(const instr_hooks *hooks, bool top, int fd) +bool declare_hook_functions(const instr_hooks *hooks, bool top, int fd) { bool result; /* Bilan à retourner */ - size_t i; /* Boucle de parcours */ - instr_func *func; /* Nouvelle prise en compte */ + size_t i; /* Boucle de parcours #1 */ + const instr_func *func; /* Nouvelle prise en compte */ + + static const char *hook_types[] = { + "FETCH", + "LINK", + "POST" + }; + + const instr_func *find_hook_by_name(const instr_hooks *list, const char *type) + { + const instr_func *hook; /* Trouvaille à retourner */ + size_t k; /* Boucle de parcours #2 */ + + hook = NULL; + + for (k = 0; k < list->func_count && hook == NULL; k++) + if (strcmp(list->funcs[k].type, type) == 0) + hook = &list->funcs[k]; + + return hook; + + } result = true; - for (i = 0; i < hooks->func_count && result; i++) + if (hooks->func_count > 0) { - func = &hooks->funcs[i]; + if (!top) + dprintf(fd, "\t"); + + dprintf(fd, "\tstatic const instr_hook_fc hooks[IPH_COUNT] = {\n\n"); + + for (i = 0; i < (sizeof(hook_types) / sizeof(hook_types[0])); i++) + { + func = find_hook_by_name(hooks, hook_types[i]); + + if (!top) + dprintf(fd, "\t"); + + dprintf(fd, "\t\t[IPH_%s] = (instr_hook_fc)%s,\n", hook_types[i], func != NULL ? func->name : "NULL"); + + } + + dprintf(fd, "\n"); if (!top) dprintf(fd, "\t"); - dprintf(fd, "\tg_arch_instruction_set_hook(%s, IPH_%s, (instr_hook_fc)%s);\n", - top ? "result" : "instr", func->type, func->name); + dprintf(fd, "\t};\n"); + + dprintf(fd, "\n"); } - if (hooks->func_count > 0 && result) + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : hooks = gestionnaire d'un ensemble de fonctions associées. * +* top = indique si l'écriture se réalise au plus haut niveau.* +* fd = descripteur d'un flux ouvert en écriture. * +* * +* Description : Associe dans le code des fonctions à une instruction. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool write_hook_functions(const instr_hooks *hooks, bool top, int fd) +{ + bool result; /* Bilan à retourner */ + + result = true; + + if (hooks->func_count > 0) + { + if (!top) + dprintf(fd, "\t"); + + dprintf(fd, "\tg_arch_instruction_set_hooks(%s, hooks);\n", + top ? "result" : "instr"); + dprintf(fd, "\n"); + } + return result; } diff --git a/tools/d2c/hooks/manager.h b/tools/d2c/hooks/manager.h index 97bd388..1a50d0a 100644 --- a/tools/d2c/hooks/manager.h +++ b/tools/d2c/hooks/manager.h @@ -43,6 +43,9 @@ void delete_instr_hooks(instr_hooks *); /* Enregistre l'utilité d'une fonction pour une instruction. */ void register_hook_function(instr_hooks *, char *, char *); +/* Déclare des opérations complémentaires pour une instruction. */ +bool declare_hook_functions(const instr_hooks *, bool, int); + /* Associe dans le code des fonctions à une instruction. */ bool write_hook_functions(const instr_hooks *, bool, int); diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c index 1d91fed..5aa7066 100644 --- a/tools/d2c/spec.c +++ b/tools/d2c/spec.c @@ -332,6 +332,8 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a dprintf(fd, "\n"); + result &= declare_hook_functions(spec->hooks, false, fd); + /* Vérification que le décodage est possible */ result &= check_bits_correctness(spec->bits, fd); @@ -457,6 +459,8 @@ bool write_encoding_spec_format_disass(const encoding_spec *spec, int fd, const dprintf(fd, "\n"); + result &= declare_hook_functions(spec->hooks, true, fd); + /* Création de l'instruction en elle-même */ new_ins = get_new_keyword_from_syntax_items(spec->syntax); |