diff --git a/pkg/bpf/detect.go b/pkg/bpf/detect.go index 25085fc65c2..e728f78c273 100644 --- a/pkg/bpf/detect.go +++ b/pkg/bpf/detect.go @@ -13,6 +13,7 @@ import ( "github.com/cilium/ebpf" "github.com/cilium/ebpf/asm" + "github.com/cilium/ebpf/features" "github.com/cilium/ebpf/link" "golang.org/x/sys/unix" ) @@ -23,62 +24,17 @@ type Feature struct { } var ( - overrideHelper Feature - signalHelper Feature - kprobeMulti Feature - buildid Feature - modifyReturn Feature - largeProgramSize Feature + kprobeMulti Feature + buildid Feature + modifyReturn Feature ) -func detectOverrideHelper() bool { - prog, err := ebpf.NewProgram(&ebpf.ProgramSpec{ - Type: ebpf.Kprobe, - Instructions: asm.Instructions{ - asm.LoadImm(asm.R2, 2, asm.DWord), - asm.Instruction{OpCode: asm.OpCode(asm.JumpClass).SetJumpOp(asm.Call), Constant: 58}, - asm.LoadImm(asm.R0, 0, asm.DWord), - asm.Return(), - }, - License: "GPL", - }) - if err != nil { - return false - } - prog.Close() - return true -} - func HasOverrideHelper() bool { - overrideHelper.init.Do(func() { - overrideHelper.detected = detectOverrideHelper() - }) - return overrideHelper.detected -} - -func detectSignalHelper() bool { - prog, err := ebpf.NewProgram(&ebpf.ProgramSpec{ - Type: ebpf.Kprobe, - Instructions: asm.Instructions{ - asm.LoadImm(asm.R2, 2, asm.DWord), - asm.Instruction{OpCode: asm.OpCode(asm.JumpClass).SetJumpOp(asm.Call), Constant: 109}, - asm.LoadImm(asm.R0, 0, asm.DWord), - asm.Return(), - }, - License: "GPL", - }) - if err != nil { - return false - } - prog.Close() - return true + return features.HaveProgramHelper(ebpf.Kprobe, asm.FnOverrideReturn) == nil } func HasSignalHelper() bool { - signalHelper.init.Do(func() { - signalHelper.detected = detectSignalHelper() - }) - return signalHelper.detected + return features.HaveProgramHelper(ebpf.Kprobe, asm.FnSendSignal) == nil } func detectKprobeMulti() bool { @@ -170,32 +126,8 @@ func HasModifyReturn() bool { return modifyReturn.detected } -func detectLargeProgramSize() bool { - insns := asm.Instructions{} - - for i := 0; i < 4096; i++ { - insns = append(insns, asm.Mov.Imm(asm.R0, 1)) - } - insns = append(insns, asm.Return()) - - prog, err := ebpf.NewProgram(&ebpf.ProgramSpec{ - Type: ebpf.Kprobe, - Instructions: insns, - AttachType: ebpf.AttachModifyReturn, - License: "MIT", - }) - if err != nil { - return false - } - prog.Close() - return true -} - func HasProgramLargeSize() bool { - largeProgramSize.init.Do(func() { - largeProgramSize.detected = detectLargeProgramSize() - }) - return largeProgramSize.detected + return features.HaveLargeInstructions() == nil } func LogFeatures() string {