summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pychrysalide')
-rw-r--r--plugins/pychrysalide/arch/vmpa.c125
1 files changed, 122 insertions, 3 deletions
diff --git a/plugins/pychrysalide/arch/vmpa.c b/plugins/pychrysalide/arch/vmpa.c
index 605b04d..20784cd 100644
--- a/plugins/pychrysalide/arch/vmpa.c
+++ b/plugins/pychrysalide/arch/vmpa.c
@@ -76,6 +76,12 @@ static bool convert_pyobj_to_vmpa(PyObject *, vmpa2t *);
/* Effectue une opération de type 'add' avec le type 'vmpa'. */
static PyObject *py_vmpa_nb_add(PyObject *, PyObject *);
+/* Effectue une opération de type 'sub' avec le type 'vmpa'. */
+static PyObject *py_vmpa_nb_subtract(PyObject *, PyObject *);
+
+/* Effectue une opération de type 'add' sur une instance 'vmpa'. */
+static PyObject *py_vmpa_nb_inplace_add(PyObject *, PyObject *);
+
/* ------------------------ DEFINITION D'UNE ZONE EN MEMOIRE ------------------------ */
@@ -499,6 +505,8 @@ static PyObject *py_vmpa_nb_add(PyObject *o1, PyObject *o2)
vmpa2t addr1; /* Première adresse à traiter */
vmpa2t addr2; /* Seconde adresse à traiter */
PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */
+ phys_t new_phys; /* Nouvelle position */
+ virt_t new_virt; /* Nouvelle adresse */
if (!convert_pyobj_to_vmpa(o1, &addr1))
return NULL;
@@ -510,9 +518,117 @@ static PyObject *py_vmpa_nb_add(PyObject *o1, PyObject *o2)
result = PyObject_CallObject((PyObject *)py_vmpa_type, NULL);
- init_vmpa(&((py_vmpa_t *)result)->addr,
- addr1.physical + addr2.physical,
- addr1.virtual + addr2.virtual);
+ if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL)
+ new_phys = addr1.physical + addr2.physical;
+ else
+ new_phys = NO_PHYSICAL;
+
+ if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL)
+ new_virt = addr1.virtual + addr2.virtual;
+ else
+ new_virt = NO_VIRTUAL;
+
+ init_vmpa(&((py_vmpa_t *)result)->addr, new_phys, new_virt);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : o1 = premier élément concerné par l'opération. *
+* o2 = second élément concerné par l'opération. *
+* *
+* Description : Effectue une opération de type 'sub' avec le type 'vmpa'. *
+* *
+* Retour : Résultat de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_vmpa_nb_subtract(PyObject *o1, PyObject *o2)
+{
+ PyObject *result; /* Résultat à retourner */
+ vmpa2t addr1; /* Première adresse à traiter */
+ vmpa2t addr2; /* Seconde adresse à traiter */
+ PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */
+ phys_t new_phys; /* Nouvelle position */
+ virt_t new_virt; /* Nouvelle adresse */
+
+ if (!convert_pyobj_to_vmpa(o1, &addr1))
+ return NULL;
+
+ if (!convert_pyobj_to_vmpa(o2, &addr2))
+ return NULL;
+
+ py_vmpa_type = get_python_vmpa_type();
+
+ result = PyObject_CallObject((PyObject *)py_vmpa_type, NULL);
+
+ if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL)
+ new_phys = addr1.physical - addr2.physical;
+ else
+ new_phys = NO_PHYSICAL;
+
+ if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL)
+ new_virt = addr1.virtual - addr2.virtual;
+ else
+ new_virt = NO_VIRTUAL;
+
+ init_vmpa(&((py_vmpa_t *)result)->addr, new_phys, new_virt);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : o1 = premier élément concerné par l'opération. *
+* o2 = second élément concerné par l'opération. *
+* *
+* Description : Effectue une opération de type 'add' sur une instance 'vmpa'.*
+* *
+* Retour : Résultat de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_vmpa_nb_inplace_add(PyObject *o1, PyObject *o2)
+{
+ PyObject *result; /* Résultat à retourner */
+ vmpa2t addr1; /* Première adresse à traiter */
+ vmpa2t addr2; /* Seconde adresse à traiter */
+ phys_t new_phys; /* Nouvelle position */
+ virt_t new_virt; /* Nouvelle adresse */
+ vmpa2t *inplace; /* Données à modifier */
+
+ if (!convert_pyobj_to_vmpa(o1, &addr1))
+ return NULL;
+
+ if (!convert_pyobj_to_vmpa(o2, &addr2))
+ return NULL;
+
+ if (addr1.physical != NO_PHYSICAL && addr2.physical != NO_PHYSICAL)
+ new_phys = addr1.physical + addr2.physical;
+ else
+ new_phys = NO_PHYSICAL;
+
+ if (addr1.virtual != NO_VIRTUAL && addr2.virtual != NO_VIRTUAL)
+ new_virt = addr1.virtual + addr2.virtual;
+ else
+ new_virt = NO_VIRTUAL;
+
+ inplace = get_internal_vmpa(o1);
+
+ inplace->physical = new_phys;
+ inplace->virtual = new_virt;
+
+ result = o1;
+ Py_INCREF(result);
return result;
@@ -536,6 +652,9 @@ PyTypeObject *get_python_vmpa_type(void)
static PyNumberMethods py_vmpa_nb_proto = {
.nb_add = py_vmpa_nb_add,
+ .nb_subtract = py_vmpa_nb_subtract,
+
+ .nb_inplace_add = py_vmpa_nb_inplace_add,
/*
binaryfunc nb_add;