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 (8)
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
207 reg->
name = xstrdup (name);
211 soft_min_addr = reg->
addr;
213 soft_max_addr = reg->
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);
393 static const unsigned char *
399 *lenptr =
sizeof (breakpoint);
409 #undef M6811_OP_PAGE2
410 #define M6811_OP_PAGE2 (0x18)
411 #define M6811_OP_LDX (0xde)
412 #define M6811_OP_LDX_EXT (0xfe)
413 #define M6811_OP_PSHX (0x3c)
414 #define M6811_OP_STS (0x9f)
415 #define M6811_OP_STS_EXT (0xbf)
416 #define M6811_OP_TSX (0x30)
417 #define M6811_OP_XGDX (0x8f)
418 #define M6811_OP_ADDD (0xc3)
419 #define M6811_OP_TXS (0x35)
420 #define M6811_OP_DES (0x34)
423 #define M6812_OP_PAGE2 (0x18)
424 #define M6812_OP_MOVW (0x01)
425 #define M6812_PB_PSHW (0xae)
426 #define M6812_OP_STS (0x5f)
427 #define M6812_OP_STS_EXT (0x7f)
428 #define M6812_OP_LEAS (0x1b)
429 #define M6812_OP_PSHX (0x34)
430 #define M6812_OP_PSHY (0x35)
433 #define OP_DIRECT (0x100)
434 #define OP_IMM_LOW (0x200)
435 #define OP_IMM_HIGH (0x300)
436 #define OP_PBYTE (0x400)
521 for (j = 0; j < seq->
length; j++)
530 if (seq->
code[j] == buffer[j])
533 if ((seq->
code[j] & 0xf00) == 0)
537 switch (seq->
code[j])
544 cur_val = cur_val & 0x0ff;
545 cur_val |= (buffer[j] << 8);
550 cur_val |= buffer[j];
554 if ((buffer[j] & 0xE0) == 0x80)
556 v = buffer[j] & 0x1f;
560 else if ((buffer[j] & 0xfe) == 0xf0)
566 else if (buffer[j] == 0xf2)
618 int found_frame_point;
625 if (pc >= current_pc)
681 found_frame_point = 0;
684 while (!done && pc + 2 < func_end)
696 if (pc + seq->
length > current_pc)
702 if (found_frame_point)
719 found_frame_point = 1;
734 size -= (
int) (val) | 0xffff0000;
739 if (found_frame_point == 0)
759 if (sal.
end && sal.
end < func_end)
785 void **this_prologue_cache)
794 if ((*this_prologue_cache))
795 return (*this_prologue_cache);
798 (*this_prologue_cache) = info;
826 prev_sp = this_base + info->
sp_offset + 2;
833 prev_sp = this_base + info->
size + 2;
860 info->
base = this_base;
885 void **this_prologue_cache,
908 static struct value *
910 void **this_prologue_cache,
int regnum)
924 if (pc >= 0x08000 && pc < 0x0c000)
938 pc += ((page & 0x0ff) << 14);
1056 unsigned char l = rval & 0xff;
1059 l & M6811_S_BIT ?
'S' :
'-',
1060 l & M6811_X_BIT ?
'X' :
'-',
1061 l & M6811_H_BIT ?
'H' :
'-',
1062 l & M6811_I_BIT ?
'I' :
'-',
1063 l & M6811_N_BIT ?
'N' :
'-',
1064 l & M6811_Z_BIT ?
'Z' :
'-',
1065 l & M6811_V_BIT ?
'V' :
'-',
1066 l & M6811_C_BIT ?
'C' :
'-');
1067 N = (l & M6811_N_BIT) != 0;
1068 Z = (l & M6811_Z_BIT) != 0;
1069 V = (l & M6811_V_BIT) != 0;
1070 C = (l & M6811_C_BIT) != 0;
1075 else if ((C | Z) == 1)
1090 if ((Z | (N ^ V)) == 0)
1100 struct frame_info *frame,
int regno,
int cpregs)
1106 if (!name || !*name)
1160 if (nr && (nr % 8) != 7)
1173 int first_stack_argnum;
1178 first_stack_argnum = 0;
1194 first_stack_argnum = 1;
1205 for (argnum = nargs - 1; argnum >= first_stack_argnum; argnum--)
1242 static struct type *
1279 error (
_(
"return of value > 4 is not supported."));
1296 memcpy (valbuf, buf + 1, 1);
1300 memcpy (valbuf, buf, 2);
1304 memcpy ((
char*) valbuf + 1, buf, 2);
1306 memcpy (valbuf, buf + 1, 1);
1310 memcpy ((
char*) valbuf + 2, buf, 2);
1312 memcpy (valbuf, buf, 2);
1316 error (
_(
"bad size for return value"));
1332 if (readbuf != NULL)
1334 if (writebuf != NULL)
1346 unsigned char flags;
1348 flags = ((elf_symbol_type *)sym)->internal_elf_sym.st_other;
1349 if (flags & STO_M68HC12_FAR)
1351 if (flags & STO_M68HC12_INTERRUPT)
1358 if (info->arch == bfd_arch_m68hc11)
1359 return print_insn_m68hc11 (memaddr, info);
1361 return print_insn_m68hc12 (memaddr, info);
1410 if (group == m68hc11_soft_reggroup)
1416 if (group == m68hc11_hard_reggroup)
1425 static struct gdbarch *
1429 struct gdbarch *gdbarch;
1436 if (info.
abfd != NULL
1437 && bfd_get_flavour (info.
abfd) == bfd_target_elf_flavour)
1438 elf_flags = elf_elfheader (info.
abfd)->e_flags;
1460 case bfd_arch_m68hc11:
1470 case bfd_arch_m68hc12:
1476 elf_flags & E_M68HC12_BANKS
1496 if (elf_flags & E_M68HC11_F64)
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)
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
static int m68hc11_which_soft_register(CORE_ADDR addr)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
static char * m68hc11_register_names[]
static struct type * m68hc11_register_type(struct gdbarch *gdbarch, int reg_nr)
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)
#define MSYMBOL_SET_RTC(msym)
struct value * trad_frame_get_prev_register(struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], int regnum)
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)
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)
initialize_file_ftype _initialize_m68hc11_tdep
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
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)
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
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)
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[]
void initialize_file_ftype(void)
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,...)
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
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t int status
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)
void set_gdbarch_breakpoint_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_from_pc_ftype breakpoint_from_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)
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)
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)
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)
struct trad_frame_saved_reg * trad_frame_alloc_saved_regs(struct frame_info *this_frame)
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)
const char const char int
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
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)
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)
static int gdb_print_insn_m68hc11(bfd_vma memaddr, disassemble_info *info)
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
static void m68hc11_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
static const unsigned char * m68hc11_breakpoint_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
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)
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)
#define MSYMBOL_SET_RTI(msym)
void set_gdbarch_print_insn(struct gdbarch *gdbarch, gdbarch_print_insn_ftype print_insn)
static int soft_reg_initialized
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
const ULONGEST const LONGEST len