summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/generate/codegen_test.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/internal/generate/codegen_test.go b/internal/generate/codegen_test.go
index ae2d643..09a23a5 100644
--- a/internal/generate/codegen_test.go
+++ b/internal/generate/codegen_test.go
@@ -280,6 +280,24 @@ func TestGenerateMemHandlerPkeyMprotect(t *testing.T) {
requireContains(t, output, "ev->flags = (__u64)ctx->args[2];")
}
+// TestGenerateMemHandlerMapShadowStack locks in the BPF handler wiring for the
+// x86 CET map_shadow_stack syscall (Linux 6.6+):
+// void *map_shadow_stack(unsigned long addr, unsigned long size, unsigned int flags).
+// The hint addr and size are args[0]/args[1] and flags is args[2]; there is no
+// second length, so length2 must stay zero. The return is a mapped address (or
+// -errno), captured generically via ev->ret like every other KindMem exit.
+func TestGenerateMemHandlerMapShadowStack(t *testing.T) {
+ output := GenerateTracepointsC(mustParseAll(t, syntheticPair("map_shadow_stack")))
+
+ requireContains(t, output, `SEC("tracepoint/syscalls/sys_enter_map_shadow_stack")`)
+ requireContains(t, output, "struct mem_event *ev")
+ requireContains(t, output, "ev->event_type = ENTER_MEM_EVENT;")
+ requireContains(t, output, "ev->addr = (__u64)ctx->args[0];")
+ requireContains(t, output, "ev->length = (__u64)ctx->args[1];")
+ requireContains(t, output, "ev->length2 = 0;")
+ requireContains(t, output, "ev->flags = (__u64)ctx->args[2];")
+}
+
func TestGenerateMemHandlerBrk(t *testing.T) {
output := GenerateTracepointsC(mustParseAll(t, syntheticPair("brk")))