1
// SPDX-License-Identifier: Apache-2.0
2
// Copyright Authors of Tetragon
9
"github.com/cilium/ebpf"
10
"github.com/cilium/ebpf/asm"
13
func UpdateStatsMap(m *ebpf.Map, val int64) error {
14
if m.KeySize() != uint32(4) || m.ValueSize() != uint32(8) {
15
return fmt.Errorf("Wrong key/value size")
18
if m.Type() != ebpf.PerCPUArray {
19
return fmt.Errorf("Wrong map type")
22
prog, err := ebpf.NewProgram(&ebpf.ProgramSpec{
23
Type: ebpf.SocketFilter,
24
Instructions: asm.Instructions{
26
asm.LoadMapPtr(asm.R1, m.FD()),
29
asm.LoadImm(asm.R2, 0, asm.DWord),
30
asm.StoreMem(asm.RFP, -4, asm.R2, asm.Word),
33
asm.Mov.Reg(asm.R2, asm.RFP),
34
asm.Add.Imm(asm.R2, -4),
36
asm.FnMapLookupElem.Call(),
38
// NULL ptr, jump to error
39
asm.JEq.Imm(asm.R0, 0, "error"),
41
// add 'val' to the elem value
42
asm.LoadImm(asm.R1, val, asm.DWord),
43
asm.StoreXAdd(asm.R0, asm.R1, asm.DWord),
46
asm.LoadImm(asm.R0, 0, asm.DWord),
50
asm.LoadImm(asm.R0, 1, asm.DWord).WithSymbol("error"),
61
// not used, but needed to pass program test run
62
in := make([]byte, 20)
66
opts := ebpf.RunOptions{Data: in}
67
ret, err = prog.Run(&opts)
69
// executed, but failed in bpf program above
70
if err == nil && ret != 0 {
71
err = fmt.Errorf("Failed to update map value")