From: Yao Qi Date: Tue, 28 Jun 2016 11:02:36 +0000 (+0100) Subject: Implement get_syscall_trapinfo for arm-linux X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=79e7fd4f78e0c33e77dd0b69d7de8167a60af06a;p=binutils-gdb.git Implement get_syscall_trapinfo for arm-linux gdb/gdbserver: 2016-06-28 Yao Qi * linux-arm-low.c (arm_get_syscall_trapinfo): New function. (the_low_target): Install arm_get_syscall_trapinfo. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 4c28195fb0e..f6f0ad97558 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2016-06-28 Yao Qi + + * linux-arm-low.c (arm_get_syscall_trapinfo): New function. + (the_low_target): Install arm_get_syscall_trapinfo. + 2016-06-28 Yao Qi * linux-aarch64-low.c (aarch64_get_syscall_trapinfo): New diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c index 2ffda8731d1..e1261e54530 100644 --- a/gdb/gdbserver/linux-arm-low.c +++ b/gdb/gdbserver/linux-arm-low.c @@ -951,6 +951,40 @@ arm_supports_hardware_single_step (void) return 0; } +/* Implementation of linux_target_ops method "get_syscall_trapinfo". */ + +static void +arm_get_syscall_trapinfo (struct regcache *regcache, int *sysno) +{ + if (arm_is_thumb_mode ()) + collect_register_by_name (regcache, "r7", sysno); + else + { + unsigned long pc; + unsigned long insn; + + collect_register_by_name (regcache, "pc", &pc); + + if ((*the_target->read_memory) (pc - 4, (unsigned char *) &insn, 4)) + *sysno = UNKNOWN_SYSCALL; + else + { + unsigned long svc_operand = (0x00ffffff & insn); + + if (svc_operand) + { + /* OABI */ + *sysno = svc_operand - 0x900000; + } + else + { + /* EABI */ + collect_register_by_name (regcache, "r7", sysno); + } + } + } +} + /* Register sets without using PTRACE_GETREGSET. */ static struct regset_info arm_regsets[] = { @@ -1031,7 +1065,8 @@ struct linux_target_ops the_low_target = { NULL, /* get_min_fast_tracepoint_insn_len */ NULL, /* supports_range_stepping */ arm_breakpoint_kind_from_current_state, - arm_supports_hardware_single_step + arm_supports_hardware_single_step, + arm_get_syscall_trapinfo, }; void