• A
    libbpf: Add USDT notes parsing and resolution logic · 74cc6311
    Andrii Nakryiko 提交于
    Implement architecture-agnostic parts of USDT parsing logic. The code is
    the documentation in this case, it's futile to try to succinctly
    describe how USDT parsing is done in any sort of concreteness. But
    still, USDTs are recorded in special ELF notes section (.note.stapsdt),
    where each USDT call site is described separately. Along with USDT
    provider and USDT name, each such note contains USDT argument
    specification, which uses assembly-like syntax to describe how to fetch
    value of USDT argument. USDT arg spec could be just a constant, or
    a register, or a register dereference (most common cases in x86_64), but
    it technically can be much more complicated cases, like offset relative
    to global symbol and stuff like that. One of the later patches will
    implement most common subset of this for x86 and x86-64 architectures,
    which seems to handle a lot of real-world production application.
    
    USDT arg spec contains a compact encoding allowing usdt.bpf.h from
    previous patch to handle the above 3 cases. Instead of recording which
    register might be needed, we encode register's offset within struct
    pt_regs to simplify BPF-side implementation. USDT argument can be of
    different byte sizes (1, 2, 4, and 8) and signed or unsigned. To handle
    this, libbpf pre-calculates necessary bit shifts to do proper casting
    and sign-extension in a short sequences of left and right shifts.
    
    The rest is in the code with sometimes extensive comments and references
    to external "documentation" for USDTs.
    Signed-off-by: NAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    Reviewed-by: NAlan Maguire <alan.maguire@oracle.com>
    Reviewed-by: NDave Marchevsky <davemarchevsky@fb.com>
    Link: https://lore.kernel.org/bpf/20220404234202.331384-4-andrii@kernel.org
    74cc6311
usdt.c 32.8 KB