summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-03-30 17:20:58 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-03-30 17:20:58 (GMT)
commitdda68634391bea512a7861468fcf45f8292300bb (patch)
treec56c9b1c0bb4500973247eef12ccadaf4ebe346d /src/analysis
parentb8d5a539b1e6837f7395598a3fa25ef69650e885 (diff)
Discriminated between tests for set and unset ranges of bits.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/disass/area.c54
-rw-r--r--src/analysis/disass/loop.c2
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))
{
/*