diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/archbase.h | 3 | ||||
-rw-r--r-- | src/arch/raw.c | 48 |
2 files changed, 41 insertions, 10 deletions
diff --git a/src/arch/archbase.h b/src/arch/archbase.h index 824bebc..634efc3 100644 --- a/src/arch/archbase.h +++ b/src/arch/archbase.h @@ -71,7 +71,8 @@ typedef enum _MemoryDataSize #define MDS_RANGE(mds) ((mds & 0xf) - 1) -#define MDS_IS_SIGNED(mds) (mds & 0x80) +#define MDS_SIGN 0x80 +#define MDS_IS_SIGNED(mds) (mds & MDS_SIGN) #define MDS_FROM_BYTES(sz) \ diff --git a/src/arch/raw.c b/src/arch/raw.c index b84d9f7..da9ee88 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -267,17 +267,32 @@ GArchInstruction *g_raw_instruction_new_uleb128(const GBinContent *content, vmpa GArchInstruction *result; /* Instruction à retourner */ vmpa2t start; /* Départ original de lecture */ uleb128_t value; /* Valeur uleb128 à représenter*/ + phys_t diff; /* Couverture de la lecture */ MemoryDataSize leb_size; /* Taille de la valeur */ + GImmOperand *operand; /* Octet non décodé à afficher */ + mrange_t range; /* Couverture de l'instruction */ copy_vmpa(&start, addr); if (!g_binary_content_read_uleb128(content, addr, &value)) goto grinu_error; - leb_size = MDS_FROM_BYTES(compute_vmpa_diff(&start, addr)); + diff = compute_vmpa_diff(&start, addr); + + leb_size = MDS_FROM_BYTES(diff); assert(leb_size != MDS_UNDEFINED); - result = g_raw_instruction_new_from_value(&start, leb_size, (uint64_t)value); + result = g_object_new(G_TYPE_RAW_INSTRUCTION, NULL); + + init_mrange(&range, &start, diff); + g_arch_instruction_set_range(result, &range); + + operand = G_IMM_OPERAND(g_imm_operand_new_from_value(leb_size, (uint64_t)value)); + if (operand == NULL) goto grinu_error; + + g_imm_operand_pad(&operand, true, NULL); + + g_arch_instruction_attach_extra_operand(result, G_ARCH_OPERAND(operand)); return result; @@ -305,22 +320,37 @@ GArchInstruction *g_raw_instruction_new_sleb128(const GBinContent *content, vmpa { GArchInstruction *result; /* Instruction à retourner */ vmpa2t start; /* Départ original de lecture */ - leb128_t value; /* Valeur sleb128 à représenter*/ + uleb128_t value; /* Valeur uleb128 à représenter*/ + phys_t diff; /* Couverture de la lecture */ MemoryDataSize leb_size; /* Taille de la valeur */ + GImmOperand *operand; /* Octet non décodé à afficher */ + mrange_t range; /* Couverture de l'instruction */ copy_vmpa(&start, addr); - if (!g_binary_content_read_leb128(content, addr, &value)) - goto grinu_error; + if (!g_binary_content_read_uleb128(content, addr, &value)) + goto grins_error; - leb_size = MDS_FROM_BYTES(compute_vmpa_diff(&start, addr)); - assert(leb_size != MDS_UNDEFINED); + diff = compute_vmpa_diff(&start, addr); + + leb_size = MDS_FROM_BYTES(diff) | MDS_SIGN; + assert(leb_size != MDS_SIGN); - result = g_raw_instruction_new_from_value(&start, leb_size, (uint64_t)value); + result = g_object_new(G_TYPE_RAW_INSTRUCTION, NULL); + + init_mrange(&range, &start, diff); + g_arch_instruction_set_range(result, &range); + + operand = G_IMM_OPERAND(g_imm_operand_new_from_value(leb_size, (uint64_t)value)); + if (operand == NULL) goto grins_error; + + g_imm_operand_pad(&operand, true, NULL); + + g_arch_instruction_attach_extra_operand(result, G_ARCH_OPERAND(operand)); return result; - grinu_error: + grins_error: return NULL; |