2024-09-07 18:00:09 +06:00
|
|
|
#include "disasm.h"
|
|
|
|
|
2024-09-09 03:10:53 +06:00
|
|
|
thread_local ppc::DisassemblerEngine ppc::gBigEndianDisassembler{ BFD_ENDIAN_BIG, "cell 64"};
|
2024-09-07 18:00:09 +06:00
|
|
|
|
2024-09-08 21:39:04 +06:00
|
|
|
ppc::DisassemblerEngine::DisassemblerEngine(bfd_endian endian, const char* options)
|
2024-09-07 18:00:09 +06:00
|
|
|
{
|
2024-09-08 21:39:04 +06:00
|
|
|
INIT_DISASSEMBLE_INFO(info, stdout, fprintf);
|
|
|
|
info.arch = bfd_arch_powerpc;
|
|
|
|
info.endian = endian;
|
|
|
|
info.disassembler_options = options;
|
2024-09-07 18:00:09 +06:00
|
|
|
}
|
|
|
|
|
2024-09-08 21:39:04 +06:00
|
|
|
int ppc::DisassemblerEngine::Disassemble(const void* code, size_t size, uint64_t base, ppc_insn& out)
|
2024-09-07 18:00:09 +06:00
|
|
|
{
|
2024-09-08 21:39:04 +06:00
|
|
|
if (size < 4)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2024-09-07 18:00:09 +06:00
|
|
|
|
2024-09-08 21:39:04 +06:00
|
|
|
info.buffer = (bfd_byte*)code;
|
|
|
|
info.buffer_vma = base;
|
|
|
|
info.buffer_length = size;
|
|
|
|
return decode_insn_ppc(base, &info, &out);
|
2024-09-07 18:00:09 +06:00
|
|
|
}
|
2024-09-18 13:07:07 +06:00
|
|
|
|
|
|
|
int ppc::Disassemble(const void* code, uint64_t base, ppc_insn* out, size_t nOut)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < nOut; i++)
|
|
|
|
{
|
|
|
|
Disassemble(static_cast<const uint32_t*>(code) + i, base, out[i]);
|
|
|
|
}
|
|
|
|
return static_cast<int>(nOut) * 4;
|
|
|
|
}
|