summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/generate/codegen_test.go18
-rw-r--r--internal/generate/testdata.go29
2 files changed, 47 insertions, 0 deletions
diff --git a/internal/generate/codegen_test.go b/internal/generate/codegen_test.go
index d74939b..b0e6f75 100644
--- a/internal/generate/codegen_test.go
+++ b/internal/generate/codegen_test.go
@@ -397,6 +397,24 @@ func TestGenerateEpollCreateHandlerUsesZeroFlags(t *testing.T) {
requireContains(t, output, "ev->ret = ctx->ret;")
}
+func TestGenerateEpollCreate1HandlerUsesArg0Flags(t *testing.T) {
+ output := generateFromPair(t, FormatEpollCreate1, FormatExitEpollCreate1)
+
+ requireContains(t, output, "struct eventfd_event *ev")
+ requireContains(t, output, "ev->event_type = ENTER_EVENTFD_EVENT;")
+ requireContains(t, output, "ev->trace_id = SYS_ENTER_EPOLL_CREATE1;")
+ // epoll_create1(flags) carries its flags (e.g. EPOLL_CLOEXEC) in args[0];
+ // the generated enter handler must capture it rather than hardcoding 0.
+ requireContains(t, output, "__s32 flags = (__s32)ctx->args[0];")
+ if strings.Contains(output, "__s32 flags = 0;\n bpf_map_update_elem") {
+ t.Error("epoll_create1 enter handler must read ctx->args[0] as flags, not 0")
+ }
+ requireContains(t, output, "ev->ret = -1;")
+ requireContains(t, output, "SEC(\"tracepoint/syscalls/sys_exit_epoll_create1\")")
+ requireContains(t, output, "ev->event_type = EXIT_EVENTFD_EVENT;")
+ requireContains(t, output, "ev->ret = ctx->ret;")
+}
+
func TestGeneratePidfdOpenHandlerUsesArg1Flags(t *testing.T) {
output := generateFromPair(t, FormatPidfdOpen, FormatExitPidfdOpen)
diff --git a/internal/generate/testdata.go b/internal/generate/testdata.go
index 9b57983..9676491 100644
--- a/internal/generate/testdata.go
+++ b/internal/generate/testdata.go
@@ -1805,6 +1805,35 @@ format:
print fmt: "0x%lx", REC->ret
`
+// epoll_create1(int flags) — single argument carrying flags at args[0].
+const FormatEpollCreate1 = `name: sys_enter_epoll_create1
+ID: 1453
+format:
+ field:unsigned short common_type; offset:0; size:2; signed:0;
+ field:unsigned char common_flags; offset:2; size:1; signed:0;
+ field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
+ field:int common_pid; offset:4; size:4; signed:1;
+
+ field:int __syscall_nr; offset:8; size:4; signed:1;
+ field:int flags; offset:16; size:8; signed:0;
+
+print fmt: "flags: 0x%08lx", ((unsigned long)(REC->flags))
+`
+
+const FormatExitEpollCreate1 = `name: sys_exit_epoll_create1
+ID: 1452
+format:
+ field:unsigned short common_type; offset:0; size:2; signed:0;
+ field:unsigned char common_flags; offset:2; size:1; signed:0;
+ field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
+ field:int common_pid; offset:4; size:4; signed:1;
+
+ field:int __syscall_nr; offset:8; size:4; signed:1;
+ field:long ret; offset:16; size:8; signed:1;
+
+print fmt: "0x%lx", REC->ret
+`
+
// pidfd_open(pid_t pid, unsigned int flags) — flags at args[1], not args[0].
const FormatPidfdOpen = `name: sys_enter_pidfd_open
ID: 1461