cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bpf_iter_task_vma.c (1629B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2020 Facebook */
      3#include "bpf_iter.h"
      4#include <bpf/bpf_helpers.h>
      5
      6char _license[] SEC("license") = "GPL";
      7
      8/* Copied from mm.h */
      9#define VM_READ		0x00000001
     10#define VM_WRITE	0x00000002
     11#define VM_EXEC		0x00000004
     12#define VM_MAYSHARE	0x00000080
     13
     14/* Copied from kdev_t.h */
     15#define MINORBITS	20
     16#define MINORMASK	((1U << MINORBITS) - 1)
     17#define MAJOR(dev)	((unsigned int) ((dev) >> MINORBITS))
     18#define MINOR(dev)	((unsigned int) ((dev) & MINORMASK))
     19
     20#define D_PATH_BUF_SIZE 1024
     21char d_path_buf[D_PATH_BUF_SIZE] = {};
     22__u32 pid = 0;
     23
     24SEC("iter/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx)
     25{
     26	struct vm_area_struct *vma = ctx->vma;
     27	struct seq_file *seq = ctx->meta->seq;
     28	struct task_struct *task = ctx->task;
     29	struct file *file;
     30	char perm_str[] = "----";
     31
     32	if (task == (void *)0 || vma == (void *)0)
     33		return 0;
     34
     35	file = vma->vm_file;
     36	if (task->tgid != pid)
     37		return 0;
     38	perm_str[0] = (vma->vm_flags & VM_READ) ? 'r' : '-';
     39	perm_str[1] = (vma->vm_flags & VM_WRITE) ? 'w' : '-';
     40	perm_str[2] = (vma->vm_flags & VM_EXEC) ? 'x' : '-';
     41	perm_str[3] = (vma->vm_flags & VM_MAYSHARE) ? 's' : 'p';
     42	BPF_SEQ_PRINTF(seq, "%08llx-%08llx %s ", vma->vm_start, vma->vm_end, perm_str);
     43
     44	if (file) {
     45		__u32 dev = file->f_inode->i_sb->s_dev;
     46
     47		bpf_d_path(&file->f_path, d_path_buf, D_PATH_BUF_SIZE);
     48
     49		BPF_SEQ_PRINTF(seq, "%08llx ", vma->vm_pgoff << 12);
     50		BPF_SEQ_PRINTF(seq, "%02x:%02x %u", MAJOR(dev), MINOR(dev),
     51			       file->f_inode->i_ino);
     52		BPF_SEQ_PRINTF(seq, "\t%s\n", d_path_buf);
     53	} else {
     54		BPF_SEQ_PRINTF(seq, "%08llx 00:00 0\n", 0ULL);
     55	}
     56	return 0;
     57}