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

task_local_storage.c (1298B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2021 Facebook */
      3
      4#include "vmlinux.h"
      5#include <bpf/bpf_helpers.h>
      6#include <bpf/bpf_tracing.h>
      7
      8char _license[] SEC("license") = "GPL";
      9
     10struct {
     11	__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
     12	__uint(map_flags, BPF_F_NO_PREALLOC);
     13	__type(key, int);
     14	__type(value, long);
     15} enter_id SEC(".maps");
     16
     17#define MAGIC_VALUE 0xabcd1234
     18
     19pid_t target_pid = 0;
     20int mismatch_cnt = 0;
     21int enter_cnt = 0;
     22int exit_cnt = 0;
     23
     24SEC("tp_btf/sys_enter")
     25int BPF_PROG(on_enter, struct pt_regs *regs, long id)
     26{
     27	struct task_struct *task;
     28	long *ptr;
     29
     30	task = bpf_get_current_task_btf();
     31	if (task->pid != target_pid)
     32		return 0;
     33
     34	ptr = bpf_task_storage_get(&enter_id, task, 0,
     35				   BPF_LOCAL_STORAGE_GET_F_CREATE);
     36	if (!ptr)
     37		return 0;
     38
     39	__sync_fetch_and_add(&enter_cnt, 1);
     40	*ptr = MAGIC_VALUE + enter_cnt;
     41
     42	return 0;
     43}
     44
     45SEC("tp_btf/sys_exit")
     46int BPF_PROG(on_exit, struct pt_regs *regs, long id)
     47{
     48	struct task_struct *task;
     49	long *ptr;
     50
     51	task = bpf_get_current_task_btf();
     52	if (task->pid != target_pid)
     53		return 0;
     54
     55	ptr = bpf_task_storage_get(&enter_id, task, 0,
     56				   BPF_LOCAL_STORAGE_GET_F_CREATE);
     57	if (!ptr)
     58		return 0;
     59
     60	__sync_fetch_and_add(&exit_cnt, 1);
     61	if (*ptr != MAGIC_VALUE + exit_cnt)
     62		__sync_fetch_and_add(&mismatch_cnt, 1);
     63	return 0;
     64}