This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Shorter fast tracepoints


One of the downsides of fast tracepoints is that because they are typically implemented with multi-byte jump instructions (so as to avoid expensive trap handlers and context switches), they can't be inserted anywhere that you might like. On the x86, this is especially troublesome because the general jump is five bytes long, and well-optimized code isn't even going to have that many 5-byte instructions. The x86 does offer a jump with a 2-byte address, although it needs a prefix and so ends up being four bytes in all. This patch, then, does the work of making that possible for 32-bit x86 Linux.

The ugly part is that the 2-byte address is in the low 64K of memory, which may or may not be available - GDB has to check /proc/sys/vm/mmap_min_addr. Fortunately users can tweak it manually (via sysctl) if the preset is to block out all of low memory.

This brings up two troublesome points about this patch as it stands. First, documentation. As it stands, the patch to the manual says nothing about fooling with the kernel's mmap_min_addr. Should it? It's very system-specific, and the user would only need to do anything special if mmap_min_addr were set to 64K or higher, otherwise everything quietly works as desired.

Second, this is hard to write a test case for. Certainly asm hackery to available to create the 4-byte instruction, but if mmap_min_addr is too high, the necessary sysctl-ing requires a sudo, and I don't think we normally allow sudo's in the testsuite. In any case, this patch is not causing any regressions in the current tests.

(Many thanks to Kwok for doing the real work, I'm just massaging it a bit.)

Stan

2011-10-28  Stan Shebs <stan@codesourcery.com>
        Kwok Cheung Yeung <kcy@codesourcery.com>

    * NEWS: Document new qTMinFTPILen packet.
    * i386-tdep.c (i386_fast_tracepoint_valid_at): Query target for
    the minimum instruction size for fast tracepoints.
    * target.h (struct target_ops): Add new method
    to_get_min_fast_tracepoint_insn_len.
    (target_get_min_fast_tracepoint_insn_len): New.
    * target.c (update_current_target): Set up new target operation.
    * remote.c (remote_write_bytes_aux): Fix typo.
    (remote_download_tracepoint): Revert to regular tracepoint if a
    fast tracepoint is placed on an instruction that is too short.
    (remote_get_min_fast_tracepoint_insn_len): New.
    (init_remote_ops): Initialize new field.

    [gdb/gdbserver]
    * linux-x86-low.c (small_jump_insn): New.
    (i386_install_fast_tracepoint_jump_pad): Add arguments for
    trampoline and error message, build a trampoline and issue a small
    jump instruction to it.
    (x86_install_fast_tracepoint_jump_pad): Add arguments for
    trampoline and error message.
    (x86_get_min_fast_tracepoint_insn_len): New.
    (the_low_target): Add call to x86_get_min_fast_tracepoint_insn_len.
    * linux-low.h (struct linux_target_ops): Add arguments to
    install_fast_tracepoint_jump_pad operation, add new operation.
    * linux-low.c (linux_install_fast_tracepoint_jump_pad): Add
    arguments.
    (linux_get_min_fast_tracepoint_insn_len): New function.
    (linux_target_op): Add new operation.
    * tracepoint.c (gdb_trampoline_buffer): New IPA variable.
    (gdb_trampoline_buffer_end): Ditto.
    (gdb_trampoline_buffer_error): Ditto.
    (struct ipa_sym_addresses): Add fields for new IPA variables.
    (symbol_list): Add entries for new IPA variables.
    (struct tracepoint): Add fields to hold the address range of the
    trampoline used by the tracepoint.
    (trampoline_buffer_head): New static variable.
    (trampoline_buffer_tail): Ditto.
    (claim_trampoline_space): New function.
    (have_fast_tracepoint_trampoline_buffer): New function.
    (cmd_qtstart): Return errors in packet reply, fill in trampoline
    fields of tracepoint structure.
    (cmd_qtminftpilen): New function.
    (handle_tracepoint_query): Add response to qTMinFTPILen packet.
    (fast_tracepoint_from_trampoline_address): New function.
    (fast_tracepoint_collecting): Handle trampoline as part of jump
    pad space.
    (set_trampoline_buffer_space): New function.
    (initialize_tracepoint): Initialize new IPA variables.
    * target.h (struct target_ops): Add arguments to
    install_fast_tracepoint_jump_pad operation, add new
    get_min_fast_tracepoint_insn_len operation.
    (target_get_min_fast_tracepoint_insn_len): New.
    (install_fast_tracepoint_jump_pad): Add arguments.
    * linux-i386-ipa.c: Include extra header files.
    (initialize_fast_tracepoint_trampoline_buffer): New function.
    (initialize_low_tracepoint): Call it.
    * server.h (set_trampoline_buffer_space): Declare.
    (claim_trampoline_space): Ditto.
    (have_fast_tracepoint_trampoline_buffer): Ditto.

    [gdb/doc]
    * gdb.texinfo (Tracepoint Packets): Document new qTMinFTPILen packet.

Attachment: tshort-patch-1
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]