diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/vmpa.c | 87 | ||||
-rw-r--r-- | src/arch/vmpa.h | 9 |
2 files changed, 96 insertions, 0 deletions
diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index edff789..297a0ca 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -26,6 +26,7 @@ #include <inttypes.h> #include <malloc.h> +#include <stdlib.h> #include <string.h> @@ -174,6 +175,46 @@ int cmp_vmpa_by_virt(const vmpa2t *a, const vmpa2t *b) /****************************************************************************** * * +* Paramètres : a = première définition à analyser. * +* b = seconde définition à analyser. * +* * +* Description : Compare deux localisations selon leurs parties définies. * +* * +* Retour : Bilan de la comparaison : -1, 0 ou 1 (-1 par défaut). * +* * +* Remarques : - * +* * +******************************************************************************/ + +int cmp_vmpa(const vmpa2t *a, const vmpa2t *b) +{ + int result; /* Bilan à retourner */ + bool half; /* Comparaison débutée */ + + result = -1; + + half = false; + + if (a->physical != VMPA_NO_PHYSICAL && b->physical != VMPA_NO_PHYSICAL) + { + result = cmp_vmpa_by_phy(a, b); + half = true; + } + + if (a->virtual != VMPA_NO_VIRTUAL && b->virtual != VMPA_NO_VIRTUAL + && (!half || (half && result == 0))) + { + result = cmp_vmpa_by_virt(a, b); + } + + return result; + +} + + + +/****************************************************************************** +* * * Paramètres : addr = élément à modifier. * * qty = quantité d'unités de décallage. * * * @@ -389,3 +430,49 @@ char *vmpa2_virt_to_string(const vmpa2t *addr, MemoryDataSize msize, char buffer return buffer; } + + +/****************************************************************************** +* * +* Paramètres : buffer = chaîne de caractères à consulter. * +* * +* Description : Transforme une chaîne de caractères en position physique. * +* * +* Retour : Adresse obtenue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *string_to_vmpa_phy(const char *buffer) +{ + off_t physical; /* Position à retrouver */ + + physical = strtoull(buffer, NULL, 16); + + return make_vmpa(physical, VMPA_NO_VIRTUAL); + +} + + +/****************************************************************************** +* * +* Paramètres : buffer = chaîne de caractères à consulter. * +* * +* Description : Transforme une chaîne de caractères en adresse virtuelle. * +* * +* Retour : Adresse obtenue. * +* * +* Remarques : - * +* * +******************************************************************************/ + +vmpa2t *string_to_vmpa_virt(const char *buffer) +{ + uint64_t virtual; /* Adresse à retrouver */ + + virtual = strtoull(buffer, NULL, 16); + + return make_vmpa(VMPA_NO_PHYSICAL, virtual); + +} diff --git a/src/arch/vmpa.h b/src/arch/vmpa.h index d89c290..85ff6b4 100644 --- a/src/arch/vmpa.h +++ b/src/arch/vmpa.h @@ -74,6 +74,9 @@ int cmp_vmpa_by_phy(const vmpa2t *, const vmpa2t *); /* Compare entre elles deux adresses virtuelles. */ int cmp_vmpa_by_virt(const vmpa2t *, const vmpa2t *); +/* Compare deux localisations selon leurs parties définies. */ +int cmp_vmpa(const vmpa2t *, const vmpa2t *); + #define are_equal(a, b) \ (cmp_vmpa_by_phy(a, b) == 0 && cmp_vmpa_by_virt(a, b) == 0) @@ -101,6 +104,12 @@ char *vmpa2_phys_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], /* Transforme une adresse virtuelle en chaîne de caractères. */ char *vmpa2_virt_to_string(const vmpa2t *, MemoryDataSize, char [VMPA_MAX_LEN], size_t *); +/* Transforme une chaîne de caractères en position physique. */ +vmpa2t *string_to_vmpa_phy(const char *); + +/* Transforme une chaîne de caractères en adresse virtuelle. */ +vmpa2t *string_to_vmpa_virt(const char *); + #endif /* _ARCH_VMPA_H */ |