summaryrefslogtreecommitdiff
path: root/internal/generate
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-21 17:48:51 +0300
committerPaul Buetow <paul@buetow.org>2026-05-21 17:48:51 +0300
commite06f421493bc1c95e787b0f49dd655863e7baf81 (patch)
treeb6b8a59e4326b0b723cd35f1ec2ad46600778c9a /internal/generate
parent11394edddbb8f02208edb18e06ae40b6912742f4 (diff)
b7 classify sysv ipc ids and ops
Diffstat (limited to 'internal/generate')
-rw-r--r--internal/generate/classify.go32
-rw-r--r--internal/generate/classify_test.go47
-rw-r--r--internal/generate/codegen_test.go6
-rw-r--r--internal/generate/kindregistry.go2
-rw-r--r--internal/generate/retclassify_test.go4
-rw-r--r--internal/generate/tracepointsgo_test.go2
6 files changed, 90 insertions, 3 deletions
diff --git a/internal/generate/classify.go b/internal/generate/classify.go
index 4ab63ad..9c37646 100644
--- a/internal/generate/classify.go
+++ b/internal/generate/classify.go
@@ -33,6 +33,8 @@ const (
KindPerfOpen
KindSeccomp
KindModule
+ KindSysVId
+ KindSysVOp
)
func (k TracepointKind) MetadataName() string {
@@ -91,6 +93,10 @@ func (k TracepointKind) MetadataName() string {
return "seccomp"
case KindModule:
return "module"
+ case KindSysVId:
+ return "sysv-id"
+ case KindSysVOp:
+ return "sysv-op"
default:
return "none"
}
@@ -332,6 +338,30 @@ func classifyNameOnly(name string) (ClassificationResult, bool) {
return ClassificationResult{Kind: KindModule}, true
case "sys_exit_delete_module":
return ClassificationResult{Kind: KindModule}, true
+ case "sys_enter_msgget":
+ return ClassificationResult{Kind: KindSysVId}, true
+ case "sys_enter_semget":
+ return ClassificationResult{Kind: KindSysVId}, true
+ case "sys_enter_shmget":
+ return ClassificationResult{Kind: KindSysVId}, true
+ case "sys_enter_msgsnd":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_msgrcv":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_msgctl":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_semop":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_semtimedop":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_semctl":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_shmat":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_shmdt":
+ return ClassificationResult{Kind: KindSysVOp}, true
+ case "sys_enter_shmctl":
+ return ClassificationResult{Kind: KindSysVOp}, true
case "sys_enter_pidfd_send_signal":
return ClassificationResult{Kind: KindFd}, true
case "sys_enter_kexec_file_load":
@@ -650,6 +680,7 @@ var retClassifications = map[string]RetClassification{
"readv": ReadClassified,
"recvmsg": ReadClassified,
"recvfrom": ReadClassified,
+ "msgrcv": ReadClassified,
"getrandom": ReadClassified,
"syslog": ReadClassified,
"mq_timedreceive": ReadClassified,
@@ -666,6 +697,7 @@ var retClassifications = map[string]RetClassification{
"pwritev2": WriteClassified,
"sendmsg": WriteClassified,
"sendto": WriteClassified,
+ "msgsnd": WriteClassified,
"write": WriteClassified,
"writev": WriteClassified,
"mq_timedsend": WriteClassified,
diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go
index b35f1b1..364de2c 100644
--- a/internal/generate/classify_test.go
+++ b/internal/generate/classify_test.go
@@ -906,6 +906,41 @@ func TestClassifyE7NullNameOnlyKinds(t *testing.T) {
}
}
+func TestClassifyB7NameOnlyKinds(t *testing.T) {
+ tests := []struct {
+ name string
+ want TracepointKind
+ }{
+ {"sys_enter_msgget", KindSysVId},
+ {"sys_enter_semget", KindSysVId},
+ {"sys_enter_shmget", KindSysVId},
+ {"sys_enter_msgsnd", KindSysVOp},
+ {"sys_enter_msgrcv", KindSysVOp},
+ {"sys_enter_msgctl", KindSysVOp},
+ {"sys_enter_semop", KindSysVOp},
+ {"sys_enter_semtimedop", KindSysVOp},
+ {"sys_enter_semctl", KindSysVOp},
+ {"sys_enter_shmat", KindSysVOp},
+ {"sys_enter_shmdt", KindSysVOp},
+ {"sys_enter_shmctl", KindSysVOp},
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ r := ClassifyFormat(&Format{
+ Name: tt.name,
+ ExternalFields: []Field{
+ {Type: "long", Name: "__syscall_nr"},
+ {Type: "long", Name: "arg0"},
+ },
+ })
+ if r.Kind != tt.want {
+ t.Fatalf("%s: got kind %d, want %d", tt.name, r.Kind, tt.want)
+ }
+ })
+ }
+}
+
func TestClassifyAcctPathname(t *testing.T) {
r := ClassifyFormat(&Format{
Name: "sys_enter_acct",
@@ -1123,6 +1158,18 @@ func TestClassifySyscallPairAccepted(t *testing.T) {
{"seccomp", syntheticEnter("seccomp", 9368), syntheticExit("seccomp", 9367), KindSeccomp},
{"init_module", syntheticEnter("init_module", 9370), syntheticExit("init_module", 9369), KindModule},
{"delete_module", syntheticEnter("delete_module", 9372), syntheticExit("delete_module", 9371), KindModule},
+ {"msgget", syntheticEnter("msgget", 9394), syntheticExit("msgget", 9393), KindSysVId},
+ {"semget", syntheticEnter("semget", 9396), syntheticExit("semget", 9395), KindSysVId},
+ {"shmget", syntheticEnter("shmget", 9398), syntheticExit("shmget", 9397), KindSysVId},
+ {"msgsnd", syntheticEnter("msgsnd", 9400), syntheticExit("msgsnd", 9399), KindSysVOp},
+ {"msgrcv", syntheticEnter("msgrcv", 9402), syntheticExit("msgrcv", 9401), KindSysVOp},
+ {"msgctl", syntheticEnter("msgctl", 9404), syntheticExit("msgctl", 9403), KindSysVOp},
+ {"semop", syntheticEnter("semop", 9406), syntheticExit("semop", 9405), KindSysVOp},
+ {"semtimedop", syntheticEnter("semtimedop", 9408), syntheticExit("semtimedop", 9407), KindSysVOp},
+ {"semctl", syntheticEnter("semctl", 9410), syntheticExit("semctl", 9409), KindSysVOp},
+ {"shmat", syntheticEnter("shmat", 9412), syntheticExit("shmat", 9411), KindSysVOp},
+ {"shmdt", syntheticEnter("shmdt", 9414), syntheticExit("shmdt", 9413), KindSysVOp},
+ {"shmctl", syntheticEnter("shmctl", 9416), syntheticExit("shmctl", 9415), KindSysVOp},
{"mount", FormatMount, FormatExitMount, KindPathname},
{"umount", FormatUmount, FormatExitUmount, KindPathname},
{"move_mount", FormatMoveMount, FormatExitMoveMount, KindTwoFd},
diff --git a/internal/generate/codegen_test.go b/internal/generate/codegen_test.go
index 2b9f9e2..c431f5c 100644
--- a/internal/generate/codegen_test.go
+++ b/internal/generate/codegen_test.go
@@ -584,6 +584,8 @@ func TestGenerateAllEventTypes(t *testing.T) {
{KindPerfOpen, "ENTER_PERF_OPEN_EVENT", "EXIT_PERF_OPEN_EVENT"},
{KindSeccomp, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"},
{KindModule, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"},
+ {KindSysVId, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"},
+ {KindSysVOp, "ENTER_NULL_EVENT", "EXIT_NULL_EVENT"},
}
for _, tt := range tests {
@@ -628,6 +630,8 @@ func TestEventStructNames(t *testing.T) {
{KindPerfOpen, "perf_open_event"},
{KindSeccomp, "null_event"},
{KindModule, "null_event"},
+ {KindSysVId, "null_event"},
+ {KindSysVOp, "null_event"},
}
for _, tt := range tests {
@@ -646,7 +650,7 @@ func TestEnterReject(t *testing.T) {
t.Error("KindNone should be enter-rejected")
}
- accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen, KindSeccomp, KindModule}
+ accepted := []TracepointKind{KindFd, KindOpen, KindMqOpen, KindExec, KindPathname, KindName, KindFcntl, KindNull, KindDup3, KindOpenByHandleAt, KindSocket, KindSocketpair, KindAccept, KindPipe, KindEventfd, KindPidfd, KindEpollCtl, KindTwoFd, KindPoll, KindMem, KindSleep, KindKeyctl, KindPtrace, KindPerfOpen, KindSeccomp, KindModule, KindSysVId, KindSysVOp}
for _, k := range accepted {
if isEnterRejected(k) {
t.Errorf("kind %d should NOT be enter-rejected", k)
diff --git a/internal/generate/kindregistry.go b/internal/generate/kindregistry.go
index 0ce4d2b..8f83e69 100644
--- a/internal/generate/kindregistry.go
+++ b/internal/generate/kindregistry.go
@@ -43,6 +43,8 @@ var kindRegistry = map[TracepointKind]kindMeta{
KindPerfOpen: {structName: "perf_open_event", enterAccepted: true},
KindSeccomp: {structName: "null_event", enterAccepted: true},
KindModule: {structName: "null_event", enterAccepted: true},
+ KindSysVId: {structName: "null_event", enterAccepted: true},
+ KindSysVOp: {structName: "null_event", enterAccepted: true},
// KindNone is intentionally absent: it represents "unclassified" and is
// never enter-accepted. lookupKind returns the zero kindMeta (enterAccepted=false)
// for any unregistered kind, so KindNone is implicitly rejected.
diff --git a/internal/generate/retclassify_test.go b/internal/generate/retclassify_test.go
index 4e9655b..04120ee 100644
--- a/internal/generate/retclassify_test.go
+++ b/internal/generate/retclassify_test.go
@@ -7,7 +7,7 @@ func TestClassifyRetRead(t *testing.T) {
"fgetxattr", "flistxattr", "getdents", "getdents64", "getxattr",
"lgetxattr", "listxattr", "llistxattr", "pread64", "preadv",
"preadv2", "process_vm_readv", "read", "readlink", "readlinkat",
- "readv", "recvmsg", "recvfrom", "syslog", "mq_timedreceive", "getrandom",
+ "readv", "recvmsg", "recvfrom", "syslog", "mq_timedreceive", "getrandom", "msgrcv",
}
for _, name := range reads {
if got := ClassifyRet("sys_exit_" + name); got != ReadClassified {
@@ -19,7 +19,7 @@ func TestClassifyRetRead(t *testing.T) {
func TestClassifyRetWrite(t *testing.T) {
writes := []string{
"process_vm_writev", "pwrite64", "pwritev", "pwritev2",
- "sendmsg", "sendto", "write", "writev", "mq_timedsend",
+ "sendmsg", "sendto", "write", "writev", "mq_timedsend", "msgsnd",
}
for _, name := range writes {
if got := ClassifyRet("sys_exit_" + name); got != WriteClassified {
diff --git a/internal/generate/tracepointsgo_test.go b/internal/generate/tracepointsgo_test.go
index ee15b81..25de0b1 100644
--- a/internal/generate/tracepointsgo_test.go
+++ b/internal/generate/tracepointsgo_test.go
@@ -132,6 +132,7 @@ sys_enter_open_by_handle_at is a struct open_by_handle_at_event
sys_enter_mq_open is a struct mq_open_event
sys_enter_epoll_ctl is a struct epoll_ctl_event
sys_enter_pidfd_open is a struct eventfd_event (kind=pidfd)
+sys_enter_msgsnd is a struct null_event (kind=sysv-op)
`
output, err := ExtractTracepointsWithKinds(strings.NewReader(sampleGeneratedC), strings.NewReader(kindData))
if err != nil {
@@ -142,4 +143,5 @@ sys_enter_pidfd_open is a struct eventfd_event (kind=pidfd)
requireContains(t, output, `"mq_open": "mq-open",`)
requireContains(t, output, `"epoll_ctl": "epoll-ctl",`)
requireContains(t, output, `"pidfd_open": "pidfd",`)
+ requireContains(t, output, `"msgsnd": "sysv-op",`)
}