162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright (c) 2021 Google LLC. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/bpf.h> 562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci__u32 pid = 0; 862306a36Sopenharmony_ci 962306a36Sopenharmony_cichar num_out[64] = {}; 1062306a36Sopenharmony_cilong num_ret = 0; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cichar ip_out[64] = {}; 1362306a36Sopenharmony_cilong ip_ret = 0; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cichar sym_out[64] = {}; 1662306a36Sopenharmony_cilong sym_ret = 0; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cichar addr_out[64] = {}; 1962306a36Sopenharmony_cilong addr_ret = 0; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cichar str_out[64] = {}; 2262306a36Sopenharmony_cilong str_ret = 0; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cichar over_out[6] = {}; 2562306a36Sopenharmony_cilong over_ret = 0; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cichar pad_out[10] = {}; 2862306a36Sopenharmony_cilong pad_ret = 0; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cichar noarg_out[64] = {}; 3162306a36Sopenharmony_cilong noarg_ret = 0; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cilong nobuf_ret = 0; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciextern const void schedule __ksym; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciSEC("raw_tp/sys_enter") 3862306a36Sopenharmony_ciint handler(const void *ctx) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci /* Convenient values to pretty-print */ 4162306a36Sopenharmony_ci const __u8 ex_ipv4[] = {127, 0, 0, 1}; 4262306a36Sopenharmony_ci const __u8 ex_ipv6[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 4362306a36Sopenharmony_ci static const char str1[] = "str1"; 4462306a36Sopenharmony_ci static const char longstr[] = "longstr"; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci if ((int)bpf_get_current_pid_tgid() != pid) 4762306a36Sopenharmony_ci return 0; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci /* Integer types */ 5062306a36Sopenharmony_ci num_ret = BPF_SNPRINTF(num_out, sizeof(num_out), 5162306a36Sopenharmony_ci "%d %u %x %li %llu %lX", 5262306a36Sopenharmony_ci -8, 9, 150, -424242, 1337, 0xDABBAD00); 5362306a36Sopenharmony_ci /* IP addresses */ 5462306a36Sopenharmony_ci ip_ret = BPF_SNPRINTF(ip_out, sizeof(ip_out), "%pi4 %pI6", 5562306a36Sopenharmony_ci &ex_ipv4, &ex_ipv6); 5662306a36Sopenharmony_ci /* Symbol lookup formatting */ 5762306a36Sopenharmony_ci sym_ret = BPF_SNPRINTF(sym_out, sizeof(sym_out), "%ps %pS %pB", 5862306a36Sopenharmony_ci &schedule, &schedule, &schedule); 5962306a36Sopenharmony_ci /* Kernel pointers */ 6062306a36Sopenharmony_ci addr_ret = BPF_SNPRINTF(addr_out, sizeof(addr_out), "%pK %px %p", 6162306a36Sopenharmony_ci 0, 0xFFFF00000ADD4E55, 0xFFFF00000ADD4E55); 6262306a36Sopenharmony_ci /* Strings and single-byte character embedding */ 6362306a36Sopenharmony_ci str_ret = BPF_SNPRINTF(str_out, sizeof(str_out), "%s % 9c %+2c %-3c %04c %0c %+05s", 6462306a36Sopenharmony_ci str1, 'a', 'b', 'c', 'd', 'e', longstr); 6562306a36Sopenharmony_ci /* Overflow */ 6662306a36Sopenharmony_ci over_ret = BPF_SNPRINTF(over_out, sizeof(over_out), "%%overflow"); 6762306a36Sopenharmony_ci /* Padding of fixed width numbers */ 6862306a36Sopenharmony_ci pad_ret = BPF_SNPRINTF(pad_out, sizeof(pad_out), "%5d %0900000X", 4, 4); 6962306a36Sopenharmony_ci /* No args */ 7062306a36Sopenharmony_ci noarg_ret = BPF_SNPRINTF(noarg_out, sizeof(noarg_out), "simple case"); 7162306a36Sopenharmony_ci /* No buffer */ 7262306a36Sopenharmony_ci nobuf_ret = BPF_SNPRINTF(NULL, 0, "only interested in length %d", 60); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci return 0; 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cichar _license[] SEC("license") = "GPL"; 78