123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package btf
- import (
- "bytes"
- "github.com/cilium/ebpf/internal"
- )
- // info describes a BTF object.
- type info struct {
- BTF *Spec
- ID ID
- // Name is an identifying name for the BTF, currently only used by the
- // kernel.
- Name string
- // KernelBTF is true if the BTf originated with the kernel and not
- // userspace.
- KernelBTF bool
- }
- func newInfoFromFd(fd *internal.FD) (*info, error) {
- // We invoke the syscall once with a empty BTF and name buffers to get size
- // information to allocate buffers. Then we invoke it a second time with
- // buffers to receive the data.
- bpfInfo, err := bpfGetBTFInfoByFD(fd, nil, nil)
- if err != nil {
- return nil, err
- }
- btfBuffer := make([]byte, bpfInfo.btfSize)
- nameBuffer := make([]byte, bpfInfo.nameLen)
- bpfInfo, err = bpfGetBTFInfoByFD(fd, btfBuffer, nameBuffer)
- if err != nil {
- return nil, err
- }
- spec, err := loadRawSpec(bytes.NewReader(btfBuffer), internal.NativeEndian, nil, nil)
- if err != nil {
- return nil, err
- }
- return &info{
- BTF: spec,
- ID: ID(bpfInfo.id),
- Name: internal.CString(nameBuffer),
- KernelBTF: bpfInfo.kernelBTF != 0,
- }, nil
- }
|