summaryrefslogtreecommitdiff
path: root/src/arch/operands/immediate.h
blob: e6fab96fdb0d68daa4be9bd9d3ea15a944329ff7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

/* Chrysalide - Outil d'analyse de fichiers binaires
 * immediate.h - prototypes pour les opérandes représentant des valeurs numériques
 *
 * Copyright (C) 2020 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _ARCH_OPERANDS_IMMEDIATE_H
#define _ARCH_OPERANDS_IMMEDIATE_H


#include <glib-object.h>
#include <stdbool.h>
#include <stdint.h>


#include "../archbase.h"
#include "../operand.h"
#include "../../analysis/content.h"



/* ------------------------- OPERANDE POUR VALEUR IMMEDIATE ------------------------- */


/* Grande ligne d'un format d'affichage */
typedef enum _ImmOperandDisplay
{
    IOD_BIN,                                /* Impression en binaire       */
    IOD_OCT,                                /* Impression en octal         */
    IOD_DEC,                                /* Impression en décimal       */
    IOD_HEX,                                /* Impression en hexadécimal   */
    IOD_CHAR,                               /* Impression en base 26       */

    IOD_COUNT

} ImmOperandDisplay;


#define IOD_LAST_VALID IOD_CHAR


#define G_TYPE_IMM_OPERAND            g_imm_operand_get_type()
#define G_IMM_OPERAND(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_IMM_OPERAND, GImmOperand))
#define G_IS_IMM_OPERAND(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_IMM_OPERAND))
#define G_IMM_OPERAND_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_IMM_OPERAND, GImmOperandClass))
#define G_IS_IMM_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_IMM_OPERAND))
#define G_IMM_OPERAND_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_IMM_OPERAND, GImmOperandClass))


/* Définition d'un opérande de valeur numérique (instance) */
typedef struct _GImmOperand GImmOperand;

/* Définition d'un opérande de valeur numérique (classe) */
typedef struct _GImmOperandClass GImmOperandClass;


/* Indique le type défini pour un opérande d'architecture. */
GType g_imm_operand_get_type(void);

/* Crée un opérande réprésentant une valeur numérique. */
GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize, const GBinContent *, vmpa2t *, bool *, SourceEndian);

#define g_imm_operand_new_from_data(size, content, addr, endian) \
    _g_imm_operand_new_from_data(size, content, addr, NULL, endian)

/* Crée un opérande réprésentant une valeur numérique. */
GArchOperand *g_imm_operand_new_from_value(MemoryDataSize, uint64_t);

/* Renseigne la taille de la valeur indiquée à la construction. */
MemoryDataSize g_imm_operand_get_size(const GImmOperand *);

/* Fournit la valeur portée par une opérande numérique. */
bool g_imm_operand_get_value(const GImmOperand *, MemoryDataSize, ...);

/* Fournit la valeur brute représentée par l'opérande. */
uint64_t g_imm_operand_get_raw_value(const GImmOperand *);

/* Définit la nouvelle valeur de l'opérande à une valeur. */
void g_imm_operand_set_value(GImmOperand *, MemoryDataSize, uint64_t);

/* Indique si une valeur est complétée par des zéros par défaut. */
bool g_imm_operand_get_default_padding(const GImmOperand *);

/* Précise si des zéro doivent compléter l'affichage ou non. */
void g_imm_operand_set_default_padding(GImmOperand *, bool);

/* Précise si des zéro doivent compléter l'affichage ou non. */
void g_imm_operand_pad(GImmOperand *, bool);

/* Indique si une valeur est complétée par des zéros. */
bool g_imm_operand_does_padding(const GImmOperand *);

/* Définit le format textuel par défaut de la valeur. */
void g_imm_operand_set_default_display(GImmOperand *, ImmOperandDisplay);

/* Indique le format textuel par défaut de la valeur. */
ImmOperandDisplay g_imm_operand_get_default_display(const GImmOperand *);

/* Définit la grande ligne du format textuel de la valeur. */
void g_imm_operand_set_display(GImmOperand *, ImmOperandDisplay);

/* Indique la grande ligne du format textuel de la valeur. */
ImmOperandDisplay g_imm_operand_get_display(const GImmOperand *);

/* Indique le signe d'une valeur immédiate. */
bool g_imm_operand_is_negative(const GImmOperand *);

/* Indique si une valeur immédiate est nulle ou non. */
bool g_imm_operand_is_null(const GImmOperand *);

/**
 * La taille d'impression d'un opérande n'est pas VMPA_MAX_SIZE,
 * mais 1 + 64 caractères + octet nul final en cas d'impression en binaire.
 */
#define IMM_MAX_SIZE 66

/* Construit la chaîne de caractères correspondant à l'opérande. */
size_t g_imm_operand_to_string(const GImmOperand *, char [IMM_MAX_SIZE]);

/* Convertit une valeur immédiate en position de type phys_t. */
bool g_imm_operand_to_phys_t(const GImmOperand *, phys_t *);

/* Convertit une valeur immédiate en adresse de type virt_t. */
bool g_imm_operand_to_virt_t(const GImmOperand *, virt_t *);

/* Convertit une valeur immédiate en valeur de type leb128_t. */
void g_imm_operand_as_leb128(const GImmOperand *, leb128_t *);

/* Convertit une valeur immédiate en valeur de type uleb128_t. */
void g_imm_operand_as_uleb128(const GImmOperand *, uleb128_t *);



/* ----------------------- REMPLACEMENT DE VALEURS IMMEDIATES ----------------------- */


#define G_TYPE_KNOWN_IMM_OPERAND            g_known_imm_operand_get_type()
#define G_KNOWN_IMM_OPERAND(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_KNOWN_IMM_OPERAND, GKnownImmOperand))
#define G_IS_KNOWN_IMM_OPERAND(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_KNOWN_IMM_OPERAND))
#define G_KNOWN_IMM_OPERAND_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_KNOWN_IMM_OPERAND, GKnownImmOperandClass))
#define G_IS_KNOWN_IMM_OPERAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_KNOWN_IMM_OPERAND))
#define G_KNOWN_IMM_OPERAND_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_KNOWN_IMM_OPERAND, GKnownImmOperandClass))


/* Définition d'un remplacement d'opérande de valeur numérique (instance) */
typedef struct _GKnownImmOperand GKnownImmOperand;

/* Définition d'un remplacement d'opérande de valeur numérique (classe) */
typedef struct _GKnownImmOperandClass GKnownImmOperandClass;


/* Indique le type défini pour un remplacemet d'opérande de valeur numérique. */
GType g_known_imm_operand_get_type(void);

/* Crée un opérande remplaçant visuellement une valeur. */
GArchOperand *g_known_imm_operand_new(const GImmOperand *, const char *);



#endif  /* _ARCH_OPERANDS_IMMEDIATE_H */