24 #include "floatformat.h"
56 #include "elf/common.h"
105 #define ARM_LINUX_JB_ELEMENT_SIZE INT_REGISTER_SIZE
106 #define ARM_LINUX_JB_PC_FPA 21
107 #define ARM_LINUX_JB_PC_EABI 9
236 #define ARM_LINUX_SIGRETURN_INSTR 0xef900077
237 #define ARM_LINUX_RT_SIGRETURN_INSTR 0xef9000ad
243 #define ARM_SET_R7_SIGRETURN 0xe3a07077
244 #define ARM_SET_R7_RT_SIGRETURN 0xe3a070ad
245 #define ARM_EABI_SYSCALL 0xef000000
248 #define THUMB2_SET_R7_SIGRETURN1 0xf04f
249 #define THUMB2_SET_R7_SIGRETURN2 0x0777
250 #define THUMB2_SET_R7_RT_SIGRETURN1 0xf04f
251 #define THUMB2_SET_R7_RT_SIGRETURN2 0x07ad
252 #define THUMB2_EABI_SYSCALL 0xdf00
256 #define ARM_OABI_SYSCALL_RESTART_SYSCALL 0xef900000
257 #define ARM_LDR_PC_SP_12 0xe49df00c
258 #define ARM_LDR_PC_SP_4 0xe49df004
269 for (i = 0; i < 16; i++)
309 #define ARM_SIGCONTEXT_R0 0xc
313 #define ARM_UCONTEXT_SIGCONTEXT 0x14
319 #define ARM_OLD_RT_SIGFRAME_SIGINFO 0x8
320 #define ARM_OLD_RT_SIGFRAME_UCONTEXT 0x88
322 #define ARM_NEW_RT_SIGFRAME_UCONTEXT 0x80
324 #define ARM_NEW_SIGFRAME_MAGIC 0x5ac3c35a
430 static struct tramp_frame arm_eabi_linux_sigreturn_tramp_frame = {
441 static struct tramp_frame arm_eabi_linux_rt_sigreturn_tramp_frame = {
452 static struct tramp_frame thumb2_eabi_linux_sigreturn_tramp_frame = {
464 static struct tramp_frame thumb2_eabi_linux_rt_sigreturn_tramp_frame = {
476 static struct tramp_frame arm_linux_restart_syscall_tramp_frame = {
487 static struct tramp_frame arm_kernel_linux_restart_syscall_tramp_frame = {
500 #define ARM_LINUX_SIZEOF_GREGSET (18 * INT_REGISTER_SIZE)
505 int regnum,
const void *gregs_buf,
size_t len)
515 if (regnum == -1 || regnum == regno)
529 if (regnum == ARM_PC_REGNUM || regnum == -1)
549 if (regnum == -1 || regnum == regno)
563 if (regnum == ARM_PC_REGNUM || regnum == -1)
570 #define typeNone 0x00
571 #define typeSingle 0x01
572 #define typeDouble 0x02
573 #define typeExtended 0x03
590 memcpy (buf, reg_data, 4);
593 memcpy (buf, reg_data + 4, 4);
594 memcpy (buf + 4, reg_data, 4);
599 memcpy (buf, reg_data, 4);
600 memcpy (buf + 4, reg_data + 8, 4);
601 memcpy (buf + 8, reg_data + 4, 4);
631 memcpy (reg_data, buf, 4);
634 memcpy (reg_data, buf + 4, 4);
635 memcpy (reg_data + 4, buf, 4);
638 memcpy (reg_data, buf, 4);
639 memcpy (reg_data + 4, buf + 8, 4);
640 memcpy (reg_data + 8, buf + 4, 4);
650 int regnum,
const void *regs_buf,
size_t len)
660 if (regnum == -1 || regnum == regno)
673 if (regnum == -1 || regnum == regno)
683 #define ARM_LINUX_SIZEOF_VFP (32 * 8 + 4)
688 int regnum,
const void *regs_buf,
size_t len)
697 if (regnum == -1 || regnum == regno)
714 if (regnum == -1 || regnum == regno)
719 static const struct regset arm_linux_gregset =
724 static const struct regset arm_linux_fpregset =
729 static const struct regset arm_linux_vfpregset =
748 "VFP floating-point", cb_data);
751 "FPA floating-point", cb_data);
788 unsigned long svc_number,
792 if (svc_number == 119 || svc_number == 173)
800 *is_thumb = (cpsr & t_bit) != 0;
828 is_thumb = (cpsr & t_bit) != 0;
836 enum bfd_endian byte_order_for_code =
841 unsigned long this_instr =
844 unsigned long svc_operand = (0x00ffffff & this_instr);
849 svc_number = svc_operand - 0x900000;
875 return_addr = pc + 2;
882 unsigned long this_instr =
885 unsigned long svc_operand = (0x00ffffff & this_instr);
888 svc_number = svc_operand - 0x900000;
895 return_addr = pc + 4;
927 if (next_pc > 0xffff0000)
954 "SVC step ", (
unsigned long) apparent_pc);
974 int is_sigreturn = 0;
980 &return_to, &is_thumb);
987 "sigreturn/rt_sigreturn SVC call. PC in "
993 "Setting momentary breakpoint.\n",
994 (
unsigned long) return_to);
1021 "frame to set momentary breakpoint for "
1022 "sigreturn/rt_sigreturn\n");
1108 if (from > 0xffff0000)
1112 "at %.8lx\n", (
unsigned long) from);
1135 return (*s ==
'#' || *s ==
'$' || isdigit (*s)
1157 const char *
tmp = p->
arg;
1171 while (isalnum (*tmp))
1178 regname = alloca (len + 2);
1181 if (isdigit (*start))
1192 strncpy (regname + offset, start, len);
1194 regname[
len] =
'\0';
1197 error (
_(
"Invalid register name `%s' on expression `%s'."),
1202 if (*tmp ==
'#' || *tmp ==
'$')
1211 displacement = strtol (tmp, &endp, 10);
1261 enum { sys_process_vm_writev = 377 };
1265 else if (syscall >= 243 && syscall <= 247)
1267 else if (syscall >= 248 && syscall <= 253)
1302 if (syscall_gdb < 0)
1305 "support syscall number %s\n"),
1353 static const char *
const stap_integer_prefixes[] = {
"#",
"$",
"", NULL };
1354 static const char *
const stap_register_prefixes[] = {
"r", NULL };
1355 static const char *
const stap_register_indirection_prefixes[] = {
"[",
1357 static const char *
const stap_register_indirection_suffixes[] = {
"]",
1401 (__FILE__, __LINE__,
1402 _(
"arm_linux_init_abi: Floating point model not supported"));
1422 &arm_linux_sigreturn_tramp_frame);
1424 &arm_linux_rt_sigreturn_tramp_frame);
1426 &arm_eabi_linux_sigreturn_tramp_frame);
1428 &arm_eabi_linux_rt_sigreturn_tramp_frame);
1430 &thumb2_eabi_linux_sigreturn_tramp_frame);
1432 &thumb2_eabi_linux_rt_sigreturn_tramp_frame);
1434 &arm_linux_restart_syscall_tramp_frame);
1436 &arm_kernel_linux_restart_syscall_tramp_frame);
1458 stap_register_indirection_prefixes);
1460 stap_register_indirection_suffixes);
static int arm_all_but_pc_registers_record(struct regcache *regcache)
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
CORE_ADDR(* syscall_next_pc)(struct frame_info *frame)
static int arm_stap_parse_special_token(struct gdbarch *gdbarch, struct stap_parse_info *p)
#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
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
#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)
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)
unsigned long modinsn[DISPLACED_MODIFIED_INSNS]
#define ARM_NEW_RT_SIGFRAME_UCONTEXT
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)
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
struct frame_info * get_prev_frame(struct frame_info *this_frame)
int record_full_arch_list_add_reg(struct regcache *regcache, int regnum)
struct gdbarch * get_regcache_arch(const struct regcache *regcache)
static void arm_linux_supply_vfp(const struct regset *regset, struct regcache *regcache, int regnum, const void *regs_buf, size_t len)
static CORE_ADDR arm_linux_syscall_next_pc(struct frame_info *frame)
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 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
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)
static int arm_linux_software_single_step(struct frame_info *frame)
int ioctl_TIOCSERGETMULTI
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
int arm_frame_is_thumb(struct frame_info *frame)
enum arm_float_model fp_model
CORE_ADDR arm_get_next_pc(struct frame_info *frame, CORE_ADDR pc)
void internal_error(const char *file, int line, const char *fmt,...)
struct thread_info * inferior_thread(void)
static void arm_catch_kernel_helper_return(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, struct displaced_step_closure *dsc)
#define ARM_LINUX_JB_PC_FPA
void linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define ARM_NEW_SIGFRAME_MAGIC
#define THUMB2_SET_R7_SIGRETURN1
static const gdb_byte eabi_linux_arm_be_breakpoint[]
const gdb_byte * arm_breakpoint
int gdbarch_long_bit(struct gdbarch *gdbarch)
void arm_insert_single_step_breakpoint(struct gdbarch *gdbarch, struct address_space *aspace, CORE_ADDR pc)
int arm_deal_with_atomic_sequence(struct frame_info *frame)
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
ULONGEST tmp[DISPLACED_TEMPS]
struct obj_section * section
#define INT_REGISTER_SIZE
struct address_space * get_frame_address_space(struct frame_info *frame)
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 set_gdbarch_process_record(struct gdbarch *gdbarch, gdbarch_process_record_ftype process_record)
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
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)
void arm_displaced_init_closure(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct displaced_step_closure *dsc)
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
union displaced_step_closure::@19 u
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)
int thumb_breakpoint_size
void displaced_write_reg(struct regcache *regs, struct displaced_step_closure *dsc, int regno, ULONGEST val, enum pc_write_style write_pc)
#define ARM_OLD_RT_SIGFRAME_SIGINFO
void arm_displaced_step_fixup(struct gdbarch *gdbarch, struct displaced_step_closure *dsc, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
CORE_ADDR gdbarch_addr_bits_remove(struct gdbarch *gdbarch, CORE_ADDR addr)
void initialize_file_ftype(void)
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)
const char * skip_spaces_const(const char *chp)
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)
void(* cleanup)(struct gdbarch *, struct regcache *, struct displaced_step_closure *)
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,...)
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 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)
struct thread_control_state control
void arm_process_displaced_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, struct displaced_step_closure *dsc)
static const gdb_byte arm_linux_thumb2_le_breakpoint[]
struct linux_record_tdep arm_linux_record_tdep
void trad_frame_set_reg_value(struct trad_frame_cache *this_trad_cache, int regnum, LONGEST val)
initialize_file_ftype _initialize_arm_linux_tdep
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)
void printf_unfiltered(const char *format,...)
void( iterate_over_regset_sections_cb)(const char *sect_name, int size, const struct regset *regset, const char *human_name, void *cb_data)
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)
struct ui_file * gdb_stdlog
CORE_ADDR linux_displaced_step_location(struct gdbarch *gdbarch)
ULONGEST displaced_read_reg(struct regcache *regs, struct displaced_step_closure *dsc, int regno)
static struct displaced_step_closure * arm_linux_displaced_step_copy_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
struct breakpoint * set_momentary_breakpoint(struct gdbarch *gdbarch, struct symtab_and_line sal, struct frame_id frame_id, enum bptype type)
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 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)
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[]
struct displaced_step_closure::@19::@24 svc
int thumb2_breakpoint_size
#define ARM_OLD_RT_SIGFRAME_UCONTEXT
#define ARM_SIGCONTEXT_R0
struct ui_file * gdb_stderr
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)
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)
static void cleanup_kernel_helper_return(struct gdbarch *gdbarch, struct regcache *regs, struct displaced_step_closure *dsc)
enum bfd_endian byte_order_for_code
#define ARM_UCONTEXT_SIGCONTEXT
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
static const gdb_byte arm_linux_thumb_be_breakpoint[]
unsigned long long ULONGEST
static enum gdb_syscall arm_canonicalize_syscall(int syscall)
enum bfd_endian byte_order_for_code
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
void set_gdbarch_displaced_step_free_closure(struct gdbarch *gdbarch, gdbarch_displaced_step_free_closure_ftype displaced_step_free_closure)
#define ARM_SET_R7_RT_SIGRETURN
int size_hayes_esp_config
struct breakpoint * step_resume_breakpoint
static void arm_linux_cleanup_svc(struct gdbarch *gdbarch, struct regcache *regs, struct displaced_step_closure *dsc)
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
#define DISPLACED_MODIFIED_INSNS
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
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 gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
void error(const char *fmt,...)
static int arm_linux_copy_svc(struct gdbarch *gdbarch, struct regcache *regs, struct displaced_step_closure *dsc)
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[]
struct target_desc * tdesc_arm_with_neon
const ULONGEST const LONGEST len
void simple_displaced_step_free_closure(struct gdbarch *gdbarch, struct displaced_step_closure *closure)
static CORE_ADDR arm_linux_skip_trampoline_code(struct frame_info *frame, CORE_ADDR pc)