1. 07 Jun, 2022 3 commits
    • Yonghong Song's avatar
      libbpf: Fix an error in 64bit relocation value computation · b58b2b3a
      Yonghong Song authored
      Currently, the 64bit relocation value in the instruction
      is computed as follows:
        __u64 imm = insn[0].imm + ((__u64)insn[1].imm << 32)
      
      Suppose insn[0].imm = -1 (0xffffffff) and insn[1].imm = 1.
      With the above computation, insn[0].imm will first sign-extend
      to 64bit -1 (0xffffffffFFFFFFFF) and then add 0x1FFFFFFFF,
      producing incorrect value 0xFFFFFFFF. The correct value
      should be 0x1FFFFFFFF.
      
      Changing insn[0].imm to __u32 first will prevent 64bit sign
      extension and fix the issue. Merging high and low 32bit values
      also changed from '+' to '|' to be consistent with other
      similar occurences in kernel and libbpf.
      Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Acked-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
      Signed-off-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/r/20220607062610.3717378-1-yhs@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      b58b2b3a
    • Yonghong Song's avatar
      libbpf: Permit 64bit relocation value · 77628165
      Yonghong Song authored
      Currently, the libbpf limits the relocation value to be 32bit
      since all current relocations have such a limit. But with
      BTF_KIND_ENUM64 support, the enum value could be 64bit.
      So let us permit 64bit relocation value in libbpf.
      Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/r/20220607062605.3716779-1-yhs@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      77628165
    • Yonghong Song's avatar
      bpf: Add btf enum64 support · 6089fb32
      Yonghong Song authored
      Currently, BTF only supports upto 32bit enum value with BTF_KIND_ENUM.
      But in kernel, some enum indeed has 64bit values, e.g.,
      in uapi bpf.h, we have
        enum {
              BPF_F_INDEX_MASK                = 0xffffffffULL,
              BPF_F_CURRENT_CPU               = BPF_F_INDEX_MASK,
              BPF_F_CTXLEN_MASK               = (0xfffffULL << 32),
        };
      In this case, BTF_KIND_ENUM will encode the value of BPF_F_CTXLEN_MASK
      as 0, which certainly is incorrect.
      
      This patch added a new btf kind, BTF_KIND_ENUM64, which permits
      64bit value to cover the above use case. The BTF_KIND_ENUM64 has
      the following three fields followed by the common type:
        struct bpf_enum64 {
          __u32 nume_off;
          __u32 val_lo32;
          __u32 val_hi32;
        };
      Currently, btf type section has an alignment of 4 as all element types
      are u32. Representing the value with __u64 will introduce a pad
      for bpf_enum64 and may also introduce misalignment for the 64bit value.
      Hence, two members of val_hi32 and val_lo32 are chosen to avoid these issues.
      
      The kflag is also introduced for BTF_KIND_ENUM and BTF_KIND_ENUM64
      to indicate whether the value is signed or unsigned. The kflag intends
      to provide consistent output of BTF C fortmat with the original
      source code. For example, the original BTF_KIND_ENUM bit value is 0xffffffff.
      The format C has two choices, printing out 0xffffffff or -1 and current libbpf
      prints out as unsigned value. But if the signedness is preserved in btf,
      the value can be printed the same as the original source code.
      The kflag value 0 means unsigned values, which is consistent to the default
      by libbpf and should also cover most cases as well.
      
      The new BTF_KIND_ENUM64 is intended to support the enum value represented as
      64bit value. But it can represent all BTF_KIND_ENUM values as well.
      The compiler ([1]) and pahole will generate BTF_KIND_ENUM64 only if the value has
      to be represented with 64 bits.
      
      In addition, a static inline function btf_kind_core_compat() is introduced which
      will be used later when libbpf relo_core.c changed. Here the kernel shares the
      same relo_core.c with libbpf.
      
        [1] https://reviews.llvm.org/D124641Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
      Signed-off-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/r/20220607062600.3716578-1-yhs@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      6089fb32
  2. 03 Jun, 2022 5 commits
  3. 02 Jun, 2022 32 commits