Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (c) 2020 Facebook */
0003 #include "bpf_iter.h"
0004 #include <bpf/bpf_helpers.h>
0005 #include <bpf/bpf_tracing.h>
0006 
0007 char _license[] SEC("license") = "GPL";
0008 
0009 SEC("iter/task")
0010 int dump_task(struct bpf_iter__task *ctx)
0011 {
0012     struct seq_file *seq = ctx->meta->seq;
0013     struct task_struct *task = ctx->task;
0014     static char info[] = "    === END ===";
0015 
0016     if (task == (void *)0) {
0017         BPF_SEQ_PRINTF(seq, "%s\n", info);
0018         return 0;
0019     }
0020 
0021     if (ctx->meta->seq_num == 0)
0022         BPF_SEQ_PRINTF(seq, "    tgid      gid\n");
0023 
0024     BPF_SEQ_PRINTF(seq, "%8d %8d\n", task->tgid, task->pid);
0025     return 0;
0026 }
0027 
0028 int num_expected_failure_copy_from_user_task = 0;
0029 int num_success_copy_from_user_task = 0;
0030 
0031 SEC("iter.s/task")
0032 int dump_task_sleepable(struct bpf_iter__task *ctx)
0033 {
0034     struct seq_file *seq = ctx->meta->seq;
0035     struct task_struct *task = ctx->task;
0036     static const char info[] = "    === END ===";
0037     struct pt_regs *regs;
0038     void *ptr;
0039     uint32_t user_data = 0;
0040     int ret;
0041 
0042     if (task == (void *)0) {
0043         BPF_SEQ_PRINTF(seq, "%s\n", info);
0044         return 0;
0045     }
0046 
0047     /* Read an invalid pointer and ensure we get an error */
0048     ptr = NULL;
0049     ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
0050     if (ret) {
0051         ++num_expected_failure_copy_from_user_task;
0052     } else {
0053         BPF_SEQ_PRINTF(seq, "%s\n", info);
0054         return 0;
0055     }
0056 
0057     /* Try to read the contents of the task's instruction pointer from the
0058      * remote task's address space.
0059      */
0060     regs = (struct pt_regs *)bpf_task_pt_regs(task);
0061     if (regs == (void *)0) {
0062         BPF_SEQ_PRINTF(seq, "%s\n", info);
0063         return 0;
0064     }
0065     ptr = (void *)PT_REGS_IP(regs);
0066 
0067     ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
0068     if (ret) {
0069         BPF_SEQ_PRINTF(seq, "%s\n", info);
0070         return 0;
0071     }
0072     ++num_success_copy_from_user_task;
0073 
0074     if (ctx->meta->seq_num == 0)
0075         BPF_SEQ_PRINTF(seq, "    tgid      gid     data\n");
0076 
0077     BPF_SEQ_PRINTF(seq, "%8d %8d %8d\n", task->tgid, task->pid, user_data);
0078     return 0;
0079 }