disas/nanomips: Remove NMD class
NMD class has been deleted. The following methods are now declared as static functions: - public NMD::Disassemble method - private NMD::Disassemble method - private NMD::extract_op_code_value helper method Also, the implementation of the print_insn_nanomips function and nanomips_dis function is moved to the end of the nanomips.cpp file, right after the implementation of the Disassemble function. Signed-off-by: Milica Lazarevic <milica.lazarevic@syrmia.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220912122635.74032-10-milica.lazarevic@syrmia.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
a146549034
commit
beebf65bec
|
@ -41,105 +41,6 @@
|
||||||
#define IMGASSERTONCE(test)
|
#define IMGASSERTONCE(test)
|
||||||
|
|
||||||
|
|
||||||
static int nanomips_dis(char *buf,
|
|
||||||
Dis_info *info,
|
|
||||||
unsigned short one,
|
|
||||||
unsigned short two,
|
|
||||||
unsigned short three)
|
|
||||||
{
|
|
||||||
std::string disasm;
|
|
||||||
uint16 bits[3] = {one, two, three};
|
|
||||||
|
|
||||||
TABLE_ENTRY_TYPE type;
|
|
||||||
NMD d;
|
|
||||||
int size = d.Disassemble(bits, disasm, type, info);
|
|
||||||
|
|
||||||
strcpy(buf, disasm.c_str());
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int print_insn_nanomips(bfd_vma memaddr, struct disassemble_info *info)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
bfd_byte buffer[2];
|
|
||||||
uint16_t insn1 = 0, insn2 = 0, insn3 = 0;
|
|
||||||
char buf[200];
|
|
||||||
|
|
||||||
info->bytes_per_chunk = 2;
|
|
||||||
info->display_endian = info->endian;
|
|
||||||
info->insn_info_valid = 1;
|
|
||||||
info->branch_delay_insns = 0;
|
|
||||||
info->data_size = 0;
|
|
||||||
info->insn_type = dis_nonbranch;
|
|
||||||
info->target = 0;
|
|
||||||
info->target2 = 0;
|
|
||||||
|
|
||||||
Dis_info disassm_info;
|
|
||||||
disassm_info.m_pc = memaddr;
|
|
||||||
|
|
||||||
status = (*info->read_memory_func)(memaddr, buffer, 2, info);
|
|
||||||
if (status != 0) {
|
|
||||||
(*info->memory_error_func)(status, memaddr, info);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->endian == BFD_ENDIAN_BIG) {
|
|
||||||
insn1 = bfd_getb16(buffer);
|
|
||||||
} else {
|
|
||||||
insn1 = bfd_getl16(buffer);
|
|
||||||
}
|
|
||||||
(*info->fprintf_func)(info->stream, "%04x ", insn1);
|
|
||||||
|
|
||||||
/* Handle 32-bit opcodes. */
|
|
||||||
if ((insn1 & 0x1000) == 0) {
|
|
||||||
status = (*info->read_memory_func)(memaddr + 2, buffer, 2, info);
|
|
||||||
if (status != 0) {
|
|
||||||
(*info->memory_error_func)(status, memaddr + 2, info);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->endian == BFD_ENDIAN_BIG) {
|
|
||||||
insn2 = bfd_getb16(buffer);
|
|
||||||
} else {
|
|
||||||
insn2 = bfd_getl16(buffer);
|
|
||||||
}
|
|
||||||
(*info->fprintf_func)(info->stream, "%04x ", insn2);
|
|
||||||
} else {
|
|
||||||
(*info->fprintf_func)(info->stream, " ");
|
|
||||||
}
|
|
||||||
/* Handle 48-bit opcodes. */
|
|
||||||
if ((insn1 >> 10) == 0x18) {
|
|
||||||
status = (*info->read_memory_func)(memaddr + 4, buffer, 2, info);
|
|
||||||
if (status != 0) {
|
|
||||||
(*info->memory_error_func)(status, memaddr + 4, info);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->endian == BFD_ENDIAN_BIG) {
|
|
||||||
insn3 = bfd_getb16(buffer);
|
|
||||||
} else {
|
|
||||||
insn3 = bfd_getl16(buffer);
|
|
||||||
}
|
|
||||||
(*info->fprintf_func)(info->stream, "%04x ", insn3);
|
|
||||||
} else {
|
|
||||||
(*info->fprintf_func)(info->stream, " ");
|
|
||||||
}
|
|
||||||
|
|
||||||
int length = nanomips_dis(buf, &disassm_info, insn1, insn2, insn3);
|
|
||||||
|
|
||||||
/* FIXME: Should probably use a hash table on the major opcode here. */
|
|
||||||
|
|
||||||
(*info->fprintf_func) (info->stream, "%s", buf);
|
|
||||||
if (length > 0) {
|
|
||||||
return length / 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->insn_type = dis_noninsn;
|
|
||||||
|
|
||||||
return insn3 ? 6 : insn2 ? 4 : 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::string img_format(const char *format, ...)
|
std::string img_format(const char *format, ...)
|
||||||
{
|
{
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
@ -739,7 +640,7 @@ static std::string ADDRESS(uint64 value, int instruction_size, Dis_info *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64 NMD::extract_op_code_value(const uint16 * data, int size)
|
static uint64 extract_op_code_value(const uint16 *data, int size)
|
||||||
{
|
{
|
||||||
switch (size) {
|
switch (size) {
|
||||||
case 16:
|
case 16:
|
||||||
|
@ -765,7 +666,7 @@ uint64 NMD::extract_op_code_value(const uint16 * data, int size)
|
||||||
* instruction size - negative is error
|
* instruction size - negative is error
|
||||||
* disassembly string - on error will constain error string
|
* disassembly string - on error will constain error string
|
||||||
*/
|
*/
|
||||||
int NMD::Disassemble(const uint16 * data, std::string & dis,
|
static int Disassemble(const uint16 *data, std::string & dis,
|
||||||
TABLE_ENTRY_TYPE & type, const Pool *table,
|
TABLE_ENTRY_TYPE & type, const Pool *table,
|
||||||
int table_size, Dis_info *info)
|
int table_size, Dis_info *info)
|
||||||
{
|
{
|
||||||
|
@ -22348,8 +22249,105 @@ static const Pool MAJOR[2] = {
|
||||||
0x0 }, /* P16 */
|
0x0 }, /* P16 */
|
||||||
};
|
};
|
||||||
|
|
||||||
int NMD::Disassemble(const uint16 *data, std::string & dis,
|
static int Disassemble(const uint16 *data, std::string & dis,
|
||||||
TABLE_ENTRY_TYPE & type, Dis_info *info)
|
TABLE_ENTRY_TYPE & type, Dis_info *info)
|
||||||
{
|
{
|
||||||
return Disassemble(data, dis, type, MAJOR, 2, info);
|
return Disassemble(data, dis, type, MAJOR, 2, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nanomips_dis(char *buf,
|
||||||
|
Dis_info *info,
|
||||||
|
unsigned short one,
|
||||||
|
unsigned short two,
|
||||||
|
unsigned short three)
|
||||||
|
{
|
||||||
|
std::string disasm;
|
||||||
|
uint16 bits[3] = {one, two, three};
|
||||||
|
|
||||||
|
TABLE_ENTRY_TYPE type;
|
||||||
|
int size = Disassemble(bits, disasm, type, info);
|
||||||
|
|
||||||
|
strcpy(buf, disasm.c_str());
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int print_insn_nanomips(bfd_vma memaddr, struct disassemble_info *info)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
bfd_byte buffer[2];
|
||||||
|
uint16_t insn1 = 0, insn2 = 0, insn3 = 0;
|
||||||
|
char buf[200];
|
||||||
|
|
||||||
|
info->bytes_per_chunk = 2;
|
||||||
|
info->display_endian = info->endian;
|
||||||
|
info->insn_info_valid = 1;
|
||||||
|
info->branch_delay_insns = 0;
|
||||||
|
info->data_size = 0;
|
||||||
|
info->insn_type = dis_nonbranch;
|
||||||
|
info->target = 0;
|
||||||
|
info->target2 = 0;
|
||||||
|
|
||||||
|
Dis_info disassm_info;
|
||||||
|
disassm_info.m_pc = memaddr;
|
||||||
|
|
||||||
|
status = (*info->read_memory_func)(memaddr, buffer, 2, info);
|
||||||
|
if (status != 0) {
|
||||||
|
(*info->memory_error_func)(status, memaddr, info);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->endian == BFD_ENDIAN_BIG) {
|
||||||
|
insn1 = bfd_getb16(buffer);
|
||||||
|
} else {
|
||||||
|
insn1 = bfd_getl16(buffer);
|
||||||
|
}
|
||||||
|
(*info->fprintf_func)(info->stream, "%04x ", insn1);
|
||||||
|
|
||||||
|
/* Handle 32-bit opcodes. */
|
||||||
|
if ((insn1 & 0x1000) == 0) {
|
||||||
|
status = (*info->read_memory_func)(memaddr + 2, buffer, 2, info);
|
||||||
|
if (status != 0) {
|
||||||
|
(*info->memory_error_func)(status, memaddr + 2, info);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->endian == BFD_ENDIAN_BIG) {
|
||||||
|
insn2 = bfd_getb16(buffer);
|
||||||
|
} else {
|
||||||
|
insn2 = bfd_getl16(buffer);
|
||||||
|
}
|
||||||
|
(*info->fprintf_func)(info->stream, "%04x ", insn2);
|
||||||
|
} else {
|
||||||
|
(*info->fprintf_func)(info->stream, " ");
|
||||||
|
}
|
||||||
|
/* Handle 48-bit opcodes. */
|
||||||
|
if ((insn1 >> 10) == 0x18) {
|
||||||
|
status = (*info->read_memory_func)(memaddr + 4, buffer, 2, info);
|
||||||
|
if (status != 0) {
|
||||||
|
(*info->memory_error_func)(status, memaddr + 4, info);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->endian == BFD_ENDIAN_BIG) {
|
||||||
|
insn3 = bfd_getb16(buffer);
|
||||||
|
} else {
|
||||||
|
insn3 = bfd_getl16(buffer);
|
||||||
|
}
|
||||||
|
(*info->fprintf_func)(info->stream, "%04x ", insn3);
|
||||||
|
} else {
|
||||||
|
(*info->fprintf_func)(info->stream, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
int length = nanomips_dis(buf, &disassm_info, insn1, insn2, insn3);
|
||||||
|
|
||||||
|
/* FIXME: Should probably use a hash table on the major opcode here. */
|
||||||
|
|
||||||
|
(*info->fprintf_func) (info->stream, "%s", buf);
|
||||||
|
if (length > 0) {
|
||||||
|
return length / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->insn_type = dis_noninsn;
|
||||||
|
|
||||||
|
return insn3 ? 6 : insn2 ? 4 : 2;
|
||||||
|
}
|
||||||
|
|
|
@ -80,19 +80,4 @@ typedef struct Pool {
|
||||||
uint64 attributes;
|
uint64 attributes;
|
||||||
} Pool;
|
} Pool;
|
||||||
|
|
||||||
class NMD
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
int Disassemble(const uint16 *data, std::string & dis,
|
|
||||||
TABLE_ENTRY_TYPE & type, Dis_info *info);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
uint64 extract_op_code_value(const uint16 *data, int size);
|
|
||||||
int Disassemble(const uint16 *data, std::string & dis,
|
|
||||||
TABLE_ENTRY_TYPE & type, const Pool *table, int table_size,
|
|
||||||
Dis_info *info);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue