aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
AgeCommit message (Collapse)AuthorFilesLines
2016-04-05Make ftrace tests work with remote targetsSimon Marchi2-1/+5
When we build a shared library for testing, it is built differently whether it is meant for the local system or a remote one. When it is for the local system, the library is built with no SONAME. So when the executable is built, roughly in this way: $ gcc testfile.c /path/to/library.so the executable will contain an absolute reference to the library. For example: $ readelf -a testsuite/gdb.python/py-shared | grep NEEDED 0x0000000000000001 (NEEDED) Shared library: [/home/emaisin/build/binutils-gdb/gdb/testsuite/gdb.python/py-shared-sl.sl] When testing is done remotely, the absolute path obviously doesn't work. Therefore, we build the library with an SONAME: $ readelf -a testsuite/gdb.python/py-shared-sl.sl | grep SONAME 0x000000000000000e (SONAME) Library soname: [py-shared-sl.sl] which ends up in the executable's NEEDED field: $ readelf -a testsuite/gdb.python/py-shared | grep NEEDED 0x0000000000000001 (NEEDED) Shared library: [py-shared-sl.sl] The executable and the library are then uploaded side-by-side on the remote system. To allow the dynamic linker to find the shared library, we have to add the special RPATH value $ORIGIN, which tells it to search in the executable's directory: $ readelf -a testsuite/gdb.python/py-shared | grep ORIGIN 0x000000000000000f (RPATH) Library rpath: [$ORIGIN] The problem with the IPA library is that it doesn't have an SONAME, making it very difficult to do testing on a remote board. When a test executable is linked with it, it contains an absolute reference to the library path. Therefore, unless the paths on the target are the same as on the build system, it won't work. To make it possible for tests using the IPA library to run test on remote boards, I suggest adding an SONAME to libinproctrace.so. I don't think it should be a big problem for users. All the libraries installed on my system have an SONAME, so it should be fine if libinproctrace.so does too. As a consequence, native testing does not work anymore, since executables do not contain the absolute path to the library anymore. To keep them working, we can have gdb_load_shlibs copy the library to the test directory when testing natively. That's done by modifying gdb_load_shlibs. We also have to add RPATH=$ORIGIN to executables, even when testing natively. I think it's a good change in general, as it reduces the differences between testing a native and a remote target. To further reduce those differences, we can also always build test shared libraries with an SONAME. ftrace.exp and ftrace-lock.exp need to be modified slightly. The code checks that the IPA library is loaded using the absolute path on the build machine. That obviously doesn't work if the test is done remotely, as the path will be different. I changed the tests to only search for the library basename (e.g. libinproctrace.so). gdb/gdbserver/ChangeLog: * Makefile.in ($(IPA_LIB)): Set SONAME of the IPA lib. gdb/testsuite/ChangeLog: * gdb.trace/ftrace-lock.exp: Check for IPA basename instead of absolute. * gdb.trace/ftrace.exp: Likewise. * lib/gdb.exp (gdb_compile): Set rpath $ORIGIN for non-remote targets as well. (gdb_compile_shlib): Set SONAME for non-remote targets as well. (gdb_load_shlibs): Copy libraries to test directory when testing natively. Only set solib-search-path if testing remotely. * lib/mi-support.exp (mi_load_shlibs): Likewise.
2016-04-05IPA: Move getauxval out of #ifndef IN_PROCESS_AGENTMarcin Kościelnicki2-28/+32
The getauxval code was wrongly included in code area only compiled for gdbserver. Move it to a #ifdef IN_PROCESS_AGENT area that already contains lots of IPA-only code. gdb/gdbserver/ChangeLog: * tracepoint.c (getauxval): Move to #ifdef IN_PROCESS_AGENT.
2016-04-03IPA: Fix build problem on !HAVE_GETAUXVALMarcin Kościelnicki4-0/+9
These files need AT_PHDR, which is defined in elf.h. If HAVE_GETAUXVAL is set, it's implicitely included by sys/auxv.h. Include it manually for the opposite case. gdb/gdbserver/ChangeLog: * linux-aarch64-ipa.c: Add <elf.h> include. * linux-ppc-ipa.c: Add <elf.h> include. * linux-s390-ipa.c: Add <elf.h> include.
2016-03-31gdbserver: Fix C++ build errors in tracepoint.cMarcin Kościelnicki2-5/+14
These were introduced by 1cda1512689aabb36588a01370002632a0c8e560 and a13c46966d308297a1273e35ccc807a3912d573d . One is a simple missing cast, the other is const usage on global function pointers exported from IPA: in C++, consts are static, and thus won't be exported from the DSO (the build error was because of non-applicable visibility("default")). gdb/gdbserver/ChangeLog: * tracepoint.c (gdb_collect_ptr): Remove const qualifier. (get_raw_reg_ptr): Likewise. (get_trace_state_variable_value_ptr): Likewise. (set_trace_state_variable_value_ptr): Likewise. (initialize_tracepoint): Cast alloc_jump_pad_buffer result to char *.
2016-03-31gdbserver: Add emit_ops for powerpc.Marcin Kościelnicki2-1/+1683
gdb/gdbserver/ChangeLog: 2016-03-31 Wei-cheng Wang <cole945@gmail.com> Marcin Kościelnicki <koriakin@0x04.net> PR/17221 * linux-ppc-low.c (emit_insns): New function. (__EMIT_ASM, _EMIT_ASM, EMIT_ASM): New macros. (ppc_emit_prologue): New function. (ppc_emit_epilogue): New function. (ppc_emit_add): New function. (ppc_emit_sub): New function. (ppc_emit_mul): New function. (ppc_emit_lsh): New function. (ppc_emit_rsh_signed): New function. (ppc_emit_rsh_unsigned): New function. (ppc_emit_ext): New function. (ppc_emit_zero_ext): New function. (ppc_emit_log_not): New function. (ppc_emit_bit_and): New function. (ppc_emit_bit_or): New function. (ppc_emit_bit_xor): New function. (ppc_emit_bit_not): New function. (ppc_emit_equal): New function. (ppc_emit_less_signed): New function. (ppc_emit_less_unsigned): New function. (ppc_emit_ref): New function. (ppc_emit_const): New function. (ppc_emit_reg): New function. (ppc_emit_pop): New function. (ppc_emit_stack_flush): New function. (ppc_emit_swap): New function. (ppc_emit_stack_adjust): New function. (ppc_emit_call): New function. (ppc_emit_int_call_1): New function. (ppc_emit_void_call_2): New function. (ppc_emit_if_goto): New function. (ppc_emit_goto): New function. (ppc_emit_eq_goto): New function. (ppc_emit_ne_goto): New function. (ppc_emit_lt_goto): New function. (ppc_emit_le_goto): New function. (ppc_emit_gt_goto): New function. (ppc_emit_ge_goto): New function. (ppc_write_goto_address): New function. (ppc_emit_ops_impl): New static variable. (ppc64v1_emit_prologue): New function. (ppc64v2_emit_prologue): New function. (ppc64_emit_epilogue): New function. (ppc64_emit_add): New function. (ppc64_emit_sub): New function. (ppc64_emit_mul): New function. (ppc64_emit_lsh): New function. (ppc64_emit_rsh_signed): New function. (ppc64_emit_rsh_unsigned): New function. (ppc64_emit_ext): New function. (ppc64_emit_zero_ext): New function. (ppc64_emit_log_not): New function. (ppc64_emit_bit_and): New function. (ppc64_emit_bit_or): New function. (ppc64_emit_bit_xor): New function. (ppc64_emit_bit_not): New function. (ppc64_emit_equal): New function. (ppc64_emit_less_signed): New function. (ppc64_emit_less_unsigned): New function. (ppc64_emit_ref): New function. (ppc64_emit_const): New function. (ppc64v1_emit_reg): New function. (ppc64v2_emit_reg): New function. (ppc64_emit_pop): New function. (ppc64_emit_stack_flush): New function. (ppc64_emit_swap): New function. (ppc64v1_emit_call): New function. (ppc64v2_emit_call): New function. (ppc64v1_emit_int_call_1): New function. (ppc64v2_emit_int_call_1): New function. (ppc64v1_emit_void_call_2): New function. (ppc64v2_emit_void_call_2): New function. (ppc64_emit_if_goto): New function. (ppc64_emit_eq_goto): New function. (ppc64_emit_ne_goto): New function. (ppc64_emit_lt_goto): New function. (ppc64_emit_le_goto): New function. (ppc64_emit_gt_goto): New function. (ppc64_emit_ge_goto): New function. (ppc64v1_emit_ops_impl): New static variable. (ppc64v2_emit_ops_impl): New static variable. (ppc_emit_ops): New function. (linux_low_target): Wire in ppc_emit_ops.
2016-03-31gdbserver: Add powerpc fast tracepoint support.Marcin Kościelnicki6-68/+1284
gdb/gdbserver/ChangeLog: 2016-03-31 Wei-cheng Wang <cole945@gmail.com> Marcin Kościelnicki <koriakin@0x04.net> PR/17221 * Makefile.in: Add powerpc-*-ipa.o * configure.srv: Add ipa_obj for powerpc*-linux. * linux-ppc-ipa.c: New file. * linux-ppc-low.c: Added linux-ppc-tdesc.h, ax.h, tracepoint.h includes. (PPC_FIELD): New macro. (PPC_SEXT): New macro. (PPC_OP6): New macro. (PPC_BO): New macro. (PPC_LI): New macro. (PPC_BD): New macro. (init_registers_*): Move prototype to linux-ppc-tdesc.h. (tdesc_*): Move declaration to linux-ppc-tdesc.h. (ppc_get_hwcap): Rename to ppc_get_auxv and add type parameter. (ppc_get_thread_area): New function. (is_elfv2_inferior): New function. (gen_ds_form): New function. (GEN_STD): New macro. (GEN_STDU): New macro. (GEN_LD): New macro. (GEN_LDU): New macro. (gen_d_form): New function. (GEN_ADDI): New macro. (GEN_ADDIS): New macro. (GEN_LI): New macro. (GEN_LIS): New macro. (GEN_ORI): New macro. (GEN_ORIS): New macro. (GEN_LWZ): New macro. (GEN_STW): New macro. (GEN_STWU): New macro. (gen_xfx_form): New function. (GEN_MFSPR): New macro. (GEN_MTSPR): New macro. (GEN_MFCR): New macro. (GEN_MTCR): New macro. (GEN_SYNC): New macro. (GEN_LWSYNC): New macro. (gen_x_form): New function. (GEN_OR): New macro. (GEN_MR): New macro. (GEN_LWARX): New macro. (GEN_STWCX): New macro. (GEN_CMPW): New macro. (gen_md_form): New function. (GEN_RLDICL): New macro. (GEN_RLDICR): New macro. (gen_i_form): New function. (GEN_B): New macro. (GEN_BL): New macro. (gen_b_form): New function. (GEN_BNE): New macro. (GEN_LOAD): New macro. (GEN_STORE): New macro. (gen_limm): New function. (gen_atomic_xchg): New function. (gen_call): New function. (ppc_relocate_instruction): New function. (ppc_install_fast_tracepoint_jump_pad): New function. (ppc_get_min_fast_tracepoint_insn_len): New function. (ppc_get_ipa_tdesc_idx): New function. (the_low_target): Wire in the new functions. (initialize_low_arch) [!__powerpc64__]: Don'it initialize 64-bit tdescs. * linux-ppc-tdesc.h: New file.
2016-03-31IPA: Add alloc_jump_pad_buffer target hook.Marcin Kościelnicki7-19/+194
Targets may have various requirements on the required location of the jump pad area. Currently IPA allocates it at the lowest possible address, so that it is reachable by branches from the executable. However, this fails on powerpc, which has executable link address (0x10000000) much larger than branch reach (+/- 32MiB). This makes jump pad buffer allocation a target hook instead. The current implementations are as follows: - i386 and s390: Branches can reach anywhere, so just mmap it. This avoids the linear search dance. - x86_64: Branches have +/-2GiB of reach, and executable is loaded low, so just call mmap with MAP_32BIT. Likewise avoids the linear search. - aarch64: Branches have +-128MiB of reach, executable loaded at 4MiB. Do a linear search from 4MiB-size downwards to page_size. - s390x: Branches have +-4GiB of reach, executable loaded at 2GiB. Do like on aarch64. gdb/gdbserver/ChangeLog: * linux-aarch64-ipa.c: Add <sys/mman.h> and <sys/auxv.h> includes. (alloc_jump_pad_buffer): New function. * linux-amd64-ipa.c: Add <sys/mman.h> include. (alloc_jump_pad_buffer): New function. * linux-i386-ipa.c (alloc_jump_pad_buffer): New function. * linux-s390-ipa.c: Add <sys/mman.h> and <sys/auxv.h> includes. (alloc_jump_pad_buffer): New function. * tracepoint.c (getauxval) [!HAVE_GETAUXVAL]: New function. (initialize_tracepoint): Delegate to alloc_jump_pad_buffer. * tracepoint.h (alloc_jump_pad_buffer): New prototype. (getauxval) [!HAVE_GETAUXVAL]: New prototype.
2016-03-30gdbserver/IPA: Export some functions via global function pointers.Marcin Kościelnicki7-28/+103
On powerpc64, qSymbol for a function returns the function code address, and not the descriptor address. Since we emit code calling gdb_collect and some other functions, we need the descriptor (no way to know the proper TOC address without it). To get the descriptor address, make global function pointer variables in the IPA pointing to the relevant functions and read them instead of asking for them directly via qSymbol. gdb/gdbserver/ChangeLog: * linux-aarch64-ipa.c: Rename gdb_agent_get_raw_reg to get_raw_reg. * linux-amd64-ipa.c: Likewise. * linux-i386-ipa.c: Likewise. * linux-s390-ipa.c: Likewise. * tracepoint.c: IPA-export gdb_collect_ptr instead of gdb_collect, ditto for get_raw_reg_ptr, get_trace_state_variable_value_ptr, set_trace_state_variable_value_ptr. (struct ipa_sym_addresses): Likewise. (symbol_list): Likewise. (install_fast_tracepoint): Dereference gdb_collect_ptr instead of accessing gdb_collect directly. (gdb_collect_ptr_type): New typedef. (get_raw_reg_ptr_type): New typedef. (get_trace_state_variable_value_ptr_type): New typedef. (set_trace_state_variable_value_ptr_type): New typedef. (gdb_collect_ptr): New global. (get_raw_reg_ptr): New global. (get_trace_state_variable_value_ptr): New global. (set_trace_state_variable_value_ptr): New global. (get_raw_reg_func_addr): Dereference get_raw_reg_ptr instead of accessing get_raw_reg directly. (get_get_tsv_func_addr): Likewise for get_trace_state_variable_value_ptr. (get_set_tsv_func_addr): Likewise for set_trace_state_variable_value_ptr. * tracepoint.h: Rename gdb_agent_get_raw_reg to get_raw_reg.
2016-03-30gdbserver/tracepoint.c: Remove whitespaceSimon Marchi2-1/+5
gdb/gdbserver/ChangeLog: * tracepoint.c (cmd_qtenable_disable): Remove whitespace.
2016-03-30gdbserver: Handle 'v' packet while processing qSymbol.Marcin Kościelnicki4-18/+45
On powerpc64, qSymbol query may require gdb to read a function descriptor, sending a vFile packet to gdbserver. Thus, we need to handle 'v' packet in look_up_one_symbol. vFile replies may be quite long, and require reallocating own_buf. Since handle_v_requests assumes the buffer is the static global own_buf from server.c and reallocates it, we need to make own_buf global and use it from look_up_one_symbol instead of using our own auto variable. I've also done the same change in relocate_instruction, just in case. On gdb side, in remote_check_symbols, rs->buf may be clobbered by vFile handling, yet we need its contents for the reply (the symbol name is stored there). Allocate a new buffer instead. This broke fast tracepoints on powerpc64, due to errors in reading IPA symbols. gdb/ChangeLog: * remote.c (remote_check_symbols): Allocate own buffer for reply. gdbserver/ChangeLog: * remote-utils.c (look_up_one_symbol): Remove own_buf, handle 'v' packets. (relocate_instruction): Remove own_buf. * server.c (own_buf): Make global. (handle_v_requests): Make global. * server.h (own_buf): New declaration. (handle_v_requests): New prototype.
2016-03-29gdbserver/s390: Add support for compiled agent expressions.Marcin Kościelnicki2-1/+1426
These sequences assume a z900+ CPU, like the rest of fast tracepoint support. gdb/gdbserver/ChangeLog: PR 18377 * linux-s390-low.c (add_insns): New function. (s390_emit_prologue): New function. (s390_emit_epilogue): New function. (s390_emit_add): New function. (s390_emit_sub): New function. (s390_emit_mul): New function. (s390_emit_lsh): New function. (s390_emit_rsh_signed): New function. (s390_emit_rsh_unsigned): New function. (s390_emit_ext): New function. (s390_emit_log_not): New function. (s390_emit_bit_and): New function. (s390_emit_bit_or): New function. (s390_emit_bit_xor): New function. (s390_emit_bit_not): New function. (s390_emit_equal): New function. (s390_emit_less_signed): New function. (s390_emit_less_unsigned): New function. (s390_emit_ref): New function. (s390_emit_if_goto): New function. (s390_emit_goto): New function. (s390_write_goto_address): New function. (s390_emit_litpool): New function. (s390_emit_const): New function. (s390_emit_call): New function. (s390_emit_reg): New function. (s390_emit_pop): New function. (s390_emit_stack_flush): New function. (s390_emit_zero_ext): New function. (s390_emit_swap): New function. (s390_emit_stack_adjust): New function. (s390_emit_set_r2): New function. (s390_emit_int_call_1): New function. (s390_emit_void_call_2): New function. (s390_emit_eq_goto): New function. (s390_emit_ne_goto): New function. (s390_emit_lt_goto): New function. (s390_emit_le_goto): New function. (s390_emit_gt_goto): New function. (s390_emit_ge_goto): New function. (s390x_emit_prologue): New function. (s390x_emit_epilogue): New function. (s390x_emit_add): New function. (s390x_emit_sub): New function. (s390x_emit_mul): New function. (s390x_emit_lsh): New function. (s390x_emit_rsh_signed): New function. (s390x_emit_rsh_unsigned): New function. (s390x_emit_ext): New function. (s390x_emit_log_not): New function. (s390x_emit_bit_and): New function. (s390x_emit_bit_or): New function. (s390x_emit_bit_xor): New function. (s390x_emit_bit_not): New function. (s390x_emit_equal): New function. (s390x_emit_less_signed): New function. (s390x_emit_less_unsigned): New function. (s390x_emit_ref): New function. (s390x_emit_if_goto): New function. (s390x_emit_const): New function. (s390x_emit_call): New function. (s390x_emit_reg): New function. (s390x_emit_pop): New function. (s390x_emit_stack_flush): New function. (s390x_emit_zero_ext): New function. (s390x_emit_swap): New function. (s390x_emit_stack_adjust): New function. (s390x_emit_int_call_1): New function. (s390x_emit_void_call_2): New function. (s390x_emit_eq_goto): New function. (s390x_emit_ne_goto): New function. (s390x_emit_lt_goto): New function. (s390x_emit_le_goto): New function. (s390x_emit_gt_goto): New function. (s390x_emit_ge_goto): New function. (s390_emit_ops): New function. (struct linux_target_ops): Fill in emit_ops hook.
2016-03-29gdbserver/s390: Add fast tracepoint support.Marcin Kościelnicki6-63/+1336
Fast tracepoints will only work on 6-byte intructions, and assume at least a z900 CPU. s390 also has 4-byte jump instructions, which also work on pre-z900, but their range is limitted to +-64kiB, which is not very useful (and wouldn't work at all with current jump pad allocation). There's a little problem with s390_relocate_instruction function: it converts BRAS/BRASL instructions to LARL of the return address + JG to the target address. On 31-bit, this sets the high bit of the target register to 0, while BRAS/BRASL would set it to 1. While this is not a problem when the result is only used to address memory, it could possibly break something that expects to compare such addresses for equality without first masking the bit off. In particular, I'm not sure whether leaving the return address high bit unset is ABI-compliant (could confuse some unwinder?). If that's a problem, it could be fixed by handling it in the jump pad (since at that point we can just modify the GPRs in the save area without having to worry about preserving CCs and only having that one GPR to work with - I'm not sure if it's even possible to set the high bit with such constraints). gdb/gdbserver/ChangeLog: PR 18377 * Makefile.in: Add s390 IPA files. * configure.srv: Build IPA for s390. * linux-s390-ipa.c: New file. * linux-s390-low.c: New includes - inttypes.h and linux-s390-tdesc.h. (init_registers_s390_linux32): Move declaration to linux-s390-tdesc.h. (tdesc_s390_linux32): Likewise. (init_registers_s390_linux32v1): Likewise. (tdesc_s390_linux32v1): Likewise. (init_registers_s390_linux32v2): Likewise. (tdesc_s390_linux32v2): Likewise. (init_registers_s390_linux64): Likewise. (tdesc_s390_linux64): Likewise. (init_registers_s390_linux64v1): Likewise. (tdesc_s390_linux64v1): Likewise. (init_registers_s390_linux64v2): Likewise. (tdesc_s390_linux64v2): Likewise. (init_registers_s390_te_linux64): Likewise. (tdesc_s390_te_linux64): Likewise. (init_registers_s390_vx_linux64): Likewise. (tdesc_s390_vx_linux64): Likewise. (init_registers_s390_tevx_linux64): Likewise. (tdesc_s390_tevx_linux64): Likewise. (init_registers_s390x_linux64): Likewise. (tdesc_s390x_linux64): Likewise. (init_registers_s390x_linux64v1): Likewise. (tdesc_s390x_linux64v1): Likewise. (init_registers_s390x_linux64v2): Likewise. (tdesc_s390x_linux64v2): Likewise. (init_registers_s390x_te_linux64): Likewise. (tdesc_s390x_te_linux64): Likewise. (init_registers_s390x_vx_linux64): Likewise. (tdesc_s390x_vx_linux64): Likewise. (init_registers_s390x_tevx_linux64): Likewise. (tdesc_s390x_tevx_linux64): Likewise. (have_hwcap_s390_vx): New static variable. (s390_arch_setup): Fill have_hwcap_s390_vx. (s390_get_thread_area): New function. (s390_ft_entry_gpr_esa): New const. (s390_ft_entry_gpr_zarch): New const. (s390_ft_entry_misc): New const. (s390_ft_entry_fr): New const. (s390_ft_entry_vr): New const. (s390_ft_main_31): New const. (s390_ft_main_64): New const. (s390_ft_exit_fr): New const. (s390_ft_exit_vr): New const. (s390_ft_exit_misc): New const. (s390_ft_exit_gpr_esa): New const. (s390_ft_exit_gpr_zarch): New const. (append_insns): New function. (s390_relocate_instruction): New function. (s390_install_fast_tracepoint_jump_pad): New function. (s390_get_min_fast_tracepoint_insn_len): New function. (s390_get_ipa_tdesc_idx): New function. (struct linux_target_ops): Wire in the above functions. (initialize_low_arch) [!__s390x__]: Don't initialize s390x tdescs. * linux-s390-tdesc.h: New file.
2016-03-29gdbserver/s390: Switch on tracepoint support.Marcin Kościelnicki2-1/+14
Also adds s390 support to gdb.trace testsuite. gdb/gdbserver/ChangeLog: * linux-s390-low.c (s390_supports_tracepoints): New function. (struct linux_target_ops): Fill supports_tracepoints hook. gdb/testsuite/ChangeLog: * gdb.trace/ftrace.exp: Set arg0exp for s390. * gdb.trace/mi-trace-frame-collected.exp: Expect 4 registers on s390. * gdb.trace/mi-trace-unavailable.exp: Set pcnum for s390, add gpr0num variable for GPR 0 instead of assuming it is register 0. * gdb.trace/trace-common.h: Add s390 fast tracepoint placeholder. * lib/trace-support.exp: Add s390 registers.
2016-03-18Check lwp_signal_can_be_delivered for enqueue/dequeue pending signalsYao Qi2-10/+21
The enqueue and dequeue signals in linux_resume_one_lwp_throw use one condition and its inverted one. This patch is to move the condition into a function lwp_signal_can_be_delivered, so that the next patch can change the condition in one place. gdb/gdbserver: 2016-03-18 Yao Qi <yao.qi@linaro.org> * linux-low.c (lwp_signal_can_be_delivered): New function. (linux_resume_one_lwp_throw): Use lwp_signal_can_be_delivered.
2016-03-18Set signal to 0 after enqueue_pending_signalYao Qi2-17/+20
Today, we enqueue signal in linux_resume_one_lwp_throw, but set variable 'signal' many lines below with the comment /* Postpone any pending signal. It was enqueued above. */ signal = 0; I feel difficult to associate code across many lines, and we should move the code close to enqueue_pending_signal call. This is what this patch does in general. After this change, variable 'signal' is set to zero very early, so the 'signal' value in the following debugging message makes no sense, so I remove it from the debugging message. The function returns early if lwp->status_pending_p is true, so 'signal' value in the debugging message doesn't matter, AFAICS. Also, I move one debugging message several lines below to make it close the real ptrace call, if (debug_threads) debug_printf ("Resuming lwp %ld (%s, signal %d, stop %s)\n", lwpid_of (thread), step ? "step" : "continue", signal, lwp->stop_expected ? "expected" : "not expected"); so that the debugging message can reflect what GDBserver does. This is a code refactor and only debugging messages are affected. gdb/gdbserver: 2016-03-18 Yao Qi <yao.qi@linaro.org> * linux-low.c (linux_resume_one_lwp_throw): Set 'signal' to 0 if signal is enqueued. Remove 'signal' from one debugging message. Move one debugging message to some lines below. Remove code setting 'signal' to 0.
2016-03-18Remove redundant WIFSTOPPED checkYao Qi2-1/+6
WIFSTOPPED is checked linux_wstatus_maybe_breakpoint, so WIFSTOPPED in "WIFSTOPPED (wstat) && linux_wstatus_maybe_breakpoint (wstat)" is redundant. This patch removes WIFSTOPPED check. gdb/gdbserver: 2016-03-18 Yao Qi <yao.qi@linaro.org> * linux-low.c (linux_low_filter_event): Remove redundant WIFSTOPPED check together with linux_wstatus_maybe_breakpoint.
2016-03-09gdb: Add tracepoint support for powerpc.Marcin Kościelnicki2-1/+12
gdb/gdbserver/ChangeLog: * linux-ppc-low.c (ppc_supports_tracepoints): New function. (struct linux_target_ops): Wire in the above. gdb/testsuite/ChangeLog: * gdb.trace/ftrace.exp: Set arg0exp for ppc. * gdb.trace/mi-trace-unavailable.exp: Set pcnum for ppc. * gdb.trace/pending.exp: Accept leading dot before function name. * gdb.trace/trace-common.h: Add fast tracepoint dummy insn for ppc. * lib/trace-support.exp: Set registers for ppc.
2016-03-03Update comments to start_step_overYao Qi2-12/+8
I happen to see that comments to start_step_over isn't in sync with code, so this patch is to update the comments. gdb/gdbserver: 2016-03-03 Yao Qi <yao.qi@linaro.org> * linux-low.c: Update comments to start_step_over.
2016-03-03[GDBserver] Leave child suspended when step over parentYao Qi2-5/+17
I see the following GDBserver internal error in two cases, gdb/gdbserver/linux-low.c:1922: A problem internal to GDBserver has been detected. unsuspend LWP 17200, suspended=-1 1. step over a breakpoint on fork/vfork syscall instruction, 2. step over a breakpoint on clone syscall instruction and child threads hits a breakpoint, the stack backtrace is #0 internal_error (file=file@entry=0x44c4c0 "gdb/gdbserver/linux-low.c", line=line@entry=1922, fmt=fmt@entry=0x44c7d0 "unsuspend LWP %ld, suspended=%d\n") at gdb/gdbserver/../common/errors.c:51 #1 0x0000000000424014 in lwp_suspended_decr (lwp=<optimised out>, lwp=<optimised out>) at gdb/gdbserver/linux-low.c:1922 #2 0x000000000042403a in unsuspend_one_lwp (entry=<optimised out>, except=0x66e8c0) at gdb/gdbserver/linux-low.c:2885 #3 0x0000000000405f45 in find_inferior (list=<optimised out>, func=func@entry=0x424020 <unsuspend_one_lwp>, arg=arg@entry=0x66e8c0) at gdb/gdbserver/inferiors.c:243 #4 0x00000000004297de in unsuspend_all_lwps (except=0x66e8c0) at gdb/gdbserver/linux-low.c:2895 #5 linux_wait_1 (ptid=..., ourstatus=ourstatus@entry=0x665ec0 <last_status>, target_options=target_options@entry=0) at gdb/gdbserver/linux-low.c:3632 #6 0x000000000042a764 in linux_wait (ptid=..., ourstatus=0x665ec0 <last_status>, target_options=0) at gdb/gdbserver/linux-low.c:3770 #7 0x0000000000411163 in mywait (ptid=..., ourstatus=ourstatus@entry=0x665ec0 <last_status>, options=options@entry=0, connected_wait=connected_wait@entry=1) at gdb/gdbserver/target.c:214 #8 0x000000000040b1f2 in resume (actions=0x66f800, num_actions=1) at gdb/gdbserver/server.c:2757 #9 0x000000000040f660 in handle_v_cont (own_buf=0x66a630 "vCont;c:p45e9.-1") at gdb/gdbserver/server.c:2719 when GDBserver steps over a thread, other threads have been suspended, the "stepping" thread may create new thread, but GDBserver doesn't set it suspend count to 1. When GDBserver unsuspend threads, the child's suspend count goes to -1, and the assert is triggered. In fact, GDBserver has already taken care of suspend count of new thread when GDBserver is suspending all threads except the one GDBserver wants to step over by https://sourceware.org/ml/gdb-patches/2015-07/msg00946.html + /* If we're suspending all threads, leave this one suspended + too. */ + if (stopping_threads == STOPPING_AND_SUSPENDING_THREADS) + { + if (debug_threads) + debug_printf ("HEW: leaving child suspended\n"); + child_lwp->suspended = 1; + } but that is not enough, because new thread is still can be spawned in the thread which is being stepped over. This patch extends the condition that GDBserver set child's suspend count to one if it is suspending threads or stepping over the thread. gdb/gdbserver: 2016-03-03 Yao Qi <yao.qi@linaro.org> PR server/19736 * linux-low.c (handle_extended_wait): Set child suspended if event_lwp->bp_reinsert isn't zero.
2016-03-02Call enqueue_pending_signal in linux_resume_one_lwp_throwYao Qi2-11/+6
Replace the code which is exactly what enqueue_pending_signal does. gdb/gdbserver: 2016-03-02 Yao Qi <yao.qi@linaro.org> * linux-low.c (linux_resume_one_lwp_throw): Replace code with enqueue_pending_signal.
2016-03-02[OBV] gdbserver: Only write ipa_tdesc_idx if agent is actually loaded.Marcin Kościelnicki2-4/+12
Fixes rather embarassing gdb.trace regressions. gdb/gdbserver/ChangeLog: * tracepoint.c (cmd_qtstart): Only set ipa_tdesc_idx if agent is actually loaded.
2016-02-25gdbserver/s390: Enable high GPRs, VX, TDB with 31-bit gdbserver.Marcin Kościelnicki2-26/+96
Currently, 31-bit gdbserver doesn't support collecting/supplying high GPRs, VX registers, and TDB data. This is not much of a problem now, since machines that have them usually have a 64-bit gdbserver that can be used to debug 31-bit targets just fine. However, with fast tracepoints, it's not possible to use a 64-bit gdbserver with a 31-bit IPA (and thus a 31-bit target), so 31-bit gdbserver has to be used for 31-bit targets. Thus, this patch is needed to allow collecting high GPRs and VX registers on 31-bit targets via fast tracepoints. gdb/gdbserver/ChangeLog: * linux-s390-low.c (s390_num_regs_3264): Define on 31-bit too. (s390_regmap_3264) [!__s390x__]: New global. (s390_collect_ptrace_register): Skip map entries containing -1. (s390_supply_ptrace_register): Ditto. (s390_fill_gprs_high): New function. (s390_store_gprs_high): New function. (s390_regsets): Add NT_S390_HIGH_GPRS. (s390_get_hwcap): Enable on 31-bit. (have_hwcap_s390_high_gprs): Enable on 31-bit. (s390_arch_setup): Enable detection of high GPRs, TDB, VX on 31-bit. Detect NT_S390_HIGH_GPRS. (s390_usrregs_info_3264): Enable on 31-bit. (s390_regs_info): Enable regs_info_3264 on 31-bit. (initialize_low_arch): Initialize s390_regsets_info_3264 on 31-bit.
2016-02-25[PR gdb/13808] gdb.trace: Pass tdesc selected in gdbserver to IPA.Marcin Kościelnicki13-69/+293
If gdbserver and IPA are using different tdesc, they will disagree about 'R' trace packet size. This results in mangled traces. To make sure they pick the same tdesc, gdbserver pokes the tdesc (specified as an index in a target-specific list) into a global variable in IPA. In theory, IPA could find out the tdesc on its own, but that may be complex (in particular, I don't know how to tell whether we have LAST_BREAK on s390 without messing with ptrace), and we'd have to duplicate the logic. Tested on i386 and x86_64. On i386, it fixes two FAILs in ftrace.exp. On x86_64, these failures have been KFAILed - one of them works now, but the other now fails due to an unrelated reason (ugh). gdb/gdbserver/ChangeLog: PR gdb/13808 * Makefile.in: Add i386-*-linux-ipa.o and amd64-*-linux-ipa.o. * configure.srv: Ditto. * linux-aarch64-ipa.c (get_ipa_tdesc): New function. (initialize_low_tracepoint): Remove ipa_tdesc assignment. * linux-amd64-ipa.c: Add "linux-x86-tdesc.h" include. (init_registers_amd64_linux): Remove prototype. (tdesc_amd64_linux): Remove declaration. (get_ipa_tdesc): New function. (initialize_low_tracepoint): Remove ipa_tdesc assignment, initialize remaining tdescs. * linux-i386-ipa.c: Add "linux-x86-tdesc.h" include. (init_registers_i386_linux): Remove prototype. (tdesc_i386_linux): Remove declaration. (get_ipa_tdesc): New function. (initialize_low_tracepoint): Remove ipa_tdesc assignment, initialize remaining tdescs. * linux-low.c (linux_get_ipa_tdesc_idx): New function. (linux_target_ops): wire in linux_get_ipa_tdesc_idx. * linux-low.h (struct linux_target_ops): Add get_ipa_tdesc_idx. * linux-x86-low.c: Move tdesc declarations to linux-x86-tdesc.h. (x86_get_ipa_tdesc_idx): New function. (the_low_target): Wire in x86_get_ipa_tdesc_idx. * linux-x86-tdesc.h: New file. * target.h (struct target_ops): Add get_ipa_tdesc_idx. (target_get_ipa_tdesc_idx): New macro. * tracepoint.c (ipa_tdesc_idx): New macro. (struct ipa_sym_addresses): Add addr_ipa_tdesc_idx. (symbol_list): Add ipa_tdesc_idx. (cmd_qtstart): Write ipa_tdesc_idx in the target. (ipa_tdesc): Remove. (ipa_tdesc_idx): New variable. (get_context_regcache): Use get_ipa_tdesc. (gdb_collect): Ditto. (gdb_probe): Ditto. * tracepoint.h (get_ipa_tdesc): New prototype. (ipa_tdesc): Remove. gdb/testsuite/ChangeLog: PR gdb/13808 * gdb.trace/ftrace.exp (test_fast_tracepoints): Remove kfail.
2016-02-24Handle MIPS Linux SIGTRAP siginfo.si_code valuesPedro Alves2-98/+84
This unbreaks pending/delayed breakpoints handling, as well as hardware watchpoints, on MIPS. Ref: https://sourceware.org/ml/gdb-patches/2016-02/msg00681.html The MIPS kernel reports SI_KERNEL for all kernel generated traps, instead of TRAP_BRKPT / TRAP_HWBKPT, but GDB isn't aware of this. Basically, this commit: - Folds watchpoints logic into check_stopped_by_breakpoint, and renames it to save_stop_reason. - Adds GDB_ARCH_IS_TRAP_HWBKPT. - Makes MIPS set both GDB_ARCH_IS_TRAP_BRPT and GDB_ARCH_IS_TRAP_HWBKPT to SI_KERNEL. In save_stop_reason, we handle the case of the same si_code returning true for both TRAP_BRPT and TRAP_HWBKPT by looking at what the debug registers say. Tested on x86-64 Fedora 20, native and gdbserver. gdb/ChangeLog: 2016-02-24 Pedro Alves <palves@redhat.com> * linux-nat.c (save_sigtrap) Delete. (stop_wait_callback): Call save_stop_reason instead of save_sigtrap. (check_stopped_by_breakpoint): Rename to ... (save_stop_reason): ... this. Bits of save_sigtrap folded here. Use GDB_ARCH_IS_TRAP_HWBKPT and handle ambiguous GDB_ARCH_IS_TRAP_BRKPT / GDB_ARCH_IS_TRAP_HWBKPT. Factor out common code between the USE_SIGTRAP_SIGINFO and !USE_SIGTRAP_SIGINFO blocks. (linux_nat_filter_event): Call save_stop_reason instead of save_sigtrap. * nat/linux-ptrace.h: Check for both SI_KERNEL and TRAP_BRKPT si_code for MIPS. * nat/linux-ptrace.h: Fix "TRAP_HWBPT" typo in x86 table. Add comments on MIPS behavior. (GDB_ARCH_IS_TRAP_HWBKPT): Define for all archs. gdb/gdbserver/ChangeLog: 2016-02-24 Pedro Alves <palves@redhat.com> * linux-low.c (check_stopped_by_breakpoint): Rename to ... (save_stop_reason): ... this. Use GDB_ARCH_IS_TRAP_HWBKPT and handle ambiguous GDB_ARCH_IS_TRAP_BRKPT / GDB_ARCH_IS_TRAP_HWBKPT. Factor out common code between the USE_SIGTRAP_SIGINFO and !USE_SIGTRAP_SIGINFO blocks. (linux_low_filter_event): Call save_stop_reason instead of check_stopped_by_breakpoint and check_stopped_by_watchpoint. Update comments. (linux_wait_1): Update comments.
2016-02-24powerpc: Support z-point type in gdbserver.Wei-cheng Wang2-3/+73
Support z-point, so tracepoints and breakpoints can be inserted at the same location. gdb/gdbserver/ChangeLog: 2016-02-24 Wei-cheng Wang <cole945@gmail.com> * linux-ppc-low.c (ppc_supports_z_point_type): New function: (ppc_insert_point, ppc_remove_point): Insert/remove z-packet breakpoints. (ppc64_emit_ops_vector): Add target ops - ppc_supports_z_point_type, ppc_insert_point, ppc_remove_point.
2016-02-17gdbserver/s390: Advertise Z0 packet support.Marcin Kościelnicki2-1/+22
This is necessary for upcoming tracepoint support - otherwise, setting a tracepoint and a breakpoint on the same address will fail, since gdbserver won't know about gdb's breakpoint. Tested on s390x-ibm-linux-gnu and s390-ibm-linux-gnu, RHEL 7.2. gdb/gdbserver/ChangeLog: * linux-s390-low.c (s390_supports_z_point_type): New function. (struct linux_target_ops): Wire s390_supports_z_point_type in.
2016-02-16Remove PC from syscall_next_pcYao Qi2-3/+8
Method syscall_next_pc of struct arm_get_next_pcs_ops has an argument PC, which is not necessary, because PC can be got from regcache in 'struct arm_get_next_pcs'. This patch removes the PC argument of syscall_next_pc. gdb: 2016-02-16 Yao Qi <yao.qi@linaro.org> * arch/arm-get-next-pcs.h (struct arm_get_next_pcs_ops) <syscall_next_pc>: Remove argument PC. Callers updated. * arm-linux-tdep.c (arm_linux_get_next_pcs_syscall_next_pc): Remove argument PC. Get pc from regcache_read_pc. * arm-tdep.c (arm_get_next_pcs_syscall_next_pc): Remove argument PC. gdb/gdbserver: 2016-02-16 Yao Qi <yao.qi@linaro.org> * linux-arm-low.c (get_next_pcs_syscall_next_pc): Remove argument PC. Get pc from regcache_read_pc.
2016-02-12[gdbserver, aarch64] Use linux_{set,get}_pc_{64,32}bitYao Qi2-24/+10
We can use shared functions linux_{set,get}_pc_{64,32}bit in linux-aarch64-low.c to write and read pc. gdb/gdbserver: 2016-02-12 Yao Qi <yao.qi@linaro.org> * linux-aarch64-low.c (aarch64_get_pc): Call linux_get_pc_64bit or linux_get_pc_32bit. (aarch64_set_pc): Call linux_set_pc_64bit or linux_set_pc_32bit.
2016-02-12[ARM] Fixup PC in software single stepYao Qi2-1/+7
When I exercise GDBserver software single step, I see the following error, which has been already handled by GDB properly. In GDBserver log, we can see, GDBserver tries to single step instruction on 0xb6e0a6e4, and destination address is 0xffff0fe0, stop pc is 0xb6e0a6e4 Writing f001f0e7 to 0xffff0fe0 in process 7132 Failed to insert breakpoint at 0xffff0fe0 (Input/output error). Failed to insert breakpoint at 0xffff0fe0 (-1). (gdb) disassemble __aeabi_read_tp,+8 Dump of assembler code from 0xb6e0a6e0 to 0xb6e0a6e8: 0xb6e0a6e0 <__aeabi_read_tp+0>: mvn r0, #61440 ; 0xf000 0xb6e0a6e4 <__aeabi_read_tp+4>: sub pc, r0, #31 however, it fails inserting breakpoint there. This problem has already fixed by GDB, see comments in arm-linux-tdep.c:arm_linux_software_single_step /* The Linux kernel offers some user-mode helpers in a high page. We can not read this page (as of 2.6.23), and even if we could then we couldn't set breakpoints in it, and even if we could then the atomic operations would fail when interrupted. They are all called as functions and return to the address in LR, so step to there instead. */ so we need to do the same thing in GDB side as well. This patch adds a new field fixup in arm_get_next_pcs_ops, so that we can fix up PC for arm-linux target. In this way, both GDB and GDBserver can single step instructions going to kernel helpers. gdb: 2016-02-12 Yao Qi <yao.qi@linaro.org> * arch/arm-get-next-pcs.c (arm_get_next_pcs): Call self->ops->fixup if it isn't NULL. * arch/arm-get-next-pcs.h: Include gdb_vecs.h. (struct arm_get_next_pcs_ops) <fixup>: New field. * arch/arm-linux.c: Include common-regcache.h and arch/arm-get-next-pcs.h. (arm_linux_get_next_pcs_fixup): New function. * arch/arm-linux.h (arm_linux_get_next_pcs_fixup): Declare. * arm-linux-tdep.c (arm_linux_get_next_pcs_ops): Initialize it with arm_linux_get_next_pcs_fixup. (arm_linux_software_single_step): Move code to arm_linux_get_next_pcs_fixup. * arm-tdep.c (arm_get_next_pcs_ops): Initialize it. gdb/gdbserver: 2016-02-12 Yao Qi <yao.qi@linaro.org> * linux-arm-low.c (get_next_pcs_ops): Initialize it with arm_linux_get_next_pcs_fixup.
2016-02-12gdb.trace: Deduplicate write_inferior_data_ptr.Marcin Kościelnicki2-53/+53
This function is now basically identical to write_inferior_data_pointer, remove it and change all references. gdb/gdbserver/ChangeLog: * tracepoint.c (x_tracepoint_action_download): Change write_inferior_data_ptr to write_inferior_data_pointer. (cmd_qtstart): Likewise. (write_inferior_data_ptr): Remove. (download_agent_expr): Change write_inferior_data_ptr to write_inferior_data_pointer. (download_tracepoint_1): Likewise. (download_tracepoint): Likewise. (download_trace_state_variables): Likewise.
2016-02-11gdbserver: Remove tracepoint_action ops.Wei-cheng Wang2-69/+65
This patch removes 'ops' in tracepoint, and uses helper functions to call action handler instead. The object layout of tracepoint_action may differ in gdbserver and inferior depend on the alignment rule of target ABI, so gdbserver cannot simply copy the object from its memory to inferior memory. For example, struct collect_memory_action { struct tracepoint_action base; { #ifndef IN_PROCESS_AGENT const struct tracepoint_action_ops *ops; #if - char type; | } | ULONGEST addr; | ULONGEST len; - int32_t basereg; }; and on PowerPC, Wihtout ops with ops 0 1 2 3 0 1 2 3 0 |type| PADDING... 0 |ops-------------| 4 ................. 4 |type|PADDING....| 8 |addr------------ 8 |addr------------- c ----------------| c -----------------| 10 |len------------- 10 |len-------------- 14 ----------------| 14 -----------------| 18 |basereg--------| 18 |basereg---------| so we cannot directly copy the object. In this patch, 'ops' is removed in order to make the objects identical. gdb/gdbserver/ChangeLog: 2016-02-11 Wei-cheng Wang <cole945@gmail.com> Marcin Kościelnicki <koriakin@0x04.net> * tracepoint.c (struct tracepoint_action_ops): Remove. (struct tracepoint_action): Remove ops. (m_tracepoint_action_download, r_tracepoint_action_download) (x_tracepoint_action_download, l_tracepoint_action_download): Adjust size and offset accordingly. (m_tracepoint_action_ops, r_tracepoint_action_ops) (x_tracepoint_action_ops, l_tracepoint_action_ops): Remove. (tracepoint_action_send, tracepoint_action_download): New functions. Helpers for trace action handlers. (add_tracepoint_action): Remove setup actions ops. (download_tracepoint_1, tracepoint_send_agent): Call helper functions.
2016-02-10Clear *VAL in regcache_raw_read_unsignedYao Qi2-0/+5
We have function regcache_raw_read_unsigned defined in both GDB and GDBserver, so that it is used in common like this, ULONGEST value; status = regcache_raw_read_unsigned (regcache, regnum, &value); 'value' is correctly set in GDB side, but may not be correctly set in GDBserver, because &value is passed in regcache_raw_read_unsigned but collect_register may only set part of the whole variable. In my test, I see the top half of 'value' is garbage. This patch fixes this problem by clearing *VAL before calling collect_register. gdb/gdbserver: 2016-02-10 Yao Qi <yao.qi@linaro.org> * regcache.c (regcache_raw_read_unsigned): Clear *VAL.
2016-02-09Modernize configure.ac'sSimon Marchi3-4/+10
Using AC_OUTPUT with arguments has been deprecated for some time in autoconf, even in version 2.64, which we are using. This change should not affect functionality. I also removed the "exit 0"'s, they shouldn't be necessary. gdb/ChangeLog: * configure.ac: Use AC_CONFIG_FILES instead of passing arguments to AC_OUTPUT. Remove "exit 0" at the end. * configure: Regenerate. gdb/testsuite/ChangeLog: * configure.ac: Use AC_CONFIG_FILES instead of passing arguments to AC_OUTPUT. * configure: Regenerate. gdb/gdbserver/ChangeLog: * configure.ac: Use AC_CONFIG_FILES instead of passing arguments to AC_OUTPUT. * configure: Regenerate.
2016-02-09Fix siginfo C++ build errorSimon Marchi5-5/+15
Change the signature of gdbserver's siginfo_fixup functions so that it's in line with gdb's. This gets rid of the following build error in C++: /home/emaisin/src/binutils-gdb/gdb/gdbserver/linux-x86-low.c: In function ‘int x86_siginfo_fixup(siginfo_t*, void*, int)’: /home/emaisin/src/binutils-gdb/gdb/gdbserver/linux-x86-low.c:694:21: error: invalid conversion from ‘void*’ to ‘gdb_byte* {aka unsigned char*}’ [-fpermissive] FIXUP_32); ^ In file included from /home/emaisin/src/binutils-gdb/gdb/gdbserver/linux-x86-low.c:31:0: /home/emaisin/src/binutils-gdb/gdb/gdbserver/../nat/amd64-linux-siginfo.h:52:5: error: initializing argument 2 of ‘int amd64_linux_siginfo_fixup_common(siginfo_t*, gdb_byte*, int, amd64_siginfo_fixup_mode)’ [-fpermissive] int amd64_linux_siginfo_fixup_common (siginfo_t *native, gdb_byte *inf, ^ /home/emaisin/src/binutils-gdb/gdb/gdbserver/linux-x86-low.c:698:20: error: invalid conversion from ‘void*’ to ‘gdb_byte* {aka unsigned char*}’ [-fpermissive] FIXUP_X32); ^ In file included from /home/emaisin/src/binutils-gdb/gdb/gdbserver/linux-x86-low.c:31:0: /home/emaisin/src/binutils-gdb/gdb/gdbserver/../nat/amd64-linux-siginfo.h:52:5: error: initializing argument 2 of ‘int amd64_linux_siginfo_fixup_common(siginfo_t*, gdb_byte*, int, amd64_siginfo_fixup_mode)’ [-fpermissive] int amd64_linux_siginfo_fixup_common (siginfo_t *native, gdb_byte *inf, ^ gdb/gdbserver/ChangeLog: * linux-aarch64-low.c (aarch64_linux_siginfo_fixup): Change void * to gdb_byte *. * linux-low.c (siginfo_fixup): Likewise. (linux_xfer_siginfo): Likewise. * linux-low.h (struct linux_target_ops) <siginfo_fixup>: Likewise. * linux-x86-low.c (x86_siginfo_fixup): Likewise.
2016-02-09Revert "Fix build breakage"Walfred Tedeschi2-8/+4
This reverts commit 222cab58b7ed37df6e01dacb0932f400a2588137.
2016-02-09Fix build breakageWalfred Tedeschi2-4/+8
Add a cast to reinterpret a void* as a gdb_byte*. 2016-02-09 Walfred Tedeschi <walfred.tedeschi@intel.com> gdb/gdbserver/ChangeLog: * linux-x86-low.c (x86_siginfo_fixup): Add cast to gdb_byte*.
2016-02-02Merge gdb and gdbserver implementations for siginfoWalfred Tedeschi4-416/+31
Extract the compatible siginfo handling from amd64-linux-nat.c and gdbserver/linux-x86-low to a new file nat/amd64-linux-siginfo.c. 2016-02-02 Walfred Tedeschi <walfred.tedeschi@intel.com> gdb/ChangeLog: * nat/amd64-linux-siginfo.c: New file. * nat/amd64-linux-siginfo.h: New file. * Makefile.in (HFILES_NO_SRCDIR): Add nat/amd64-linux-siginfo.h. (amd64-linux-siginfo.o): New rule. * config/i386/linux64.mh (NATDEPFILES): Add amd64-linux-siginfo.o. * amd64-linux-nat.c (nat/amd64-linux-siginfo.h): New include. (compat_siginfo_from_siginfo, siginfo_from_compat_siginfo) (compat_x32_siginfo_from_siginfo, siginfo_from_compat_x32_siginfo) (compat_timeval, compat_sigval, compat_x32_clock, cpt_si_pid) (cpt_si_uid, cpt_si_timerid, cpt_si_overrun, cpt_si_status) (cpt_si_utime, cpt_si_stime, cpt_si_ptr, cpt_si_addr, cpt_si_band) (cpt_si_fd, si_timerid, si_overrun): Move to nat/amd64-linux-siginfo.c. gdb/gdbserver/ChangeLog: * configure.srv (x86_64-*-linux*): Add amd64-linux-siginfo.o to srv_tgtobj. (i[34567]86-*-linux*): Add amd64-linux-siginfo.o to srv_tgtobj. * linux-x86-low.c [__x86_64__]: Include "nat/amd64-linux-siginfo.h". (compat_siginfo_from_siginfo, siginfo_from_compat_siginfo) (compat_x32_siginfo_from_siginfo, siginfo_from_compat_x32_siginfo) (compat_timeval, compat_sigval, compat_x32_clock, cpt_si_pid) (cpt_si_uid, cpt_si_timerid, cpt_si_overrun, cpt_si_status) (cpt_si_utime, cpt_si_stime, cpt_si_ptr, cpt_si_addr, cpt_si_band) (cpt_si_fd, si_timerid, si_overrun): Move from nat/amd64-linux-siginfo.c. * Makefile.in (amd64-linux-siginfo.o:): New rule.
2016-01-28Import strchrnul from gnulib and use itSimon Marchi2-12/+9
For a forthcoming patch, I need a "skip_to_colon" function. I noticed there are two skip_to_semicolon (one in gdb and one in gdbserver). I thought we could put it in common/, and generalize it for any character. It turns out that the strchrnul function does exactly that. I imported the corresponding module from gnulib, for those systems that do not have it. There are probably more places where this function can be used instead of doing the work by hand (I am looking at remote-utils.c::look_up_one_symbol). gdb/ChangeLog: * remote.c (skip_to_semicolon): Remove. (remote_parse_stop_reply): Use strchrnul instead of skip_to_semicolon. * gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add strchrnul. * gnulib/aclocal.m4: Regenerate. * gnulib/config.in: Regenerate. * gnulib/configure: Regenerate. * gnulib/import/Makefile.am: Regenerate. * gnulib/import/Makefile.in: Regenerate. * gnulib/import/m4/gnulib-cache.m4: Regenerate. * gnulib/import/m4/gnulib-comp.m4: Regenerate. * gnulib/import/m4/rawmemchr.m4: New file. * gnulib/import/m4/strchrnul.m4: New file. * gnulib/import/rawmemchr.c: New file. * gnulib/import/rawmemchr.valgrind: New file. * gnulib/import/strchrnul.c: New file. * gnulib/import/strchrnul.valgrind: New file. gdb/gdbserver/ChangeLog: * server.c (skip_to_semicolon): Remove. (process_point_options): Use strchrnul instead of skip_to_semicolon.
2016-01-26Remove argument pc in get_next_pcsYao Qi4-6/+12
Nowadays, get_next_pcs in linux_target_ops has two parameters PC and REGCACHE. Parameter PC looks redundant because it can be go from REGCACHE. The patch is to remove PC from the arguments for various functions. gdb: 2016-01-26 Yao Qi <yao.qi@linaro.org> * arch/arm-get-next-pcs.c (thumb_deal_with_atomic_sequence_raw): Remove argument pc. Get pc by regcache_read_pc. Callers updated. (arm_deal_with_atomic_sequence_raw): Likewise. (thumb_get_next_pcs_raw): Likewise. (arm_get_next_pcs_raw): Likewise. (arm_get_next_pcs): Remove argument pc. Callers updated. * arch/arm-get-next-pcs.h (arm_get_next_pcs): Update declaration. gdb/gdbserver: 2016-01-26 Yao Qi <yao.qi@linaro.org> * linux-arm-low.c (arm_gdbserver_get_next_pcs): Remove argument pc. * linux-low.c (install_software_single_step_breakpoints): Don't call regcache_read_pc. * linux-low.h (struct linux_target_ops) <get_next_pcs>: Remove argument pc.
2016-01-26[GDBserver] Use regcache_read_pc in install_software_single_step_breakpointsYao Qi2-1/+7
In install_software_single_step_breakpoints, we've got the regcache of current_thread, so we don't have to bother get_pc to get pc, instead we can get pc from regcache directly. Note that the callers of install_software_single_step_breakpoints have already switched current_thread to LWP. Since the pc is got from regcache_read_pc, in the next patch, we can get pc inside the implementation of *the_low_target.get_next_pcs and stop passing pc to *the_low_target.get_next_pcs. gdb/gdbserver: 2016-01-26 Yao Qi <yao.qi@linaro.org> * linux-low.c (install_software_single_step_breakpoints): Call regcache_read_pc instead of get_pc.
2016-01-26[GDBserver] Block and unblock SIGIOYao Qi2-14/+30
Nowadays, GDBserver disables async io (by ignoring SIGIO) when process a serial event, and enables async io (by installing signal handler) when resume the inferior and wait. GDBserver may miss SIGIO (by interrupt) and doesn't process SIGIO in time, which is shown by gdb.base/interrupt-noterm.exp. In the test, GDB sends "continue &" and then "interrupt". if '\003' arrives at a period between GDBserver receives vCont;c and enables async io, SIGIO is ignored because signal handler isn't installed. GDBserver waits for the inferior and can not notice '\003' until it returns from wait. This patch changes the code to install SIGIO handler early, but block and unblock SIGIO as needed. In this way, we don't remove SIGIO handler, so SIGIO can't be ignored. However, GDBserver needs to remove the signal handler when connection is closed. gdb/gdbserver: 2016-01-26 Yao Qi <yao.qi@linaro.org> * remote-utils.c (remote_close) [!USE_WIN32API]: Ignore SIGIO. (unblock_async_io): Rename to ... (block_unblock_async_io): ... it. New function. (enable_async_io): Don't install SIGIO handler. Unblock it instead. (disable_async_io): Don't ignore SIGIO. Block it instead. (initialize_async_io): Install SIGIO handler. Don't call unblock_async_io.
2016-01-26[GDBserver] Check input interrupt after reading in a packetYao Qi2-0/+21
GDBserver may read some packet together with '\003' in one go. We've already checked '\003' first when reading packet by my patch, Check input interrupt first when reading packet https://sourceware.org/ml/gdb-patches/2016-01/msg00057.html but if we don't check '\003' *after* each packet, the interrupt will be processed next time GDBserver reads from the buffer, so that the interrupt isn't processed in time. For example, GDB sends vCont;c and interrupt (see gdb.base/interrupt-noterm.exp), we'll resume the inferior and wait once packet vCont;c is seen. If we don't check the interrupt character after vCont;c packet, interrupt character will stay in the buffer unattended until GDBserver returns from the wait, which may take a while. Note that since we've read '\003' from file descriptor, SIGIO signal handler input_interrupt doesn't help either. This issue can be exposed by hacking the end of getpkt like @@ -1041,6 +1050,9 @@ getpkt (char *buf) } } + if (readchar_bufcnt > 0) + gdb_assert (*readchar_bufp != '\003'); + return bp - buf; } and this can trigger internal error, (gdb) PASS: gdb.base/interrupt-noterm.exp: interrupt Remote connection closed^M (gdb) FAIL: gdb.base/interrupt-noterm.exp: inferior received SIGINT Remote debugging from host 10.2.206.40^M /home/yao/SourceCode/gnu/gdb/git/gdb/gdbserver/remote-utils.c:1054: A problem internal to GDBserver has been detected.^M getpkt: Assertion `*readchar_bufp != '\003'' failed.^M This patch is to peek the buffer, if it is '\003', consume it and call *the_target->request_interrupt. gdb/gdbserver: 2016-01-26 Yao Qi <yao.qi@linaro.org> * remote-utils.c (getpkt): If the buffer isn't empty, and the first character is '\003', call *the_target->request_interrupt.
2016-01-25Remove new_thread_notify and dead_thread_notifyYao Qi3-35/+7
They were added by PATCH: Multithreaded debugging for gdbserver https://sourceware.org/ml/gdb-patches/2002-06/msg00157.html but as a no-op, and the last usage of them was removed by [gdbserver/RFC/RFA] Implement multiprocess extensions, add linux multiproces support. https://sourceware.org/ml/gdb-patches/2009-03/msg00667.html This patch is to remove them. gdb/gdbserver: 2016-01-25 Yao Qi <yao.qi@linaro.org> * remote-utils.c (new_thread_notify): Remove. (dead_thread_notify): Likewise. * remote-utils.h (new_thread_notify): Remove declaration. (dead_thread_notify): Likewise.
2016-01-23gdb.trace: Fix another expected message on continue.Marcin Kościelnicki1-0/+4
Missed one message in bd0a71fa16f668341a9361c695bc3ca44d27b322, since it didn't trigger on s390x or amd64 (fast tracepoint out of range due to shared library usage), noticed on s390. Pushed as obvious. gdb/testsuite/ChangeLog: * gdb.trace/pending.exp: Fix expected message on continue.
2016-01-22gdb.trace: Fix write_inferior_data_ptr on 32-bit big-endian machines.Marcin Kościelnicki2-3/+10
Noticed and tested on 31-bit s390. This bug caused completely broken fast tracepoints. gdb/gdbserver/ChangeLog: * tracepoint.c (write_inferior_data_ptr): Cast to uintptr_t, so that it works properly on big-endian machines where sizeof (CORE_ADDR) != sizeof (void *).
2016-01-21gdb: Respect CXXFLAGS when building with C++ compilerPedro Alves3-2/+15
Currently, even when built with --enable-build-with-cxx, gdb uses CFLAGS instead of CXXFLAGS. This commit fixes it. CXXFLAGS set in the environment when configure was run is now honored in the generated gdb/Makefile, and you can also override CXXFLAGS in the command like at make time, with the usual 'make CXXFLAGS="..."' Objects built with a C compiler (e.g., gnulib) still honor CFLAGS instead. gdb/ChangeLog: 2016-01-21 Pedro Alves <palves@redhat.com> * Makefile.in (COMPILER_CFLAGS): New. (CXXFLAGS): Get it from configure. (INTERNAL_CFLAGS_BASE, INTERNAL_LDFLAGS): Use COMPILER_CFLAGS instead of CFLAGS. * build-with-cxx.m4 (GDB_AC_BUILD_WITH_CXX): Set and AC_SUBST COMPILER_CFLAGS. * configure: Regenerate. gdb/gdbserver/ChangeLog: 2016-01-21 Pedro Alves <palves@redhat.com> * Makefile.in (COMPILER_CFLAGS, CXXFLAGS): New. (INTERNAL_CFLAGS_BASE): Use COMPILER_CFLAGS instead of CFLAGS. * configure: Regenerate.
2016-01-21Detect the arm/thumb mode of code SIGRETURN or RT_SIGRETURN returns toYao Qi2-3/+20
This patch fixes the following regression introduced by commit d0e59a68 step^M 39 } /* handler */^M 1: x/i $pc^M => 0x8740 <handler+80>: sub sp, r11, #0^M (gdb) step^M ^M Program received signal SIGSEGV, Segmentation fault.^M setitimer () at ../sysdeps/unix/syscall-template.S:81^M 81 ../sysdeps/unix/syscall-template.S: No such file or directory.^M 1: x/i $pc^M => 0xb6eff9c0 <setitimer>: push {r7}^M (gdb) FAIL: gdb.base/sigstep.exp: continue to handler, si+advance in handler, step from handler: leave handler in my test setting, program is compiled in arm mode, but the glibc is built in thumb mode, so when we do 'step' to step over syscall instruction svc for SIGRETURN, GDB should set breakpoint for arm mode in the program, even though the current program in glibc is in thumb mode. Current GDB doesn't consider the case that the mode of program SIGRETURN goes to can be different from current program mode. In fact, GDB has taken care of this arm/thumb mode changes already, see /* Copy the value of next pc of sigreturn and rt_sigrturn into PC, return 1. In addition, set IS_THUMB depending on whether we will return to ARM or Thumb code. Return 0 if it is not a rt_sigreturn/sigreturn syscall. */ static int arm_linux_sigreturn_return_addr (struct frame_info *frame, unsigned long svc_number, CORE_ADDR *pc, int *is_thumb) but in the commit d0e59a68 > - arm_linux_sigreturn_return_addr (frame, svc_number, &return_addr, &is_thumb); > + if (svc_number == ARM_SIGRETURN || svc_number == ARM_RT_SIGRETURN) > + next_pc = arm_linux_sigreturn_next_pc (regcache, svc_number); the IS_THUMB setting is lost, so it is a regression. gdb: 2016-01-21 Yao Qi <yao.qi@linaro.org> * arm-linux-tdep.c (arm_linux_sigreturn_next_pc): Add parameter is_thumb and set it according to CPSR saved on the stack. (arm_linux_get_next_pcs_syscall_next_pc): Pass is_thumb to arm_linux_sigreturn_next_pc. gdb/gdbserver: 2016-01-21 Yao Qi <yao.qi@linaro.org> * linux-arm-low.c (arm_sigreturn_next_pc): Add parameter is_thumb and set it according to CPSR saved on the stack. (get_next_pcs_syscall_next_pc): Pass is_thumb to arm_sigreturn_next_pc.
2016-01-18Replace some $ARCH_{get,set}_pc with linux_{get,set}_pc_64bitYao Qi5-32/+46
This patch is the follow-up of https://sourceware.org/ml/gdb-patches/2016-01/msg00164.html to provide linux_{get,set}_pc_64bit functions. Rebuild GDBserver with tilegx-linux-gcc. Not tested. I think about pc in Tile-GX a little bit. Looks current Tile-GX supports debugging 32-bit program (multi-arch), but PC is always 64-bit. See this thread https://sourceware.org/ml/gdb-patches/2013-02/msg00113.html and GDBserver reads PC as 64-bit through ptrace. However, if the inferior is 32-bit, the PC in the target description and regcache is 32-bit, so only 32-bit contents are sent back GDB. Anyway, Tile-GX GDBserver may have some problems here, but this patch doesn't change anything. gdb/gdbserver: 2016-01-18 Yao Qi <yao.qi@linaro.org> * linux-low.c (linux_set_pc_64bit): New function. (linux_get_pc_64bit): New function. * linux-low.h (linux_set_pc_64bit, linux_get_pc_64bit): Declare. * linux-sparc-low.c (debug_threads): Remove declaration. (sparc_get_pc): Remove. (the_low_target): Use linux_get_pc_64bit instead of sparc_get_pc. * linux-tile-low.c (tile_get_pc, tile_set_pc): Remove. (the_low_target): Use linux_get_pc_64bit and linux_set_pc_64bit.
2016-01-18Replace some $ARCH_{get,set}_pc with linux_{get,set}_pc_32bitYao Qi12-180/+83
This patch adds a pair of new functions linux_get_pc_32bit and linux_set_pc_32bit which get and set 32-bit register "pc" from regcache. This function can be used some targets and these own $ARCH_{get,set}_pc are replaced by linux_{get,set}_pc_32bit respectively. This patch touches many targets, but I only have arm board to test and no regression. I also rebuilt nios2-linux GDBserver. If it is right to go, I'll post the 64-bit counterpart later. gdb/gdbserver: 2016-01-18 Yao Qi <yao.qi@linaro.org> * linux-arm-low.c (debug_threads): Remove declaration. (arm_get_pc, arm_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-bfin-low.c (bfin_get_pc, bfin_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-cris-low.c (debug_threads): Remove declaration. (cris_get_pc, cris_set_pc,): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-crisv32-low.c (debug_threads): Remove declaration. (cris_get_pc, cris_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-low.c: Include inttypes.h. (linux_get_pc_32bit, linux_set_pc_32bit): New functions. * linux-low.h (linux_get_pc_32bit, linux_set_pc_32bit): Declare. * linux-m32r-low.c (m32r_get_pc, m32r_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-m68k-low.c (m68k_get_pc, m68k_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-nios2-low.c (nios2_get_pc, nios2_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-sh-low.c (sh_get_pc, sh_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit. * linux-xtensa-low.c (xtensa_get_pc, xtensa_set_pc): Remove. (the_low_target): Use linux_get_pc_32bit and linux_set_pc_32bit.
2016-01-18Fix gdbserver build failure on targets without forkGary Benson4-54/+307
This commit fixes nat/linux-namespaces.c to build correctly on targets without fork. gdb/ChangeLog: * nat/linux-namespaces.c (do_fork): New function. (linux_mntns_get_helper): Use the above. gdb/gdbserver/ChangeLog: * configure.ac (AC_FUNC_FORK): New check. * config.in: Regenerate. * configure: Likewise.