diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/operands/immediate.c | 437 |
1 files changed, 304 insertions, 133 deletions
diff --git a/src/arch/operands/immediate.c b/src/arch/operands/immediate.c index 58e40aa..a63bae5 100644 --- a/src/arch/operands/immediate.c +++ b/src/arch/operands/immediate.c @@ -44,39 +44,77 @@ #include "../../common/extstr.h" #include "../../core/logs.h" #include "../../format/format.h" +#include "../../glibext/objhole.h" /* ------------------------- OPERANDE POUR VALEUR IMMEDIATE ------------------------- */ +/* Etats particuliers d'un opérande de valeur immédiate */ +typedef enum _ImmOpFlag +{ + IOF_ZERO_PADDING_BY_DEFAULT, /* Bourrage avec 0 par défaut ?*/ + IOF_ZERO_PADDING, /* Bourrage avec 0 ? */ + +} ImmOpFlag; + +/* Informations glissées dans la structure GObject de GArchInstruction */ +typedef union _immop_obj_extra +{ + struct + { + MemoryDataSize size; /* Taille de l'opérande */ + + ImmOperandDisplay def_display; /* Type par défaut d'affichage */ + ImmOperandDisplay display; /* Format général d'affichage */ + ImmOpFlag flags; /* Informations diverses */ + + }; + + gint lock; /* Gestion d'accès aux fanions */ + +} immop_obj_extra; + /* Définition d'un opérande de valeur numérique (instance) */ struct _GImmOperand { GArchOperand parent; /* Instance parente */ uint64_t raw; /* Valeur transtypée */ - MemoryDataSize size; /* Taille de l'opérande */ - ImmOperandDisplay def_display; /* Type par défaut d'affichage */ - ImmOperandDisplay display; /* Format général d'affichage */ - unsigned char misc; /* Informations diverses */ +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + + /** + * L'inclusion des informations suivantes dépend de l'architecture. + * + * Si la structure GObject possède un trou, on remplit de préférence + * ce dernier. + */ + + immop_obj_extra extra; /* Externalisation embarquée */ + +#endif }; +/** + * Accès aux informations éventuellement déportées. + */ + +#if __SIZEOF_INT__ == __SIZEOF_LONG__ -#define IMM_GET_DEF_ZERO_PADDING(op) ((op)->misc & (1 << 0)) -#define IMM_SET_DEF_ZERO_PADDING(op, v) (op)->misc = ((op)->misc & ~(1 << 0)) | ((v) ? (1 << 0) : 0) +# define INIT_IMM_OP_EXTRA(op) op->extra.lock = 0 -#define IMM_HAS_ZERO_PADDING(op) ((op)->misc & (1 << 1)) -#define IMM_SET_ZERO_PADDING(op) (op)->misc |= (1 << 1) +# define GET_IMM_OP_EXTRA(op) &op->extra -#define IMM_GET_ZERO_PADDING_VALUE(op) ((op)->misc & (1 << 2)) -#define IMM_SET_ZERO_PADDING_VALUE(op, v) (op)->misc = ((op)->misc & ~(1 << 2)) | ((v) ? (1 << 2) : 0) +#else -#define IMM_HAS_DISPLAY(op) ((op)->misc & (1 << 3)) -#define IMM_SET_DISPLAY(op) (op)->misc |= (1 << 3) +# define INIT_IMM_OP_EXTRA(op) INIT_GOBJECT_EXTRA(G_OBJECT(op)) +# define GET_IMM_OP_EXTRA(op) GET_GOBJECT_EXTRA(G_OBJECT(op), immop_obj_extra) + +#endif /* Définition d'un opérande de valeur numérique (classe) */ struct _GImmOperandClass @@ -107,9 +145,6 @@ static void g_imm_operand_finalize(GImmOperand *); /* Compare un opérande avec un autre. */ static int g_imm_operand_compare(const GImmOperand *, const GImmOperand *); -/* Indique si une valeur est complétée par des zéros. */ -static bool g_imm_operand_does_padding_for_display(const GImmOperand *, ImmOperandDisplay); - /* Construit la chaîne de caractères correspondant à l'opérande. */ static size_t _g_imm_operand_to_string(const GImmOperand *, ImmOperandDisplay, char [IMM_MAX_SIZE]); @@ -243,10 +278,9 @@ static void g_imm_operand_class_init(GImmOperandClass *klass) static void g_imm_operand_init(GImmOperand *operand) { - operand->def_display = IOD_HEX; - operand->misc = 0; + operand->raw = 0; - IMM_SET_DEF_ZERO_PADDING(operand, false); + INIT_IMM_OP_EXTRA(operand); } @@ -346,6 +380,7 @@ static void g_imm_operand_finalize(GImmOperand *operand) GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize size, const GBinContent *content, vmpa2t *addr, bool *low, SourceEndian endian) { GImmOperand *result; /* Opérande à retourner */ + immop_obj_extra *extra; /* Données insérées à modifier */ uint8_t uval8; /* Valeur sur 8 bits */ uint16_t uval16; /* Valeur sur 16 bits */ uint32_t uval32; /* Valeur sur 32 bits */ @@ -357,7 +392,9 @@ GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize size, const GBinConten result = g_object_new(G_TYPE_IMM_OPERAND, NULL); - result->size = size; + extra = GET_IMM_OP_EXTRA(result); + + extra->size = size; switch (size) { @@ -454,6 +491,7 @@ GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize size, const GBinConten GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, uint64_t value) { GImmOperand *result; /* Opérande à retourner */ + immop_obj_extra *extra; /* Données insérées à modifier */ if (size == MDS_UNDEFINED) result = NULL; @@ -462,7 +500,10 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, uint64_t value) { result = g_object_new(G_TYPE_IMM_OPERAND, NULL); - result->size = size; + extra = GET_IMM_OP_EXTRA(result); + + extra->size = size; + result->raw = value; } @@ -488,84 +529,76 @@ GArchOperand *g_imm_operand_new_from_value(MemoryDataSize size, uint64_t value) static int g_imm_operand_compare(const GImmOperand *a, const GImmOperand *b) { int result; /* Bilan à retourner */ + immop_obj_extra *ea; /* Données insérées à modifier */ + immop_obj_extra *eb; /* Données insérées à modifier */ - if (a->size < b->size) + ea = GET_IMM_OP_EXTRA(a); + eb = GET_IMM_OP_EXTRA(b); + + g_bit_lock(&ea->lock, HOLE_LOCK_BIT); + g_bit_lock(&eb->lock, HOLE_LOCK_BIT); + + if (ea->size < eb->size) { result = -1; - goto gioc_done; + goto done; } - else if (a->size > b->size) + else if (ea->size > eb->size) { result = 1; - goto gioc_done; + goto done; } if (a->raw < b->raw) { result = -1; - goto gioc_done; + goto done; } else if (a->raw > b->raw) { result = 1; - goto gioc_done; + goto done; } - if (a->def_display < b->def_display) + if (ea->def_display < eb->def_display) { result = -1; - goto gioc_done; - } - else if (a->def_display > b->def_display) + goto done; + } + else if (ea->def_display > eb->def_display) { result = 1; - goto gioc_done; - } - - if (IMM_HAS_DISPLAY(a) != IMM_HAS_DISPLAY(b)) - { - result = (IMM_HAS_DISPLAY(a) ? 1 : -1); - goto gioc_done; + goto done; } - if (IMM_HAS_DISPLAY(a)) + if (ea->display < eb->display) { - if (a->display < b->display) - { - result = -1; - goto gioc_done; - } - else if (a->display > b->display) - { - result = 1; - goto gioc_done; - } + result = -1; + goto done; } - - if (IMM_GET_DEF_ZERO_PADDING(a) != IMM_GET_DEF_ZERO_PADDING(b)) + else if (ea->display > eb->display) { - result = (IMM_GET_DEF_ZERO_PADDING(a) ? 1 : -1); - goto gioc_done; + result = 1; + goto done; } - if (IMM_HAS_ZERO_PADDING(a) != IMM_HAS_ZERO_PADDING(b)) + if (ea->flags < eb->flags) { - result = (IMM_HAS_ZERO_PADDING(a) ? 1 : -1); - goto gioc_done; + result = -1; + goto done; } - - if (IMM_HAS_ZERO_PADDING(a)) + else if (ea->flags > eb->flags) { - if (IMM_GET_ZERO_PADDING_VALUE(a) != IMM_GET_ZERO_PADDING_VALUE(b)) - { - result = (IMM_GET_ZERO_PADDING_VALUE(a) ? 1 : -1); - goto gioc_done; - } + result = 1; + goto done; } result = 0; - gioc_done: + done: + + g_bit_unlock(&eb->lock, HOLE_LOCK_BIT); + g_bit_unlock(&ea->lock, HOLE_LOCK_BIT); return result; @@ -586,7 +619,18 @@ static int g_imm_operand_compare(const GImmOperand *a, const GImmOperand *b) MemoryDataSize g_imm_operand_get_size(const GImmOperand *operand) { - return operand->size; + MemoryDataSize result; /* Taille à retourner */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = extra->size; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; } @@ -608,6 +652,7 @@ MemoryDataSize g_imm_operand_get_size(const GImmOperand *operand) bool g_imm_operand_get_value(const GImmOperand *operand, MemoryDataSize size, ...) { bool result; /* Bilan à retourner */ + immop_obj_extra *extra; /* Données insérées à consulter*/ va_list ap; /* Liste des compléments */ uint8_t *uval8; /* Valeur sur 8 bits */ uint16_t *uval16; /* Valeur sur 16 bits */ @@ -618,7 +663,12 @@ bool g_imm_operand_get_value(const GImmOperand *operand, MemoryDataSize size, .. int32_t *sval32; /* Valeur sur 32 bits */ int64_t *sval64; /* Valeur sur 64 bits */ - if (operand->size != size) return false; + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + if (extra->size != size) + goto exit; result = true; @@ -668,6 +718,10 @@ bool g_imm_operand_get_value(const GImmOperand *operand, MemoryDataSize size, .. va_end(ap); + exit: + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + return result; } @@ -708,11 +762,20 @@ uint64_t g_imm_operand_get_raw_value(const GImmOperand *operand) void g_imm_operand_set_value(GImmOperand *operand, MemoryDataSize size, uint64_t value) { + immop_obj_extra *extra; /* Données insérées à consulter*/ + assert(size != MDS_UNDEFINED); - operand->size = size; + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + extra->size = size; + operand->raw = value; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + } @@ -731,8 +794,15 @@ void g_imm_operand_set_value(GImmOperand *operand, MemoryDataSize size, uint64_t bool g_imm_operand_get_default_padding(const GImmOperand *operand) { bool result; /* Statut à retourner */ + immop_obj_extra *extra; /* Données insérées à modifier */ - result = IMM_GET_DEF_ZERO_PADDING(operand); + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & IOF_ZERO_PADDING_BY_DEFAULT); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); return result; @@ -754,7 +824,18 @@ bool g_imm_operand_get_default_padding(const GImmOperand *operand) void g_imm_operand_set_default_padding(GImmOperand *operand, bool state) { - IMM_SET_DEF_ZERO_PADDING(operand, state); + immop_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + if (state) + extra->flags |= IOF_ZERO_PADDING_BY_DEFAULT; + else + extra->flags &= ~IOF_ZERO_PADDING_BY_DEFAULT; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); } @@ -774,34 +855,18 @@ void g_imm_operand_set_default_padding(GImmOperand *operand, bool state) void g_imm_operand_pad(GImmOperand *operand, bool state) { - IMM_SET_ZERO_PADDING(operand); - IMM_SET_ZERO_PADDING_VALUE(operand, state); + immop_obj_extra *extra; /* Données insérées à modifier */ -} + extra = GET_IMM_OP_EXTRA(operand); + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); -/****************************************************************************** -* * -* Paramètres : operand = structure dont le contenu est à consulter. * -* * -* Description : Indique si une valeur est complétée par des zéros. * -* * -* Retour : true si des zéro sont ajoutés à l'affichage, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_imm_operand_does_padding(const GImmOperand *operand) -{ - bool result; /* Statut à retourner */ - - if (IMM_HAS_ZERO_PADDING(operand)) - result = IMM_GET_ZERO_PADDING_VALUE(operand); + if (state) + extra->flags |= (IOF_ZERO_PADDING_BY_DEFAULT | IOF_ZERO_PADDING); else - result = IMM_GET_DEF_ZERO_PADDING(operand); + extra->flags &= ~(IOF_ZERO_PADDING_BY_DEFAULT | IOF_ZERO_PADDING); - return result; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); } @@ -809,7 +874,6 @@ bool g_imm_operand_does_padding(const GImmOperand *operand) /****************************************************************************** * * * Paramètres : operand = structure dont le contenu est à consulter. * -* display = type d'affichage à considérer. * * * * Description : Indique si une valeur est complétée par des zéros. * * * @@ -819,20 +883,18 @@ bool g_imm_operand_does_padding(const GImmOperand *operand) * * ******************************************************************************/ -static bool g_imm_operand_does_padding_for_display(const GImmOperand *operand, ImmOperandDisplay display) +bool g_imm_operand_does_padding(const GImmOperand *operand) { bool result; /* Statut à retourner */ + immop_obj_extra *extra; /* Données insérées à modifier */ - result = g_imm_operand_does_padding(operand); + extra = GET_IMM_OP_EXTRA(operand); - if (result) - { - display = g_imm_operand_get_display(operand); + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - if (display != IOD_BIN && display != IOD_HEX) - result = false; + result = (extra->flags & (IOF_ZERO_PADDING_BY_DEFAULT | IOF_ZERO_PADDING)); - } + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); return result; @@ -854,7 +916,15 @@ static bool g_imm_operand_does_padding_for_display(const GImmOperand *operand, I void g_imm_operand_set_default_display(GImmOperand *operand, ImmOperandDisplay display) { - operand->def_display = display; + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + extra->def_display = display; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); } @@ -873,7 +943,18 @@ void g_imm_operand_set_default_display(GImmOperand *operand, ImmOperandDisplay d ImmOperandDisplay g_imm_operand_get_default_display(const GImmOperand *operand) { - return operand->def_display; + ImmOperandDisplay result; /* Affichage à retourner */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = extra->def_display; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; } @@ -893,8 +974,15 @@ ImmOperandDisplay g_imm_operand_get_default_display(const GImmOperand *operand) void g_imm_operand_set_display(GImmOperand *operand, ImmOperandDisplay display) { - IMM_SET_DISPLAY(operand); - operand->display = display; + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + extra->display = display; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); } @@ -914,11 +1002,18 @@ void g_imm_operand_set_display(GImmOperand *operand, ImmOperandDisplay display) ImmOperandDisplay g_imm_operand_get_display(const GImmOperand *operand) { ImmOperandDisplay result; /* Affichage à retourner */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); - if (IMM_HAS_DISPLAY(operand)) - result = operand->display; + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + if (extra->display != IOD_COUNT) + result = extra->display; else - result = operand->def_display; + result = extra->def_display; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); return result; @@ -940,8 +1035,13 @@ ImmOperandDisplay g_imm_operand_get_display(const GImmOperand *operand) bool g_imm_operand_is_negative(const GImmOperand *operand) { bool result; /* Bilan à renvoyer */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); - switch (operand->size) + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + switch (extra->size) { case MDS_4_BITS_SIGNED: case MDS_8_BITS_SIGNED: @@ -959,6 +1059,8 @@ bool g_imm_operand_is_negative(const GImmOperand *operand) break; } + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + return result; } @@ -1000,6 +1102,7 @@ bool g_imm_operand_is_null(const GImmOperand *operand) static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDisplay display, char value[IMM_MAX_SIZE]) { size_t result; /* Longueur à retourner */ + immop_obj_extra *extra; /* Données insérées à consulter*/ unsigned int range; /* Catégorie de la taille */ const char *prefix; /* Entrée en matière */ const char *suffix; /* Sortie de matière */ @@ -1021,7 +1124,11 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDis assert(display <= IOD_LAST_VALID); - range = MDS_RANGE(operand->size); + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + range = MDS_RANGE(extra->size); /* Encadrement pour les caractères */ if (display == IOD_CHAR) @@ -1060,7 +1167,15 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDis /* Drapeau de remplissage ? */ - do_padding = g_imm_operand_does_padding_for_display(operand, display); + do_padding = (extra->flags & (IOF_ZERO_PADDING_BY_DEFAULT | IOF_ZERO_PADDING)); + + if (do_padding) + { + if (extra->display != IOD_COUNT) + do_padding = (extra->display != IOD_BIN && extra->display != IOD_HEX); + else + do_padding = (extra->def_display != IOD_BIN && extra->def_display != IOD_HEX); + } switch (display) { @@ -1086,7 +1201,7 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDis if (display != IOD_BIN) { - if (MDS_IS_SIGNED(operand->size)) + if (MDS_IS_SIGNED(extra->size)) conv = conv_si_defs[display]; else conv = conv_us_defs[display]; @@ -1123,7 +1238,7 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDis snprintf(format, sizeof(format), "%s%s%s%s%s%s%s", prefix, alternate, intro, zpad, lmod, conv, suffix); - switch (operand->size) + switch (extra->size) { case MDS_UNDEFINED: result = snprintf(value, IMM_MAX_SIZE, "<? undef value ?>"); @@ -1176,6 +1291,8 @@ static size_t _g_imm_operand_to_string(const GImmOperand *operand, ImmOperandDis } + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + assert(result > 0); return result; @@ -1340,12 +1457,19 @@ static char *g_imm_operand_build_tooltip(const GImmOperand *operand, const GLoad bool g_imm_operand_to_phys_t(const GImmOperand *operand, phys_t *pos) { bool result; /* Bilan à renvoyer */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - result = !MDS_IS_SIGNED(operand->size); + result = !MDS_IS_SIGNED(extra->size); if (result) *pos = operand->raw; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + return result; } @@ -1367,12 +1491,19 @@ bool g_imm_operand_to_phys_t(const GImmOperand *operand, phys_t *pos) bool g_imm_operand_to_virt_t(const GImmOperand *operand, virt_t *addr) { bool result; /* Bilan à renvoyer */ + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - result = !MDS_IS_SIGNED(operand->size); + result = !MDS_IS_SIGNED(extra->size); if (result) *addr = operand->raw; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + return result; } @@ -1393,8 +1524,16 @@ bool g_imm_operand_to_virt_t(const GImmOperand *operand, virt_t *addr) void g_imm_operand_as_leb128(const GImmOperand *operand, leb128_t *val) { + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + *val = operand->raw; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + } @@ -1413,8 +1552,16 @@ void g_imm_operand_as_leb128(const GImmOperand *operand, leb128_t *val) void g_imm_operand_as_uleb128(const GImmOperand *operand, uleb128_t *val) { + immop_obj_extra *extra; /* Données insérées à consulter*/ + + extra = GET_IMM_OP_EXTRA(operand); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + *val = operand->raw; + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + } @@ -1499,6 +1646,7 @@ static bool g_imm_operand_unserialize(GImmOperand *operand, GAsmStorage *storage { bool result; /* Bilan à retourner */ GArchOperandClass *parent; /* Classe parente à consulter */ + immop_obj_extra *extra; /* Données insérées à modifier */ parent = G_ARCH_OPERAND_CLASS(g_imm_operand_parent_class); @@ -1508,16 +1656,25 @@ static bool g_imm_operand_unserialize(GImmOperand *operand, GAsmStorage *storage result = extract_packed_buffer(pbuf, &operand->raw, sizeof(uint64_t), true); if (result) - result = extract_packed_buffer(pbuf, &operand->size, sizeof(MemoryDataSize), true); + { + extra = GET_IMM_OP_EXTRA(operand); - if (result) - result = extract_packed_buffer(pbuf, &operand->def_display, sizeof(ImmOperandDisplay), true); + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - if (result) - result = extract_packed_buffer(pbuf, &operand->display, sizeof(ImmOperandDisplay), true); + result = extract_packed_buffer(pbuf, &extra->size, sizeof(MemoryDataSize), true); - if (result) - result = extract_packed_buffer(pbuf, &operand->misc, sizeof(uint8_t), false); + if (result) + result = extract_packed_buffer(pbuf, &extra->def_display, sizeof(ImmOperandDisplay), true); + + if (result) + result = extract_packed_buffer(pbuf, &extra->display, sizeof(ImmOperandDisplay), true); + + if (result) + result = extract_packed_buffer(pbuf, &extra->flags, sizeof(uint8_t), false); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + } return result; @@ -1542,6 +1699,7 @@ static bool g_imm_operand_serialize(const GImmOperand *operand, GAsmStorage *sto { bool result; /* Bilan à retourner */ GArchOperandClass *parent; /* Classe parente à consulter */ + immop_obj_extra *extra; /* Données insérées à modifier */ parent = G_ARCH_OPERAND_CLASS(g_imm_operand_parent_class); @@ -1551,16 +1709,25 @@ static bool g_imm_operand_serialize(const GImmOperand *operand, GAsmStorage *sto result = extend_packed_buffer(pbuf, &operand->raw, sizeof(uint64_t), true); if (result) - result = extend_packed_buffer(pbuf, &operand->size, sizeof(MemoryDataSize), true); + { + extra = GET_IMM_OP_EXTRA(operand); - if (result) - result = extend_packed_buffer(pbuf, &operand->def_display, sizeof(ImmOperandDisplay), true); + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - if (result) - result = extend_packed_buffer(pbuf, &operand->display, sizeof(ImmOperandDisplay), true); + result = extend_packed_buffer(pbuf, &extra->size, sizeof(MemoryDataSize), true); - if (result) - result = extend_packed_buffer(pbuf, &operand->misc, sizeof(uint8_t), false); + if (result) + result = extend_packed_buffer(pbuf, &extra->def_display, sizeof(ImmOperandDisplay), true); + + if (result) + result = extend_packed_buffer(pbuf, &extra->display, sizeof(ImmOperandDisplay), true); + + if (result) + result = extend_packed_buffer(pbuf, &extra->flags, sizeof(ImmOpFlag), true); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + } return result; @@ -1757,17 +1924,21 @@ static void g_known_imm_operand_finalize(GKnownImmOperand *operand) GArchOperand *g_known_imm_operand_new(const GImmOperand *old, const char *alt) { GKnownImmOperand *result; /* Remplacement à retourner */ + immop_obj_extra *src; /* Données insérées à consulter*/ + immop_obj_extra *dest; /* Données insérées à modifier */ result = g_object_new(G_TYPE_KNOWN_IMM_OPERAND, NULL); result->parent.raw = old->raw; - result->parent.size = old->size; - result->parent.def_display = old->def_display; - result->parent.display = old->display; - result->parent.misc = old->misc; + src = GET_IMM_OP_EXTRA(old); + dest = GET_IMM_OP_EXTRA(&result->parent); + + g_bit_lock(&src->lock, HOLE_LOCK_BIT); + + *dest = *src; - result->alt_text = strdup(alt); + g_bit_unlock(&src->lock, HOLE_LOCK_BIT); return G_ARCH_OPERAND(result); |