57 #include "elf/common.h" 106 #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE 107 #define ARM_LINUX_JB_PC_FPA 21 108 #define ARM_LINUX_JB_PC_EABI 9 237 #define ARM_LINUX_SIGRETURN_INSTR 0xef900077 238 #define ARM_LINUX_RT_SIGRETURN_INSTR 0xef9000ad 244 #define ARM_SET_R7_SIGRETURN 0xe3a07077 245 #define ARM_SET_R7_RT_SIGRETURN 0xe3a070ad 246 #define ARM_EABI_SYSCALL 0xef000000 249 #define THUMB2_SET_R7_SIGRETURN1 0xf04f 250 #define THUMB2_SET_R7_SIGRETURN2 0x0777 251 #define THUMB2_SET_R7_RT_SIGRETURN1 0xf04f 252 #define THUMB2_SET_R7_RT_SIGRETURN2 0x07ad 253 #define THUMB2_EABI_SYSCALL 0xdf00 257 #define ARM_OABI_SYSCALL_RESTART_SYSCALL 0xef900000 258 #define ARM_LDR_PC_SP_12 0xe49df00c 259 #define ARM_LDR_PC_SP_4 0xe49df004 262 #define ARM_SIGRETURN 119 264 #define ARM_RT_SIGRETURN 173 287 for (i = 0; i < 16; i++)
474 #define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE) 479 int regnum,
const void *gregs_buf,
size_t len)
517 int regnum,
void *gregs_buf,
size_t len)
544 #define typeNone 0x00 545 #define typeSingle 0x01 546 #define typeDouble 0x02 547 #define typeExtended 0x03 564 memcpy (buf, reg_data, 4);
567 memcpy (buf, reg_data + 4, 4);
568 memcpy (buf + 4, reg_data, 4);
573 memcpy (buf, reg_data, 4);
574 memcpy (buf + 4, reg_data + 8, 4);
575 memcpy (buf + 8, reg_data + 4, 4);
605 memcpy (reg_data, buf, 4);
608 memcpy (reg_data, buf + 4, 4);
609 memcpy (reg_data + 4, buf, 4);
612 memcpy (reg_data, buf, 4);
613 memcpy (reg_data + 4, buf + 8, 4);
614 memcpy (reg_data + 8, buf + 4, 4);
624 int regnum,
const void *regs_buf,
size_t len)
641 int regnum,
void *regs_buf,
size_t len)
657 #define ARM_LINUX_SIZEOF_VFP (32 * 8 + 4) 662 int regnum,
const void *regs_buf,
size_t len)
679 int regnum,
void *regs_buf,
size_t len)
722 "VFP floating-point", cb_data);
725 "FPA floating-point", cb_data);
762 unsigned long svc_number,
766 if (svc_number == 119 || svc_number == 173)
774 *is_thumb = (cpsr & t_bit) != 0;
788 unsigned long svc_number,
int *is_thumb)
791 unsigned long sp_data;
796 int is_sigreturn = 0;
837 is_thumb = (cpsr & t_bit) != 0;
845 enum bfd_endian byte_order_for_code =
850 unsigned long this_instr =
853 unsigned long svc_operand = (0x00ffffff & this_instr);
858 svc_number = svc_operand - 0x900000;
888 unsigned long this_instr =
891 unsigned long svc_operand = (0x00ffffff & this_instr);
894 svc_number = svc_operand - 0x900000;
922 static std::vector<CORE_ADDR>
967 "SVC step ", (
unsigned long) apparent_pc);
987 int is_sigreturn = 0;
993 &return_to, &is_thumb);
1000 "sigreturn/rt_sigreturn SVC call. PC in " 1006 "Setting momentary breakpoint.\n",
1007 (
unsigned long) return_to);
1034 "frame to set momentary breakpoint for " 1035 "sigreturn/rt_sigreturn\n");
1119 if (from > 0xffff0000)
1123 "at %.8lx\n", (
unsigned long) from);
1146 return (*s ==
'#' || *s ==
'$' || isdigit (*s)
1168 const char *tmp = p->
arg;
1182 while (isalnum (*tmp))
1189 regname = (
char *) alloca (len + 2);
1192 if (isdigit (*start))
1203 strncpy (regname +
offset, start, len);
1205 regname[len] =
'\0';
1208 error (
_(
"Invalid register name `%s' on expression `%s'."),
1213 if (*tmp ==
'#' || *tmp ==
'$')
1222 displacement = strtol (tmp, &endp, 10);
1671 "support syscall number %s\n"),
1719 static const char *
const stap_integer_prefixes[] = {
"#",
"$",
"", NULL };
1720 static const char *
const stap_register_prefixes[] = {
"r", NULL };
1721 static const char *
const stap_register_indirection_prefixes[] = {
"[",
1723 static const char *
const stap_register_indirection_suffixes[] = {
"]",
1767 (__FILE__, __LINE__,
1768 _(
"arm_linux_init_abi: Floating point model not supported"));
1822 stap_register_indirection_prefixes);
1824 stap_register_indirection_suffixes);
static int arm_all_but_pc_registers_record(struct regcache *regcache)
static struct tramp_frame arm_linux_sigreturn_tramp_frame
static int arm_stap_parse_special_token(struct gdbarch *gdbarch, struct stap_parse_info *p)
ULONGEST regcache_raw_get_unsigned(struct regcache *regcache, int regnum)
#define ARM_OABI_SYSCALL_RESTART_SYSCALL
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
int size_serial_icounter_struct
static int arm_linux_copy_svc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
#define ARM_SIGCONTEXT_R0
#define ARM_LINUX_JB_ELEMENT_SIZE
void arm_linux_supply_nwfpe(const struct regset *regset, struct regcache *regcache, int regnum, const void *regs_buf, size_t len)
static CORE_ADDR arm_linux_get_next_pcs_syscall_next_pc(struct arm_get_next_pcs *self)
static struct tramp_frame arm_eabi_linux_sigreturn_tramp_frame
void set_gdbarch_displaced_step_fixup(struct gdbarch *gdbarch, gdbarch_displaced_step_fixup_ftype displaced_step_fixup)
CORE_ADDR get_frame_pc(struct frame_info *frame)
const gdb_byte * thumb_breakpoint
struct frame_info * get_current_frame(void)
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype fetch_tls_load_module_address)
#define TRAMP_SENTINEL_INSN
#define THUMB2_EABI_SYSCALL
void insert_breakpoints(void)
int arm_linux_sigreturn_next_pc_offset(unsigned long sp, unsigned long sp_data, unsigned long svc_number, int is_sigreturn)
struct regcache * get_thread_regcache(ptid_t ptid)
void set_gdbarch_stap_parse_special_token(struct gdbarch *gdbarch, gdbarch_stap_parse_special_token_ftype stap_parse_special_token)
#define THUMB2_SET_R7_SIGRETURN2
#define ARM_NEW_SIGFRAME_MAGIC
struct frame_info * get_prev_frame(struct frame_info *this_frame)
int record_full_arch_list_add_reg(struct regcache *regcache, int regnum)
static void arm_linux_supply_vfp(const struct regset *regset, struct regcache *regcache, int regnum, const void *regs_buf, size_t len)
void write_memory_unsigned_integer(CORE_ADDR addr, int len, enum bfd_endian byte_order, ULONGEST value)
CORE_ADDR frame_unwind_caller_pc(struct frame_info *this_frame)
int gdbarch_int_bit(struct gdbarch *gdbarch)
struct target_desc * tdesc_arm_with_vfpv2
void() iterate_over_regset_sections_cb(const char *sect_name, int size, const struct regset *regset, const char *human_name, void *cb_data)
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
CORE_ADDR glibc_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
#define NWFPE_FPSR_OFFSET
static struct tramp_frame arm_linux_restart_syscall_tramp_frame
void set_gdbarch_displaced_step_location(struct gdbarch *gdbarch, gdbarch_displaced_step_location_ftype displaced_step_location)
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
void collect_nwfpe_register(const struct regcache *regcache, int regno, gdb_byte *regs)
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
int arm_psr_thumb_bit(struct gdbarch *gdbarch)
char * plongest(LONGEST l)
void set_gdbarch_stap_register_prefixes(struct gdbarch *gdbarch, const char *const *stap_register_prefixes)
int ioctl_TIOCSERGETMULTI
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
enum arm_float_model fp_model
ULONGEST displaced_read_reg(struct regcache *regs, arm_displaced_step_closure *dsc, int regno)
void * memset(T *s, int c, size_t n)=delete
void internal_error(const char *file, int line, const char *fmt,...)
struct thread_info * inferior_thread(void)
#define target_can_do_single_step()
#define ARM_LINUX_JB_PC_FPA
void linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define THUMB2_SET_R7_SIGRETURN1
static const gdb_byte eabi_linux_arm_be_breakpoint[]
struct target_desc * tdesc_arm_with_neon
void arm_displaced_init_closure(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, arm_displaced_step_closure *dsc)
const gdb_byte * arm_breakpoint
int gdbarch_long_bit(struct gdbarch *gdbarch)
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
static struct tramp_frame thumb2_eabi_linux_sigreturn_tramp_frame
struct obj_section * section
char * skip_spaces(char *chp)
std::vector< CORE_ADDR > arm_get_next_pcs(struct arm_get_next_pcs *self)
ULONGEST get_frame_memory_unsigned(struct frame_info *this_frame, CORE_ADDR addr, int len)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
static void arm_linux_sigtramp_cache(struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func, int regs_offset)
void displaced_write_reg(struct regcache *regs, arm_displaced_step_closure *dsc, int regno, ULONGEST val, enum pc_write_style write_pc)
void set_gdbarch_process_record(struct gdbarch *gdbarch, gdbarch_process_record_ftype process_record)
void set_gdbarch_stap_register_indirection_suffixes(struct gdbarch *gdbarch, const char *const *stap_register_indirection_suffixes)
enum arm_abi_kind arm_abi
static const gdb_byte eabi_linux_arm_le_breakpoint[]
struct gdbarch * frame_unwind_arch(struct frame_info *next_frame)
struct obj_section * find_pc_overlay(CORE_ADDR pc)
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
static void cleanup_kernel_helper_return(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
#define ARM_OLD_RT_SIGFRAME_UCONTEXT
struct arm_displaced_step_closure::@5::@10 svc
void set_gdbarch_stap_integer_prefixes(struct gdbarch *gdbarch, const char *const *stap_integer_prefixes)
void set_gdbarch_stap_gdb_register_prefix(struct gdbarch *gdbarch, const char *stap_gdb_register_prefix)
struct parser_state pstate
#define ARM_LINUX_JB_PC_EABI
int ioctl_TIOCSERSETMULTI
#define ARM_LINUX_SIZEOF_VFP
void write_exp_elt_longcst(struct parser_state *ps, LONGEST expelt)
enum frame_type get_frame_type(struct frame_info *frame)
int arm_process_record(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR insn_addr)
struct frame_id get_frame_id(struct frame_info *fi)
static struct arm_get_next_pcs_ops arm_linux_get_next_pcs_ops
static CORE_ADDR arm_linux_sigreturn_next_pc(struct regcache *regcache, unsigned long svc_number, int *is_thumb)
int thumb_breakpoint_size
static struct tramp_frame arm_linux_rt_sigreturn_tramp_frame
CORE_ADDR gdbarch_addr_bits_remove(struct gdbarch *gdbarch, CORE_ADDR addr)
struct symtab_and_line find_pc_line(CORE_ADDR pc, int notcurrent)
int record_linux_system_call(enum gdb_syscall syscall, struct regcache *regcache, struct linux_record_tdep *tdep)
CORE_ADDR find_solib_trampoline_target(struct frame_info *frame, CORE_ADDR pc)
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)
static void arm_linux_collect_vfp(const struct regset *regset, const struct regcache *regcache, int regnum, void *regs_buf, size_t len)
CORE_ADDR arm_linux_get_next_pcs_fixup(struct arm_get_next_pcs *self, CORE_ADDR nextpc)
static const gdb_byte arm_linux_thumb2_be_breakpoint[]
void arm_linux_collect_gregset(const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs_buf, size_t len)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
static const struct regset arm_linux_vfpregset
int target_auxv_search(struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
#define NWFPE_TAGS_OFFSET
static void arm_linux_restart_syscall_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
#define THUMB2_SET_R7_RT_SIGRETURN2
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void arm_displaced_step_fixup(struct gdbarch *gdbarch, struct displaced_step_closure *dsc_, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
void set_gdbarch_stap_register_indirection_prefixes(struct gdbarch *gdbarch, const char *const *stap_register_indirection_prefixes)
int arm_is_thumb(struct regcache *regcache)
static const gdb_byte arm_linux_thumb2_le_breakpoint[]
struct linux_record_tdep arm_linux_record_tdep
static struct tramp_frame thumb2_eabi_linux_rt_sigreturn_tramp_frame
void trad_frame_set_reg_value(struct trad_frame_cache *this_trad_cache, int regnum, LONGEST val)
void arm_process_displaced_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, arm_displaced_step_closure *dsc)
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)
void printf_unfiltered(const char *format,...)
static std::vector< CORE_ADDR > arm_linux_software_single_step(struct regcache *regcache)
CORE_ADDR arm_get_next_pcs_addr_bits_remove(struct arm_get_next_pcs *self, CORE_ADDR val)
#define ARM_OLD_RT_SIGFRAME_SIGINFO
int user_reg_map_name_to_regnum(struct gdbarch *gdbarch, const char *name, int len)
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
CORE_ADDR linux_displaced_step_location(struct gdbarch *gdbarch)
static struct displaced_step_closure * arm_linux_displaced_step_copy_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
#define INT_REGISTER_SIZE
int(* arm_syscall_record)(struct regcache *regcache, unsigned long svc_number)
void set_gdbarch_software_single_step(struct gdbarch *gdbarch, gdbarch_software_single_step_ftype software_single_step)
void(* cleanup)(struct gdbarch *, struct regcache *, arm_displaced_step_closure *)
ULONGEST arm_get_next_pcs_read_memory_unsigned_integer(CORE_ADDR memaddr, int len, int byte_order)
void write_exp_elt_opcode(struct parser_state *ps, enum exp_opcode expelt)
static void arm_linux_sigreturn_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
static int arm_linux_syscall_record(struct regcache *regcache, unsigned long svc_number)
#define ARM_LINUX_SIZEOF_GREGSET
void arm_linux_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs_buf, size_t len)
void set_gdbarch_displaced_step_copy_insn(struct gdbarch *gdbarch, gdbarch_displaced_step_copy_insn_ftype displaced_step_copy_insn)
breakpoint_up set_momentary_breakpoint(struct gdbarch *gdbarch, struct symtab_and_line sal, struct frame_id frame_id, enum bptype type)
const gdb_byte * thumb2_breakpoint
void arm_linux_collect_nwfpe(const struct regset *regset, const struct regcache *regcache, int regnum, void *regs_buf, size_t len)
static const gdb_byte arm_linux_arm_be_breakpoint[]
static const struct regset arm_linux_gregset
int thumb2_breakpoint_size
void _initialize_arm_linux_tdep(void)
thread_control_state control
unsigned long modinsn[DISPLACED_MODIFIED_INSNS]
CORE_ADDR regcache_read_pc(struct regcache *regcache)
static LONGEST arm_linux_get_syscall_number(struct gdbarch *gdbarch, ptid_t ptid)
void supply_nwfpe_register(struct regcache *regcache, int regno, const gdb_byte *regs)
void set_gdbarch_stap_is_single_operand(struct gdbarch *gdbarch, gdbarch_stap_is_single_operand_ftype stap_is_single_operand)
static const gdb_byte arm_linux_thumb_le_breakpoint[]
#define ARM_SET_R7_SIGRETURN
#define THUMB2_SET_R7_RT_SIGRETURN1
static int arm_linux_sigreturn_return_addr(struct frame_info *frame, unsigned long svc_number, CORE_ADDR *pc, int *is_thumb)
#define ARM_LINUX_SIGRETURN_INSTR
void set_gdbarch_get_syscall_number(struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype get_syscall_number)
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
static int arm_stap_is_single_operand(struct gdbarch *gdbarch, const char *s)
int arm_get_next_pcs_is_thumb(struct arm_get_next_pcs *self)
static void arm_linux_cleanup_svc(struct gdbarch *gdbarch, struct regcache *regs, arm_displaced_step_closure *dsc)
static void arm_linux_rt_sigreturn_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
void arm_get_next_pcs_ctor(struct arm_get_next_pcs *self, struct arm_get_next_pcs_ops *ops, int byte_order, int byte_order_for_code, int has_thumb2_breakpoint, struct regcache *regcache)
enum bfd_endian byte_order_for_code
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
static const gdb_byte arm_linux_thumb_be_breakpoint[]
#define DISPLACED_MODIFIED_INSNS
unsigned long long ULONGEST
static enum gdb_syscall arm_canonicalize_syscall(int syscall)
enum bfd_endian byte_order_for_code
static const struct regset arm_linux_fpregset
union arm_displaced_step_closure::@5 u
#define ARM_UCONTEXT_SIGCONTEXT
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
#define ARM_SET_R7_RT_SIGRETURN
ULONGEST tmp[DISPLACED_TEMPS]
int size_hayes_esp_config
struct breakpoint * step_resume_breakpoint
static struct tramp_frame arm_kernel_linux_restart_syscall_tramp_frame
static void arm_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
static void arm_linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define ARM_LINUX_RT_SIGRETURN_INSTR
int size__old_kernel_stat
void set_gdbarch_skip_solib_resolver(struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype skip_solib_resolver)
enum bfd_endian byte_order
#define ARM_NEW_RT_SIGFRAME_UCONTEXT
enum bfd_endian gdbarch_byte_order_for_code(struct gdbarch *gdbarch)
struct target_desc * tdesc_arm_with_vfpv3
void write_exp_string(struct parser_state *ps, struct stoken str)
void set_gdbarch_core_read_description(struct gdbarch *gdbarch, gdbarch_core_read_description_ftype core_read_description)
void write_exp_elt_type(struct parser_state *ps, struct type *expelt)
void error(const char *fmt,...)
static void arm_catch_kernel_helper_return(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, arm_displaced_step_closure *dsc)
static struct tramp_frame arm_eabi_linux_rt_sigreturn_tramp_frame
CORE_ADDR arm_skip_stub(struct frame_info *frame, CORE_ADDR pc)
#define ARM_LINUX_SIZEOF_NWFPE
struct type * lookup_pointer_type(struct type *type)
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
static const struct target_desc * arm_linux_core_read_description(struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd)
static const gdb_byte arm_linux_arm_le_breakpoint[]
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
static CORE_ADDR arm_linux_skip_trampoline_code(struct frame_info *frame, CORE_ADDR pc)
#define MAKE_THUMB_ADDR(addr)