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

tailcall_bpf2bpf4.c (1342B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/bpf.h>
      3#include <bpf/bpf_helpers.h>
      4
      5struct {
      6	__uint(type, BPF_MAP_TYPE_ARRAY);
      7	__uint(max_entries, 1);
      8	__uint(key_size, sizeof(__u32));
      9	__uint(value_size, sizeof(__u32));
     10} nop_table SEC(".maps");
     11
     12struct {
     13	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
     14	__uint(max_entries, 3);
     15	__uint(key_size, sizeof(__u32));
     16	__uint(value_size, sizeof(__u32));
     17} jmp_table SEC(".maps");
     18
     19int count = 0;
     20int noise = 0;
     21
     22__always_inline int subprog_noise(void)
     23{
     24	__u32 key = 0;
     25
     26	bpf_map_lookup_elem(&nop_table, &key);
     27	return 0;
     28}
     29
     30__noinline
     31int subprog_tail_2(struct __sk_buff *skb)
     32{
     33	if (noise)
     34		subprog_noise();
     35	bpf_tail_call_static(skb, &jmp_table, 2);
     36	return skb->len * 3;
     37}
     38
     39__noinline
     40int subprog_tail_1(struct __sk_buff *skb)
     41{
     42	bpf_tail_call_static(skb, &jmp_table, 1);
     43	return skb->len * 2;
     44}
     45
     46__noinline
     47int subprog_tail(struct __sk_buff *skb)
     48{
     49	bpf_tail_call_static(skb, &jmp_table, 0);
     50	return skb->len;
     51}
     52
     53SEC("tc")
     54int classifier_1(struct __sk_buff *skb)
     55{
     56	return subprog_tail_2(skb);
     57}
     58
     59SEC("tc")
     60int classifier_2(struct __sk_buff *skb)
     61{
     62	count++;
     63	return subprog_tail_2(skb);
     64}
     65
     66SEC("tc")
     67int classifier_0(struct __sk_buff *skb)
     68{
     69	return subprog_tail_1(skb);
     70}
     71
     72SEC("tc")
     73int entry(struct __sk_buff *skb)
     74{
     75	return subprog_tail(skb);
     76}
     77
     78char __license[] SEC("license") = "GPL";