31 #include "gdb/sim-frv.h"
32 #include "opcodes/frv-desc.h"
113 if (interp_addr != NULL)
120 if (exec_addr != NULL)
140 memset (var, 0,
sizeof (*var));
235 xsnprintf (buf,
sizeof (buf),
"gr%d", r);
254 xsnprintf (buf,
sizeof (buf),
"fr%d", r);
265 = xstrdup (
"loadmap_interp");
324 memset (buffer, 0, 4);
328 buffer[0] = buf[byte_num];
356 buf[byte_num] = ((bfd_byte *) buffer)[0];
364 static const int spr_map[] =
413 return SIM_FRV_PC_REGNUM;
419 if (spr_reg_offset < 0)
422 return SIM_FRV_SPR0_REGNUM + spr_reg_offset;
428 static const unsigned char *
431 static unsigned char breakpoint[] = {0xc0, 0x70, 0x00, 0x01};
432 *lenp =
sizeof (breakpoint);
456 while (count-- > 0 && addr >= func_start)
487 return ((4 <= reg && reg <= 7)
488 || (14 <= reg && reg <= 15)
489 || (32 <= reg && reg <= 47));
497 return ((16 <= reg && reg <= 31)
498 || (48 <= reg && reg <= 63));
506 return (8 <= reg && reg <= 13);
552 int lr_saved_on_stack = 0;
556 int lr_save_reg = -1;
560 int lr_sp_offset = 0;
566 int gr_sp_offset[64];
577 memset (gr_saved, 0,
sizeof (gr_saved));
579 last_prologue_pc = pc;
597 if (frame_pc < lim_pc)
647 if ((op & 0x01d80000) == 0x00180000
648 || (op & 0x01f80000) == 0x00300000
649 || (op & 0x01f80000) == 0x00100000
650 || (op & 0x01f80000) == 0x00700000)
662 else if ((op & 0x7ffc0fc0) == 0x04080100
663 || (op & 0x7ffc0000) == 0x04c80000)
674 else if ((op & 0x7fffffff) == 0x04881000)
678 last_prologue_pc = next_pc;
687 else if ((op & 0x7fffffc0) == 0x080d01c0)
689 int gr_j = op & 0x3f;
695 last_prologue_pc = next_pc;
712 else if ((op & 0x01ffffff) == 0x000c10c0
713 || (op & 0x01ffffff) == 0x000c1100)
715 int gr_k = ((op >> 25) & 0x3f);
716 int ope = ((op >> 6) & 0x3f);
729 for (i = 0; i < count; i++)
731 gr_saved[gr_k + i] = 1;
732 gr_sp_offset[gr_k + i] = 4 * i;
734 last_prologue_pc = next_pc;
744 else if ((op & 0x7ffff000) == 0x02401000)
750 int s = (((op & 0xfff) - 0x800) & 0xfff) - 0x800;
753 last_prologue_pc = pc;
770 else if ((op & 0x7ffff000) == 0x04401000)
774 int s = (((op & 0xfff) - 0x800) & 0xfff) - 0x800;
777 last_prologue_pc = pc;
792 else if ((op & 0x01fc0fff) == 0x00880000)
794 int gr_i = ((op >> 12) & 0x3f);
799 last_prologue_pc = next_pc;
814 else if ( (op & 0x01fff000) == 0x01442000
815 || (op & 0x01fff000) == 0x01402000)
817 int gr_k = ((op >> 25) & 0x3f);
822 last_prologue_pc = next_pc;
838 else if ((op & 0x01fff000) == 0x014c1000
839 || (op & 0x01fff000) == 0x01501000)
841 int gr_k = ((op >> 25) & 0x3f);
846 if ((op & 0x01fff000) == 0x014c1000)
856 int s = (((op & 0xfff) - 0x800) & 0xfff) - 0x800;
858 for (i = 0; i < count; i++)
860 gr_saved[gr_k + i] = 1;
861 gr_sp_offset[gr_k + i] = s + (4 * i);
863 last_prologue_pc = next_pc;
881 else if (((op & 0x01fc0fff) == 0x000c0080)
882 || ((op & 0x01fc0000) == 0x01480000))
884 int gr_k = ((op >> 25) & 0x3f);
885 int gr_i = ((op >> 12) & 0x3f);
890 if ((op & 0x01fc0fff) == 0x000c0080)
893 offset = (((op & 0xfff) - 0x800) & 0xfff) - 0x800;
907 last_prologue_pc = next_pc;
917 gr_sp_offset[gr_k] =
offset;
919 gr_sp_offset[gr_k] = offset + fp_offset;
920 last_prologue_pc = next_pc;
924 else if (lr_save_reg != -1
925 && gr_k == lr_save_reg)
927 lr_saved_on_stack = 1;
931 lr_sp_offset = offset + fp_offset;
932 last_prologue_pc = next_pc;
937 last_prologue_pc = next_pc;
942 if (this_frame && info)
957 for (i = 0; i < 64; i++)
959 info->
saved_regs[i].
addr = this_base - fp_offset + gr_sp_offset[i];
961 info->
prev_sp = this_base - fp_offset + framesize;
962 info->
base = this_base;
965 if (lr_saved_on_stack)
967 = this_base - fp_offset + lr_sp_offset;
979 return last_prologue_pc;
999 if (sal.line != 0 && sal.end < func_end)
1008 if (new_pc < pc + 20)
1052 if ((op & 0x7ffff000) == 0x1ec82000)
1070 if ((op & 0x01fc0000) == 0x003c0000)
1076 displ = ((op & 0xfe000000) >> 7) | (op & 0x0003ffff);
1077 if ((displ & 0x00800000) != 0)
1078 displ |= ~((
LONGEST) 0x00ffffff);
1080 call_dest = pc + 4 * displ;
1097 void **this_prologue_cache)
1102 if ((*this_prologue_cache))
1103 return (*this_prologue_cache);
1106 (*this_prologue_cache) = info;
1141 _(
"Illegal return value length: %d"), len);
1162 || entry_point != start_addr)
1211 struct type *arg_type;
1221 printf(
"Push %d args at sp = %x, struct_return=%d (%x)\n",
1222 nargs, (
int) sp, struct_return, struct_addr);
1226 for (argnum = 0; argnum < nargs; ++argnum)
1229 stack_space -= (6 * 4);
1230 if (stack_space > 0)
1244 for (argnum = 0; argnum < nargs; ++argnum)
1281 int partial_len = (len < 4 ? len : 4);
1287 printf(
" Argnum %d data %x -> reg %d\n",
1288 argnum, (
int) regval, argreg);
1296 printf(
" Argnum %d data %x -> offset %d (%x)\n",
1297 argnum, *((
int *)val), stack_offset,
1298 (
int) (sp + stack_offset));
1301 stack_offset +=
align_up (partial_len, 4);
1335 memset (val, 0,
sizeof (val));
1336 memcpy (val + (4 - len), valbuf, len);
1346 _(
"Don't know how to return a %d-byte value."), len);
1358 if (writebuf != NULL)
1364 if (readbuf != NULL)
1387 void **this_prologue_cache,
struct frame_id *this_id)
1415 static struct value *
1417 void **this_prologue_cache,
int regnum)
1445 frv_frame_base_address
1466 static struct gdbarch *
1469 struct gdbarch *gdbarch;
1484 case bfd_mach_frvsimple:
1485 case bfd_mach_fr500:
1486 case bfd_mach_frvtomcat:
1487 case bfd_mach_fr550:
1492 case bfd_mach_fr400:
1493 case bfd_mach_fr450:
1504 if (info.
abfd && bfd_get_flavour (info.
abfd) == bfd_target_elf_flavour)
1505 elf_flags = elf_elfheader (info.
abfd)->e_flags;
1507 if (elf_flags & EF_FRV_FDPIC)
1510 if (elf_flags & EF_FRV_CPU_FR450)
1565 case bfd_mach_frvsimple:
1566 case bfd_mach_fr500:
1567 case bfd_mach_frvtomcat:
1573 case bfd_mach_fr400:
1574 case bfd_mach_fr450:
static CORE_ADDR frv_convert_from_func_ptr_addr(struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
void set_gdbarch_double_bit(struct gdbarch *gdbarch, int double_bit)
void set_gdbarch_frame_align(struct gdbarch *gdbarch, gdbarch_frame_align_ftype frame_align)
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
static struct type * frv_register_type(struct gdbarch *gdbarch, int reg)
enum frv_abi frv_abi(struct gdbarch *gdbarch)
void set_gdbarch_skip_main_prologue(struct gdbarch *gdbarch, gdbarch_skip_main_prologue_ftype skip_main_prologue)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
int frv_fdpic_loadmap_addresses(struct gdbarch *gdbarch, CORE_ADDR *interp_addr, CORE_ADDR *exec_addr)
static void set_variant_scratch_registers(struct gdbarch_tdep *var)
void set_gdbarch_float_bit(struct gdbarch *gdbarch, int float_bit)
CORE_ADDR get_frame_pc(struct frame_info *frame)
#define MSYMBOL_LINKAGE_NAME(symbol)
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype fetch_tls_load_module_address)
void gdbarch_init_osabi(struct gdbarch_info info, struct gdbarch *gdbarch)
static const int max_instrs_per_bundle
static enum register_status frv_pseudo_register_read(struct gdbarch *gdbarch, struct regcache *regcache, int reg, gdb_byte *buffer)
struct value * trad_frame_get_prev_register(struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], int regnum)
static void set_variant_num_gprs(struct gdbarch_tdep *var, int num_gprs)
static void frv_extract_return_value(struct type *type, struct regcache *regcache, gdb_byte *valbuf)
struct gdbarch * get_regcache_arch(const struct regcache *regcache)
LONGEST value_as_long(struct value *val)
void set_solib_ops(struct gdbarch *gdbarch, const struct target_so_ops *new_ops)
#define BMSYMBOL_VALUE_ADDRESS(symbol)
void trad_frame_set_value(struct trad_frame_saved_reg this_saved_regs[], int regnum, LONGEST val)
static CORE_ADDR frv_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
ULONGEST align_down(ULONGEST v, int n)
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 internal_error(const char *file, int line, const char *fmt,...)
CORE_ADDR frv_fdpic_find_global_pointer(CORE_ADDR addr)
static int is_caller_saves_reg(int reg)
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
void set_gdbarch_deprecated_fp_regnum(struct gdbarch *gdbarch, int deprecated_fp_regnum)
CORE_ADDR skip_prologue_using_sal(struct gdbarch *gdbarch, CORE_ADDR func_addr)
int gdbarch_num_regs(struct gdbarch *gdbarch)
static struct gdbarch_tdep * new_variant(void)
const struct bfd_arch_info * bfd_arch_info
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
struct regcache * get_current_regcache(void)
struct type * builtin_int32
struct trad_frame_saved_reg * saved_regs
#define FRAME_OBSTACK_ZALLOC(TYPE)
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
static void frv_store_return_value(struct type *type, struct regcache *regcache, const gdb_byte *valbuf)
static const struct frame_unwind frv_frame_unwind
static CORE_ADDR frv_analyze_prologue(struct gdbarch *gdbarch, CORE_ADDR pc, struct frame_info *this_frame, struct frv_unwind_cache *info)
static void set_variant_num_fprs(struct gdbarch_tdep *var, int num_fprs)
static const int frv_instr_size
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)
struct type * check_typedef(struct type *type)
static struct value * frv_frame_prev_register(struct frame_info *this_frame, void **this_prologue_cache, int regnum)
const gdb_byte * value_contents(struct value *value)
ULONGEST get_target_memory_unsigned(struct target_ops *ops, CORE_ADDR addr, int len, enum bfd_endian byte_order)
static void frv_frame_this_id(struct frame_info *this_frame, void **this_prologue_cache, struct frame_id *this_id)
static CORE_ADDR frv_adjust_breakpoint_address(struct gdbarch *gdbarch, CORE_ADDR bpaddr)
struct symtab_and_line find_pc_line(CORE_ADDR pc, int notcurrent)
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
CORE_ADDR frv_fetch_objfile_link_map(struct objfile *objfile)
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t int status
static void set_variant_abi_fdpic(struct gdbarch_tdep *var)
#define gdb_assert_not_reached(message)
void set_gdbarch_adjust_breakpoint_address(struct gdbarch *gdbarch, gdbarch_adjust_breakpoint_address_ftype adjust_breakpoint_address)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_gdbarch_register_sim_regno(struct gdbarch *gdbarch, gdbarch_register_sim_regno_ftype register_sim_regno)
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
static enum return_value_convention frv_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
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)
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
static CORE_ADDR frv_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)
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
static CORE_ADDR frv_frame_base_address(struct frame_info *this_frame, void **this_cache)
char * xstrprintf(const char *format,...)
void set_gdbarch_convert_from_func_ptr_addr(struct gdbarch *gdbarch, gdbarch_convert_from_func_ptr_addr_ftype convert_from_func_ptr_addr)
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
static const char * frv_register_name(struct gdbarch *gdbarch, int reg)
static CORE_ADDR frv_unwind_sp(struct gdbarch *gdbarch, struct frame_info *next_frame)
void set_gdbarch_long_long_bit(struct gdbarch *gdbarch, int long_long_bit)
static struct frv_unwind_cache * frv_frame_unwind_cache(struct frame_info *this_frame, void **this_prologue_cache)
static int is_callee_saves_reg(int reg)
struct trad_frame_saved_reg * trad_frame_alloc_saved_regs(struct frame_info *this_frame)
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
void _initialize_frv_tdep(void)
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype pseudo_register_read)
ULONGEST align_up(ULONGEST v, int n)
#define TYPE_TARGET_TYPE(thistype)
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
int xsnprintf(char *str, size_t size, const char *format,...)
#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)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
CORE_ADDR find_function_addr(struct value *function, struct type **retval_type)
void set_gdbarch_int_bit(struct gdbarch *gdbarch, int int_bit)
struct minimal_symbol * minsym
static int frv_register_sim_regno(struct gdbarch *gdbarch, int reg)
static void frv_pseudo_register_write(struct gdbarch *gdbarch, struct regcache *regcache, int reg, const gdb_byte *buffer)
CORE_ADDR frv_fdpic_find_canonical_descriptor(CORE_ADDR entry_point)
static CORE_ADDR frv_unwind_pc(struct gdbarch *gdbarch, struct frame_info *next_frame)
static const unsigned char * frv_breakpoint_from_pc(struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenp)
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
static int is_argument_reg(int reg)
struct target_so_ops frv_so_ops
unsigned long long ULONGEST
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
static CORE_ADDR find_func_descr(struct gdbarch *gdbarch, CORE_ADDR entry_point)
struct value * value_allocate_space_in_inferior(int len)
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
struct type * value_type(const struct value *value)
struct type * builtin_int64
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)
#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)
static CORE_ADDR frv_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
CORE_ADDR get_pc_function_start(CORE_ADDR pc)
static struct gdbarch * frv_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
void register_gdbarch_init(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init)
LONGEST extract_signed_integer(const gdb_byte *, int, enum bfd_endian)
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)
CORE_ADDR value_address(const struct value *value)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
enum bfd_endian byte_order
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
static struct frame_id frv_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
void set_gdbarch_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype register_name)
CORE_ADDR get_frame_func(struct frame_info *this_frame)
static CORE_ADDR frv_skip_main_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, struct gdbarch_tdep *tdep)
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
void set_gdbarch_print_insn(struct gdbarch *gdbarch, gdbarch_print_insn_ftype print_insn)
struct type * builtin_float
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
const ULONGEST const LONGEST len