diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2017-03-21 21:18:53 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2017-03-23 07:18:48 (GMT) | 
| commit | 518ce6e1594ba80be4286bd3e561b0b7f73ce4b0 (patch) | |
| tree | a7591a6cdeb5d289861a23da75bb07ddf0c5ac90 /src/arch | |
| parent | 222c14bbc67f8b15a41f3890ee11eff289c083bb (diff) | |
Restricted an instruction iterator to a given memory range if requested.
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/instriter.c | 75 | ||||
| -rw-r--r-- | src/arch/instriter.h | 3 | 
2 files changed, 78 insertions, 0 deletions
| diff --git a/src/arch/instriter.c b/src/arch/instriter.c index 2c922d8..23525f3 100644 --- a/src/arch/instriter.c +++ b/src/arch/instriter.c @@ -39,6 +39,9 @@ typedef struct _instr_iter_t      size_t index;                           /* Instruction courante        */ +    mrange_t restriction;                   /* Enventuelle limite de zone  */ +    bool is_restricted;                     /* Validité de l'étendue       */ +  } instr_iter_t; @@ -69,6 +72,8 @@ instr_iter_t *create_instruction_iterator(GArchProcessor *proc, size_t index)      result->index = index; +    result->is_restricted = false; +      return result;  } @@ -97,6 +102,28 @@ void delete_instruction_iterator(instr_iter_t *iter)  /******************************************************************************  *                                                                             * +*  Paramètres  : iter  = itérateur à traiter.                                 * +*                range = bornes de l'espace de parcours.                      * +*                                                                             * +*  Description : Limite le parcours des instructions à une zone donnée.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void restrict_instruction_iterator(instr_iter_t *iter, const mrange_t *range) +{ +    copy_mrange(&iter->restriction, range); + +    iter->is_restricted = true; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : iter = itérateur à manipuler.                                *  *                                                                             *  *  Description : Fournit l'instruction courante de l'itérateur.               * @@ -110,6 +137,7 @@ void delete_instruction_iterator(instr_iter_t *iter)  GArchInstruction *get_instruction_iterator_current(instr_iter_t *iter)  {      GArchInstruction *result;               /* Résultat à retourner        */ +    const mrange_t *irange;                 /* Emplacement d'instruction   */      g_arch_processor_lock(iter->proc); @@ -119,7 +147,24 @@ GArchInstruction *get_instruction_iterator_current(instr_iter_t *iter)      else      {          if (iter->index < g_arch_processor_count_instructions(iter->proc)) +        {              result = g_arch_processor_get_instruction(iter->proc, iter->index); + +            /* L'instruction sort-elle des clous ? */ +            if (iter->is_restricted) +            { +                irange = g_arch_instruction_get_range(result); + +                if (!mrange_contains_mrange(&iter->restriction, irange)) +                { +                    g_object_unref(G_OBJECT(result)); +                    result = NULL; +                } + +            } + +        } +          else              result = NULL; @@ -147,6 +192,7 @@ GArchInstruction *get_instruction_iterator_current(instr_iter_t *iter)  GArchInstruction *get_instruction_iterator_prev(instr_iter_t *iter)  {      GArchInstruction *result;               /* Résultat à retourner        */ +    const mrange_t *irange;                 /* Emplacement d'instruction   */      g_arch_processor_lock(iter->proc); @@ -159,6 +205,20 @@ GArchInstruction *get_instruction_iterator_prev(instr_iter_t *iter)          {              iter->index--;              result = g_arch_processor_get_instruction(iter->proc, iter->index); + +            /* L'instruction sort-elle des clous ? */ +            if (iter->is_restricted) +            { +                irange = g_arch_instruction_get_range(result); + +                if (!mrange_contains_mrange(&iter->restriction, irange)) +                { +                    g_object_unref(G_OBJECT(result)); +                    result = NULL; +                } + +            } +          }          else @@ -188,6 +248,7 @@ GArchInstruction *get_instruction_iterator_prev(instr_iter_t *iter)  GArchInstruction *get_instruction_iterator_next(instr_iter_t *iter)  {      GArchInstruction *result;               /* Résultat à retourner        */ +    const mrange_t *irange;                 /* Emplacement d'instruction   */      g_arch_processor_lock(iter->proc); @@ -200,6 +261,20 @@ GArchInstruction *get_instruction_iterator_next(instr_iter_t *iter)          {              iter->index++;              result = g_arch_processor_get_instruction(iter->proc, iter->index); + +            /* L'instruction sort-elle des clous ? */ +            if (iter->is_restricted) +            { +                irange = g_arch_instruction_get_range(result); + +                if (!mrange_contains_mrange(&iter->restriction, irange)) +                { +                    g_object_unref(G_OBJECT(result)); +                    result = NULL; +                } + +            } +          }          else diff --git a/src/arch/instriter.h b/src/arch/instriter.h index 479fcbe..23bc323 100644 --- a/src/arch/instriter.h +++ b/src/arch/instriter.h @@ -42,6 +42,9 @@ instr_iter_t *create_instruction_iterator(GArchProcessor *, size_t);  /* Détruit un itérateur mis en place. */  void delete_instruction_iterator(instr_iter_t *); +/* Limite le parcours des instructions à une zone donnée. */ +void restrict_instruction_iterator(instr_iter_t *, const mrange_t *); +  /* Fournit l'instruction courante de l'itérateur. */  GArchInstruction *get_instruction_iterator_current(instr_iter_t *); | 
