137 lines
3.8 KiB
C++
137 lines
3.8 KiB
C++
/*
|
|
* Interactive disassembler (IDA).
|
|
* Copyright (c) 1990-99 by Ilfak Guilfanov.
|
|
* ALL RIGHTS RESERVED.
|
|
* E-mail: ig@datarescue.com
|
|
*
|
|
* Atmel AVR - 8-bit RISC processor
|
|
*
|
|
*/
|
|
|
|
#ifndef _AVR_HPP
|
|
#define _AVR_HPP
|
|
|
|
#include "../idaidp.hpp"
|
|
#include "ins.hpp"
|
|
#include <diskio.hpp>
|
|
#include <fixup.hpp>
|
|
#include "../iohandler.hpp"
|
|
#include "../../ldr/elf/elfr_avr.h"
|
|
extern int data_id;
|
|
|
|
#define PROCMOD_NAME avr
|
|
#define PROCMOD_NODE_NAME AVR_INFO_NODENAME
|
|
|
|
//---------------------------------
|
|
// Operand types:
|
|
|
|
enum phrase_t ENUM_SIZE(uint16)
|
|
{
|
|
PH_X, // X
|
|
PH_XPLUS, // X+
|
|
PH_MINUSX, // -X
|
|
PH_Y, // Y
|
|
PH_YPLUS, // Y+
|
|
PH_MINUSY, // -Y
|
|
PH_Z, // Z
|
|
PH_ZPLUS, // Z+
|
|
PH_MINUSZ, // -Z
|
|
};
|
|
|
|
|
|
#define reg_pair specflag1 // o_reg: operand is 16bit a register pair (even register is in op.reg)
|
|
#define o_port o_idpspec0 // port number in x.addr
|
|
|
|
//------------------------------------------------------------------
|
|
enum RegNo
|
|
{
|
|
R0, R1, R2, R3, R4, R5, R6, R7,
|
|
R8, R9, R10, R11, R12, R13, R14, R15,
|
|
R16, R17, R18, R19, R20, R21, R22, R23,
|
|
R24, R25, R26, R27, R28, R29, R30, R31,
|
|
rVcs, rVds, // virtual registers for code and data segments
|
|
};
|
|
|
|
//------------------------------------------------------------------
|
|
void idaapi avr_segend(outctx_t &ctx, segment_t *seg);
|
|
void idaapi avr_assumes(outctx_t &ctx); // function to produce assume directives
|
|
|
|
int idaapi is_align_insn(ea_t ea);
|
|
|
|
//------------------------------------------------------------------
|
|
struct avr_iohandler_t : public iohandler_t
|
|
{
|
|
struct avr_t ±
|
|
avr_iohandler_t(avr_t &_pm, netnode &nn) : iohandler_t(nn), pm(_pm) {}
|
|
virtual const char *iocallback(const ioports_t &iop, const char *line) override;
|
|
virtual bool entry_processing(ea_t &, const char * /*word*/, const char * /*cmt*/) override;
|
|
virtual bool check_ioresp() const override;
|
|
};
|
|
|
|
DECLARE_PROC_LISTENER(idb_listener_t, struct avr_t);
|
|
|
|
struct avr_t : public procmod_t
|
|
{
|
|
netnode helper;
|
|
avr_iohandler_t ioh = avr_iohandler_t(*this, helper);
|
|
idb_listener_t idb_listener = idb_listener_t(*this);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// not tested
|
|
fixup_handler_t cfh_avr16 =
|
|
{
|
|
sizeof(fixup_handler_t),
|
|
"AVR16", // Format name, must be unique
|
|
0, // props
|
|
2, 16, 0, 0, // size, width, shift
|
|
REFINFO_CUSTOM, // reftype
|
|
nullptr, // apply, will be inited in processor_t::ev_init
|
|
NULL, // get_value
|
|
NULL, // patch_value
|
|
};
|
|
fixup_type_t cfh_avr16_id = 0;
|
|
int ref_avr16_id = 0;
|
|
|
|
int subarch = 0;
|
|
|
|
// memory configuration
|
|
ea_t ram = BADADDR;
|
|
uint32 ramsize = 0;
|
|
uint32 romsize = 0;
|
|
uint32 eepromsize = 0;
|
|
|
|
bool imageFile = false;
|
|
bool nonBinary = false;
|
|
|
|
bool flow = false;
|
|
|
|
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
|
|
|
|
const ioport_t *find_port(ea_t address);
|
|
const char *find_bit(ea_t address, size_t bit);
|
|
void setup_avr_device(int resp_info);
|
|
const char *set_idp_options(
|
|
const char *keyword,
|
|
int value_type,
|
|
const void *value,
|
|
bool idb_loaded);
|
|
bool set_param_by_arch(void);
|
|
bool is_possible_subarch(int addr) const;
|
|
|
|
void handle_operand(const insn_t &insn, const op_t &x, bool isAlt, bool isload);
|
|
int emu(const insn_t &insn);
|
|
|
|
void avr_header(outctx_t &ctx);
|
|
|
|
inline void opimm(const insn_t &insn, op_t &x, int value) const;
|
|
inline uint32 code_address(const insn_t &insn, signed int delta) const;
|
|
int ana(insn_t *_insn);
|
|
|
|
void avr_segstart(outctx_t &ctx, segment_t *Sarea) const;
|
|
void avr_footer(outctx_t &ctx) const;
|
|
|
|
void load_from_idb();
|
|
};
|
|
|
|
#endif // _AVR_HPP
|