summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/vmpa.c87
-rw-r--r--src/arch/vmpa.h9
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 */