43 #include "opcode/m68hc11.h" 44 #include "elf/m68hc11.h" 59 #define MSYMBOL_SET_RTC(msym) \ 60 MSYMBOL_TARGET_FLAG_1 (msym) = 1 62 #define MSYMBOL_SET_RTI(msym) \ 63 MSYMBOL_TARGET_FLAG_2 (msym) = 1 65 #define MSYMBOL_IS_RTC(msym) \ 66 MSYMBOL_TARGET_FLAG_1 (msym) 68 #define MSYMBOL_IS_RTI(msym) \ 69 MSYMBOL_TARGET_FLAG_2 (msym) 80 #define HARD_X_REGNUM 0 81 #define HARD_D_REGNUM 1 82 #define HARD_Y_REGNUM 2 83 #define HARD_SP_REGNUM 3 84 #define HARD_PC_REGNUM 4 86 #define HARD_A_REGNUM 5 87 #define HARD_B_REGNUM 6 88 #define HARD_CCR_REGNUM 7 95 #define HARD_PAGE_REGNUM 8 96 #define M68HC11_LAST_HARD_REG (HARD_PAGE_REGNUM) 101 #define SOFT_Z_REGNUM 8 106 #define SOFT_FP_REGNUM 9 107 #define SOFT_TMP_REGNUM 10 108 #define SOFT_ZS_REGNUM 11 109 #define SOFT_XY_REGNUM 12 110 #define SOFT_UNUSED_REGNUM 13 111 #define SOFT_D1_REGNUM 14 112 #define SOFT_D32_REGNUM (SOFT_D1_REGNUM+31) 113 #define M68HC11_MAX_SOFT_REGS 32 115 #define M68HC11_NUM_REGS (M68HC11_LAST_HARD_REG + 1) 116 #define M68HC11_NUM_PSEUDO_REGS (M68HC11_MAX_SOFT_REGS+5) 117 #define M68HC11_ALL_REGS (M68HC11_NUM_REGS+M68HC11_NUM_PSEUDO_REGS) 119 #define M68HC11_REG_SIZE (2) 121 #define M68HC12_NUM_REGS (9) 122 #define M68HC12_NUM_PSEUDO_REGS ((M68HC11_MAX_SOFT_REGS+5)+1-1) 123 #define M68HC12_HARD_PC_REGNUM (SOFT_D32_REGNUM+1) 145 #define STACK_CORRECTION(gdbarch) (gdbarch_tdep (gdbarch)->stack_correction) 146 #define USE_PAGE_REGISTER(gdbarch) (gdbarch_tdep (gdbarch)->use_page_register) 172 "x",
"d",
"y",
"sp",
"pc",
"a",
"b",
173 "ccr",
"page",
"frame",
"tmp",
"zs",
"xy", 0,
174 "d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
175 "d8",
"d9",
"d10",
"d11",
"d12",
"d13",
"d14",
176 "d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
177 "d22",
"d23",
"d24",
"d25",
"d26",
"d27",
"d28",
178 "d29",
"d30",
"d31",
"d32" 189 #define M68HC11_FP_ADDR soft_regs[SOFT_FP_REGNUM].addr 254 warning (
_(
"No frame soft register found in the symbol table.\n" 255 "Stack backtrace will not work."));
292 const int regsize = 4;
298 if (pc >= 0x8000 && pc < 0xc000)
339 const int regsize = 4;
343 memcpy (tmp, buf, regsize);
364 const int regsize = 2;
366 memcpy (tmp, buf, regsize);
402 #undef M6811_OP_PAGE2 403 #define M6811_OP_PAGE2 (0x18) 404 #define M6811_OP_LDX (0xde) 405 #define M6811_OP_LDX_EXT (0xfe) 406 #define M6811_OP_PSHX (0x3c) 407 #define M6811_OP_STS (0x9f) 408 #define M6811_OP_STS_EXT (0xbf) 409 #define M6811_OP_TSX (0x30) 410 #define M6811_OP_XGDX (0x8f) 411 #define M6811_OP_ADDD (0xc3) 412 #define M6811_OP_TXS (0x35) 413 #define M6811_OP_DES (0x34) 416 #define M6812_OP_PAGE2 (0x18) 417 #define M6812_OP_MOVW (0x01) 418 #define M6812_PB_PSHW (0xae) 419 #define M6812_OP_STS (0x5f) 420 #define M6812_OP_STS_EXT (0x7f) 421 #define M6812_OP_LEAS (0x1b) 422 #define M6812_OP_PSHX (0x34) 423 #define M6812_OP_PSHY (0x35) 426 #define OP_DIRECT (0x100) 427 #define OP_IMM_LOW (0x200) 428 #define OP_IMM_HIGH (0x300) 429 #define OP_PBYTE (0x400) 511 for (; seq->
type != P_LAST; seq++)
514 for (j = 0; j < seq->
length; j++)
526 if ((seq->
code[j] & 0xf00) == 0)
530 switch (seq->
code[j])
537 cur_val = cur_val & 0x0ff;
538 cur_val |= (
buffer[j] << 8);
547 if ((
buffer[j] & 0xE0) == 0x80)
553 else if ((
buffer[j] & 0xfe) == 0xf0)
559 else if (
buffer[j] == 0xf2)
611 int found_frame_point;
618 if (pc >= current_pc)
674 found_frame_point = 0;
677 while (!done && pc + 2 < func_end)
689 if (pc + seq->
length > current_pc)
693 if (seq->
type == P_SAVE_REG)
695 if (found_frame_point)
710 else if (seq->
type == P_SET_FRAME)
712 found_frame_point = 1;
715 else if (seq->
type == P_LOCAL_1)
719 else if (seq->
type == P_LOCAL_2)
723 else if (seq->
type == P_LOCAL_N)
727 size -= (int) (val) | 0xffff0000;
732 if (found_frame_point == 0)
752 if (sal.
end && sal.
end < func_end)
778 void **this_prologue_cache)
787 if ((*this_prologue_cache))
791 (*this_prologue_cache) = info;
853 info->
base = this_base;
878 void **this_prologue_cache,
901 static struct value *
903 void **this_prologue_cache,
int regnum)
917 if (
pc >= 0x08000 &&
pc < 0x0c000)
931 pc += ((page & 0x0ff) << 14);
1049 unsigned char l = rval & 0xff;
1052 l & M6811_S_BIT ?
'S' :
'-',
1053 l & M6811_X_BIT ?
'X' :
'-',
1054 l & M6811_H_BIT ?
'H' :
'-',
1055 l & M6811_I_BIT ?
'I' :
'-',
1056 l & M6811_N_BIT ?
'N' :
'-',
1057 l & M6811_Z_BIT ?
'Z' :
'-',
1058 l & M6811_V_BIT ?
'V' :
'-',
1059 l & M6811_C_BIT ?
'C' :
'-');
1060 N = (l & M6811_N_BIT) != 0;
1061 Z = (l & M6811_Z_BIT) != 0;
1062 V = (l & M6811_V_BIT) != 0;
1063 C = (l & M6811_C_BIT) != 0;
1068 else if ((C | Z) == 1)
1083 if ((Z | (N ^ V)) == 0)
1093 struct frame_info *frame,
int regno,
int cpregs)
1153 if (nr && (nr % 8) != 7)
1166 int first_stack_argnum;
1171 first_stack_argnum = 0;
1187 first_stack_argnum = 1;
1198 for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
1235 static struct type *
1272 error (
_(
"return of value > 4 is not supported."));
1289 memcpy (valbuf, buf + 1, 1);
1293 memcpy (valbuf, buf, 2);
1297 memcpy ((
char*) valbuf + 1, buf, 2);
1299 memcpy (valbuf, buf + 1, 1);
1303 memcpy ((
char*) valbuf + 2, buf, 2);
1305 memcpy (valbuf, buf, 2);
1309 error (
_(
"bad size for return value"));
1325 if (readbuf != NULL)
1327 if (writebuf != NULL)
1339 unsigned char flags;
1341 flags = ((elf_symbol_type *)sym)->internal_elf_sym.st_other;
1342 if (
flags & STO_M68HC12_FAR)
1344 if (
flags & STO_M68HC12_INTERRUPT)
1419 if (info.
abfd != NULL
1420 && bfd_get_flavour (info.
abfd) == bfd_target_elf_flavour)
1443 case bfd_arch_m68hc11:
1453 case bfd_arch_m68hc12:
1515 m68hc11_breakpoint::kind_from_pc);
1517 m68hc11_breakpoint::bp_from_kind);
void reggroup_add(struct gdbarch *gdbarch, struct reggroup *group)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
void set_gdbarch_double_bit(struct gdbarch *gdbarch, int double_bit)
static void m68hc11_print_registers_info(struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regno, int cpregs)
static int m68hc11_which_soft_register(CORE_ADDR addr)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
static struct type * m68hc11_register_type(struct gdbarch *gdbarch, int reg_nr)
static const struct frame_base m68hc11_frame_base
void set_gdbarch_float_bit(struct gdbarch *gdbarch, int float_bit)
CORE_ADDR get_frame_pc(struct frame_info *frame)
void set_gdbarch_fp0_regnum(struct gdbarch *gdbarch, int fp0_regnum)
int target_write_memory(CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
struct reggroup * reggroup_new(const char *name, enum reggroup_type type)
struct value * trad_frame_get_prev_register(struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], int regnum)
constexpr gdb_byte m68hc11_break_insn[]
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
int trad_frame_addr_p(struct trad_frame_saved_reg this_saved_regs[], int regnum)
LONGEST value_as_long(struct value *val)
#define BMSYMBOL_VALUE_ADDRESS(symbol)
static void m68hc11_initialize_register_info(void)
void warning(const char *fmt,...)
void trad_frame_set_value(struct trad_frame_saved_reg this_saved_regs[], int regnum, LONGEST val)
#define MSYMBOL_IS_RTC(msym)
static void m68hc11_frame_this_id(struct frame_info *this_frame, void **this_prologue_cache, struct frame_id *this_id)
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
void set_gdbarch_short_bit(struct gdbarch *gdbarch, int short_bit)
const struct builtin_type * builtin_type(struct gdbarch *gdbarch)
void * memset(T *s, int c, size_t n)=delete
static void m68hc11_init_reggroups(void)
struct type * builtin_uint8
struct type * builtin_uint16
void set_gdbarch_register_reggroup_p(struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype register_reggroup_p)
void value_free(struct value *val)
static struct gdbarch * m68hc11_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
struct gdbarch_list * next
struct reggroup *const restore_reggroup
#define MSYMBOL_SET_RTI(msym)
int gdbarch_num_regs(struct gdbarch *gdbarch)
struct trad_frame_saved_reg * saved_regs
struct reggroup *const all_reggroup
static CORE_ADDR m68hc11_push_dummy_call(struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr)
const struct bfd_arch_info * bfd_arch_info
static CORE_ADDR m68hc11_unwind_pc(struct gdbarch *gdbarch, struct frame_info *next_frame)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
#define M68HC11_NUM_PSEUDO_REGS
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
void set_gdbarch_print_registers_info(struct gdbarch *gdbarch, gdbarch_print_registers_info_ftype print_registers_info)
void set_gdbarch_elf_make_msymbol_special(struct gdbarch *gdbarch, gdbarch_elf_make_msymbol_special_ftype elf_make_msymbol_special)
static void m68hc11_pseudo_register_write(struct gdbarch *gdbarch, struct regcache *regcache, int regno, const gdb_byte *buf)
unsigned short code[MAX_CODES]
#define FRAME_OBSTACK_ZALLOC(TYPE)
static enum insn_return_kind m68hc11_get_return_insn(CORE_ADDR pc)
#define M68HC12_HARD_PC_REGNUM
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
#define M68HC11_LAST_HARD_REG
int gdbarch_num_pseudo_regs(struct gdbarch *gdbarch)
#define STACK_CORRECTION(gdbarch)
void set_gdbarch_addr_bit(struct gdbarch *gdbarch, int addr_bit)
struct reggroup *const float_reggroup
void frame_base_set_default(struct gdbarch *gdbarch, const struct frame_base *default_base)
void set_gdbarch_pseudo_register_write(struct gdbarch *gdbarch, gdbarch_pseudo_register_write_ftype pseudo_register_write)
static const char * m68hc11_register_names[]
void set_gdbarch_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype register_type)
const gdb_byte * value_contents(struct value *value)
struct reggroup *const general_reggroup
static struct insn_sequence m6812_prologue[]
struct symtab_and_line find_pc_line(CORE_ADDR pc, int notcurrent)
static struct value * m68hc11_frame_prev_register(struct frame_info *this_frame, void **this_prologue_cache, int regnum)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
struct reggroup *const system_reggroup
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
static struct reggroup * m68hc11_hard_reggroup
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
#define M68HC11_MAX_SOFT_REGS
static CORE_ADDR m68hc11_scan_prologue(struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR current_pc, struct m68hc11_unwind_cache *info)
void set_gdbarch_believe_pcc_promotion(struct gdbarch *gdbarch, int believe_pcc_promotion)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
static void m68hc11_get_register_info(struct m68hc11_soft_reg *reg, const char *name)
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
LONGEST get_frame_register_signed(struct frame_info *frame, int regnum)
static void m68hc11_add_reggroups(struct gdbarch *gdbarch)
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype unwind_pc)
struct type * builtin_uint32
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
enum insn_return_kind return_kind
static struct m68hc11_unwind_cache * m68hc11_frame_unwind_cache(struct frame_info *this_frame, void **this_prologue_cache)
static const struct frame_unwind m68hc11_frame_unwind
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
static CORE_ADDR m68hc11_frame_args_address(struct frame_info *this_frame, void **this_cache)
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
#define USE_PAGE_REGISTER(gdbarch)
void _initialize_m68hc11_tdep(void)
static struct insn_sequence m6811_prologue[]
struct reggroup *const vector_reggroup
#define MSYMBOL_IS_RTI(msym)
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
void set_gdbarch_breakpoint_kind_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_pc_ftype breakpoint_kind_from_pc)
struct trad_frame_saved_reg * trad_frame_alloc_saved_regs(struct gdbarch *gdbarch)
struct insn_sequence * prologue
void set_gdbarch_long_long_bit(struct gdbarch *gdbarch, int long_long_bit)
const struct floatformat * floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]
void regcache_raw_write_part(struct regcache *regcache, int regnum, int offset, int len, const gdb_byte *buf)
static enum return_value_convention m68hc11_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
static CORE_ADDR m68hc11_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
#define MSYMBOL_SET_RTC(msym)
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype pseudo_register_read)
void set_gdbarch_char_signed(struct gdbarch *gdbarch, int char_signed)
void print_longest(struct ui_file *stream, int format, int use_c_format, LONGEST val_long)
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
#define M68HC12_NUM_PSEUDO_REGS
int xsnprintf(char *str, size_t size, const char *format,...)
static void m68hc11_extract_return_value(struct type *type, struct regcache *regcache, void *valbuf)
#define TYPE_CODE(thistype)
enum register_status regcache_raw_read(struct regcache *regcache, int regnum, gdb_byte *buf)
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
static CORE_ADDR m68hc11_unwind_sp(struct gdbarch *gdbarch, struct frame_info *next_frame)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
static struct insn_sequence * m68hc11_analyze_instruction(struct gdbarch *gdbarch, struct insn_sequence *seq, CORE_ADDR pc, CORE_ADDR *val)
void set_gdbarch_int_bit(struct gdbarch *gdbarch, int int_bit)
typedef BP_MANIPULATION(m68hc11_break_insn)
static struct reggroup * m68hc11_soft_reggroup
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
static void m68hc11_print_register(struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regno)
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
static void m68hc11_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
static struct frame_id m68hc11_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
void set_gdbarch_double_format(struct gdbarch *gdbarch, const struct floatformat **double_format)
unsigned long long ULONGEST
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
static CORE_ADDR m68hc11_frame_base_address(struct frame_info *this_frame, void **this_cache)
void release_value(struct value *val)
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
struct type * value_type(const struct value *value)
void set_gdbarch_long_bit(struct gdbarch *gdbarch, int long_bit)
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
int gdbarch_pc_regnum(struct gdbarch *gdbarch)
int default_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
struct reggroup *const save_reggroup
#define TYPE_LENGTH(thistype)
void set_gdbarch_ptr_bit(struct gdbarch *gdbarch, int ptr_bit)
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype sw_breakpoint_from_kind)
static int m68hc11_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
void register_gdbarch_init(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init)
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
static struct m68hc11_soft_reg soft_regs[M68HC11_ALL_REGS]
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype register_name)
CORE_ADDR get_frame_func(struct frame_info *this_frame)
void error(const char *fmt,...)
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, struct gdbarch_tdep *tdep)
static enum register_status m68hc11_pseudo_register_read(struct gdbarch *gdbarch, struct regcache *regcache, int regno, gdb_byte *buf)
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
static const char * m68hc11_register_name(struct gdbarch *gdbarch, int reg_nr)
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
static void m68hc11_store_return_value(struct type *type, struct regcache *regcache, const gdb_byte *valbuf)
static int soft_reg_initialized
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)