diff options
Diffstat (limited to 'src/analysis/disass')
-rw-r--r-- | src/analysis/disass/area.c | 54 | ||||
-rw-r--r-- | src/analysis/disass/loop.c | 2 |
2 files changed, 43 insertions, 13 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 5478fe3..5dab3ab 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -72,8 +72,11 @@ static void init_mem_area_from_addr(mem_area *, const vmpa2t *, phys_t, const GL /* Libère d'une aire de données les ressources allouées. */ static void fini_mem_area(mem_area *); -/* Indique si une zone donnée est intégralement vierge ou non. */ -static bool is_range_blank_in_mem_area(mem_area *, phys_t, phys_t); +/* Indique si une zone donnée est intégralement vierge. */ +static bool is_range_empty_in_mem_area(mem_area *, phys_t, phys_t); + +/* Indique si une zone donnée est intégralement occupée. */ +static bool is_range_busy_in_mem_area(mem_area *, phys_t, phys_t); /* Marque une série d'octets comme ayant été traités. */ static bool mark_range_in_mem_area_as_processed(mem_area *, GArchInstruction *, bool); @@ -271,6 +274,33 @@ static void fini_mem_area(mem_area *area) * start = début de la zone à manipuler. * * len = taille de cette même aire de données. * * * +* Description : Indique si une zone donnée est intégralement vierge. * +* * +* Retour : true si l'aire visée n'a jamais été traitée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool is_range_empty_in_mem_area(mem_area *area, phys_t start, phys_t len) +{ + bool result; /* Résultat à renvoyer */ + + assert((start + len) <= get_mrange_length(&area->range)); + + result = test_none_in_bit_field(area->processed, start, len); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : area = aire représentant à contenu à parcourir. * +* start = début de la zone à manipuler. * +* len = taille de cette même aire de données. * +* * * Description : Indique si une zone donnée est intégralement vierge ou non. * * * * Retour : true si l'aire visée n'a jamais été traitée, false sinon. * @@ -279,13 +309,13 @@ static void fini_mem_area(mem_area *area) * * ******************************************************************************/ -static bool is_range_blank_in_mem_area(mem_area *area, phys_t start, phys_t len) +static bool is_range_busy_in_mem_area(mem_area *area, phys_t start, phys_t len) { bool result; /* Résultat à renvoyer */ assert((start + len) <= get_mrange_length(&area->range)); - result = !test_in_bit_field(area->processed, start, len); + result = test_all_in_bit_field(area->processed, start, len); return result; @@ -425,7 +455,7 @@ static GArchInstruction *load_raw_instruction_from_mem_area(mem_area *area, phys if (get_virt_addr(pos) % sz == 0 && (offset + sz) <= get_mrange_length(&area->range) - && is_range_blank_in_mem_area(area, offset, sz)) + && is_range_empty_in_mem_area(area, offset, sz)) { *size = sz; @@ -593,7 +623,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, GProc * inutile. */ - if (!is_range_blank_in_mem_area(area, i, 1)) + if (is_range_busy_in_mem_area(area, i, 1)) break; /* Décodage d'une nouvelle instruction */ @@ -636,7 +666,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, GProc gtk_status_stack_update_activity_value(status, id, diff); - assert(!is_range_blank_in_mem_area(area, i, diff)); + assert(is_range_busy_in_mem_area(area, i, diff)); /* Enregistrement d'un éventuel début de routine */ @@ -712,7 +742,7 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp { /* On cherche à obtenir l'assurance que le traitement n'a jamais été fait */ - if (!is_range_blank_in_mem_area(area, i, 1)) + if (is_range_busy_in_mem_area(area, i, 1)) break; /* Décodage d'une nouvelle instruction, sur mesure puis minimale */ @@ -745,7 +775,7 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp gtk_status_stack_update_activity_value(status, id, diff); - assert(!is_range_blank_in_mem_area(area, i, diff)); + assert(is_range_busy_in_mem_area(area, i, diff)); /* On laisse une chance au code pour se reprendre... */ @@ -786,7 +816,7 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, GProcCon for (i = 0; i < len; i++) { - if (is_range_blank_in_mem_area(area, i, 1)) + if (is_range_empty_in_mem_area(area, i, 1)) { copy_vmpa(&start, addr); advance_vmpa(&start, i); @@ -794,12 +824,12 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, GProcCon if (area->is_exec && get_virt_addr(&start) % area->packing_size == 0) load_code_from_mem_area(area, list, count, ctx, &start, false, status, id); - if (is_range_blank_in_mem_area(area, i, 1)) + if (is_range_empty_in_mem_area(area, i, 1)) load_data_from_mem_area(area, ctx, &start, status, id); } - assert(!is_range_blank_in_mem_area(area, i, 1)); + assert(is_range_busy_in_mem_area(area, i, 1)); } diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c index a0dba66..d8ca355 100644 --- a/src/analysis/disass/loop.c +++ b/src/analysis/disass/loop.c @@ -80,7 +80,7 @@ static void detect_back_edges(dragon_node *nodes, size_t count) id = get_dragon_node_index(nodes, target); - if (test_in_bit_field(dominators, id, 1)) + if (test_in_bit_field(dominators, id)) { /* |