view gcc/config/bpf/bpf-helpers.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

/* Copyright (C) 2019-2020 Free Software Foundation, Inc.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   GCC is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* The purpose of this file is to provide a compatiblity layer with
   the Linux kernel bpf_helpers.h header that is located in
   linux/tools/testing/selftests/bpf/bpf_helpers.h.  That file is
   currently llvm-specific.  */

#ifndef __BPF_HELPERS_H
#define __BPF_HELPERS_H

#define SEC(NAME) __attribute__((section(NAME), used))

/* Flags used in some kernel helpers.  */

#define BPF_ANY     0
#define BPF_NOEXIST 1
#define BPF_EXIST   2

#define BPF_F_LOCK 4
#define BPF_F_NO_COMMON_LRU (1U << 1)
#define BPF_F_NUMA_NODE (1U << 2)

/* Functions to call kernel helpers.  We provide the "standard" bpf_*
   names as synonyms of the corresponding GCC builtins.  In some
   cases, where non-void pointers are passed to the helper, inline
   functions are used to achieve proper type checking.  */

#ifndef KERNEL_VERSION
# define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,0,0)

#define bpf_map_lookup_elem	__builtin_bpf_helper_map_lookup_elem
#define bpf_map_update_elem	__builtin_bpf_helper_map_update_elem
#define bpf_map_delete_elem	__builtin_bpf_helper_map_delete_elem

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,1,0)

#define bpf_probe_read		__builtin_bpf_helper_probe_read
#define bpf_ktime_get_ns	__builtin_bpf_helper_ktime_get_ns
#define bpf_trace_printk	__builtin_bpf_helper_trace_printk
#define bpf_get_prandom_u32	__builtin_bpf_helper_get_prandom_u32
#define bpf_get_smp_processor_id __builtin_bpf_helper_get_smp_processor_id
#define bpf_skb_store_bytes	__builtin_bpf_helper_skb_store_bytes
#define bpf_l3_csum_replace	__builtin_bpf_helper_l3_csum_replace
#define bpf_l4_csum_replace	__builtin_bpf_helper_l4_csum_replace

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,2,0)

#define bpf_tail_call		__builtin_bpf_helper_tail_call
#define bpf_clone_redirect	__builtin_bpf_helper_clone_redirect
#define bpf_get_current_pid_tgid __builtin_bpf_helper_get_current_pid_tgid
#define bpf_get_current_uid_gid  __builtin_bpf_helper_get_current_uid_gid
#define bpf_get_current_comm	__builtin_bpf_helper_get_current_comm

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,3,0)

#define bpf_get_cgroup_classid	__builtin_bpf_helper_get_cgroup_classid
#define bpf_skb_vlan_push	__builtin_bpf_helper_skb_vlan_push
#define bpf_skb_vlan_pop	__builtin_bpf_helper_skb_vlan_pop
#define bpf_skb_get_tunnel_key	__builtin_bpf_helper_skb_get_tunnel_key
#define bpf_skb_set_tunnel_key	__builtin_bpf_helper_skb_set_tunnel_key
#define bpf_perf_event_read	__builtin_bpf_helper_perf_event_read

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,4,0)

#define bpf_redirect		__builtin_bpf_helper_redirect
#define bpf_get_route_realm	__builtin_bpf_helper_get_route_realm
#define bpf_perf_event_output	__builtin_bpf_helper_perf_event_output

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,5,0)

#define bpf_skb_load_bytes	__builtin_bpf_helper_skb_load_bytes

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,6,0)

#define bpf_get_stackid		__builtin_bpf_helper_get_stackid
#define bpf_csum_diff		__builtin_bpf_helper_csum_diff
#define bpf_skb_get_tunnel_opt	__builtin_bpf_helper_skb_get_tunnel_opt
#define bpf_skb_set_tunnel_opt	__builtin_bpf_helper_skb_set_tunnel_opt

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,8,0)

#define bpf_skb_change_proto	__builtin_bpf_helper_skb_change_proto
#define bpf_skb_change_type	__builtin_bpf_helper_skb_change_type
#define bpf_skb_under_cgroup	__builtin_bpf_helper_skb_under_cgroup
#define bpf_get_hash_recalc	__builtin_bpf_helper_get_hash_recalc
#define bpf_get_current_task	__builtin_bpf_helper_get_current_task
#define bpf_probe_write_user	__builtin_bpf_helper_probe_write_user

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,9,0)

#define bpf_current_task_under_cgroup __builtin_bpf_helper_current_task_under_cgroup
#define bpf_skb_change_tail	__builtin_bpf_helper_skb_change_tail
#define bpf_skb_pull_data	__builtin_bpf_helper_skb_pull_data
#define bpf_csum_update		__builtin_bpf_helper_csum_update
#define bpf_set_hash_invalid	__builtin_bpf_helper_set_hash_invalid

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,10,0)

#define bpf_get_numa_node_id	__builtin_bpf_helper_get_numa_node_id
#define bpf_skb_change_head	__builtin_bpf_helper_skb_change_head
#define bpf_xdp_adjust_head	__builtin_bpf_helper_xdp_adjust_head

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,11,0)

#define bpf_probe_read_str	__builtin_bpf_helper_probe_read_str

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,12,0)

#define bpf_get_socket_cookie	__builtin_bpf_helper_get_socket_cookie
#define bpf_get_socket_uid	__builtin_bpf_helper_get_socket_uid

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,13,0)

#define bpf_set_hash		__builtin_bpf_helper_set_hash
#define bpf_setsockopt		__builtin_bpf_helper_setsockopt
#define bpf_skb_adjust_room	__builtin_bpf_helper_skb_adjust_room

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,14,0)

#define bpf_redirect_map	__builtin_bpf_helper_redirect_map
#define bpf_sk_redirect_map	__builtin_bpf_helper_sk_redirect_map
#define bpf_sock_map_update	__builtin_bpf_helper_sock_map_update

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,15,0)

#define bpf_perf_event_read_value __builtin_bpf_helper_perf_event_read_value
#define bpf_perf_prog_read_value  __builtin_bpf_helper_perf_prog_read_value
#define bpf_getsockopt		  __builtin_bpf_helper_getsockopt
#define bpf_xdp_adjust_meta	__builtin_bpf_helper_xdp_adjust_meta

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,16,0)

#define bpf_override_return	__builtin_bpf_helper_override_return
#define bpf_sock_ops_cb_flags_set __builtin_bpf_helper_sock_ops_cb_flags_set

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,17,0)

#define bpf_msg_redirect_map	__builtin_bpf_helper_msg_redirect_map
#define bpf_msg_apply_bytes	__builtin_bpf_helper_msg_apply_bytes
#define bpf_msg_cork_bytes	__builtin_bpf_helper_msg_cork_bytes
#define bpf_pull_data		__builtin_bpf_helper_pull_data
#define bpf_bind		__builtin_bpf_helper_bpf_bind

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,18,0)

#define bpf_xdp_adjust_tail	__builtin_bpf_helper_xdp_adjust_tail
#define bpf_skb_get_xfrm_state	__builtin_bpf_helper_skb_get_xfrm_state
#define bpf_get_stack		__builtin_bpf_helper_get_stack
#define bpf_skb_load_bytes_relative __builtin_bpf_helper_skb_load_bytes_relative
#define bpf_sock_hash_update	__builtin_bpf_helper_sock_hash_update
#define bpf_msg_redirect_hash	__builtin_bpf_helper_msg_redirect_hash
#define bpf_sk_redirect_hash	__builtin_bpf_helper_sk_redirect_hash
#define bpf_lwt_push_encap		__builtin_bpf_helper_lwt_push_encap
#define bpf_lwt_seg6_store_bytes	__builtin_bpf_helper_lwt_seg6_store_bytes
#define bpf_lwt_seg6_adjust_srh		__builtin_bpf_helper_lwt_seg6_adjust_srh
#define bpf_lwt_seg6_action		__builtin_bpf_helper_lwt_seg6_action
#define bpf_rc_repeat			__builtin_bpf_helper_rc_repeat
#define bpf_rc_keydown			__builtin_bpf_helper_rc_keydown
#define bpf_skb_cgroup_id		__builtin_bpf_helper_skb_cgroup_id
#define bpf_get_current_cgroup_id	__builtin_bpf_helper_get_current_cgroup_id

static inline int
bpf_fib_lookup (void *ctx, struct bpf_fib_lookup *param, int plen,
		unsigned int flags)
{
  return __builtin_bpf_helper_fib_lookup (ctx, (void *) param, plen, flags);
}


#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,19,0)

#define bpf_get_local_storage	__builtin_bpf_helper_get_local_storage
#define bpf_sk_select_reuseport	__builtin_bpf_helper_sk_select_reuseport
#define bpf_skb_ancestor_cgroup_id	__builtin_bpf_helper_skb_ancestor_cgroup_id

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,20,0)

#define bpf_sk_release		__builtin_bpf_helper_sk_release
#define bpf_map_push_elem	__builtin_bpf_helper_map_push_elem
#define bpf_map_pop_elem	__builtin_bpf_helper_map_pop_elem
#define bpf_map_peek_elem	__builtin_bpf_helper_map_peek_elem
#define bpf_msg_push_data	__builtin_bpf_helper_msg_push_data

static inline struct bpf_sock *
bpf_sk_lookup_tcp (void *ctx, struct bpf_sock_tuple *tuple,
		   int size, unsigned long long netns_id,
		   unsigned long long flags)
{
  return
    (struct bpf_sock *) __builtin_bpf_helper_sk_lookup_tcp (ctx,
							    (void *) tuple,
							    size,
							    netns_id, flags);
}

static inline struct bpf_sock *
bpf_sk_lookup_udp (void *ctx, struct bpf_sock_tuple *tuple,
		   int size, unsigned long long netns_id,
		   unsigned long long flags)
{
  return
    (struct bpf_sock *) __builtin_bpf_helper_sk_lookup_udp (ctx,
							    (void *) tuple,
							    size,
							    netns_id, flags);
}

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,0,0)

#define bpf_msg_pop_data	__builtin_bpf_helper_pop_data
#define bpf_rc_pointer_rel	__builtin_bpf_helper_rc_pointer_rel

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,1,0)

#define bpf_spin_lock		__builtin_bpf_helper_spin_lock
#define bpf_spin_unlock		__builtin_bpf_helper_spin_unlock
#define bpf_skb_ecn_set_ce	__builtin_bpf_helper_skb_ecn_set_ce

static inline struct bpf_sock *
bpf_sk_fullsock (struct bpf_sock *sk)
{
  return
    (struct bpf_sock *) __builtin_bpf_helper_sk_fullsock ((void *) sk);
}

static inline struct bpf_sock *
bpf_tcp_sock (struct bpf_sock *sk)
{
  return
    (struct bpf_sock *) __builtin_bpf_helper_tcp_sock ((void *) sk);
}

static inline struct bpf_sock *
bpf_get_listener_sock (struct bpf_sock *sk)
{
  return
    (struct bpf_sock *) __builtin_bpf_helper_get_listener_sock ((void *) sk);
}

#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,2,0)


#endif /* 5.2 */
#endif /* 5.1 */
#endif /* 5.0 */
#endif /* 4.20 */
#endif /* 4.19 */
#endif /* 4.18 */
#endif /* 4.17 */
#endif /* 4.16 */
#endif /* 4.15 */
#endif /* 4.14 */
#endif /* 4.13 */
#endif /* 4.12 */
#endif /* 4.11 */
#endif /* 4.10 */
#endif /* 4.9 */
#endif /* 4.8 */
#endif /* 4.6 */
#endif /* 4.5 */
#endif /* 4.4 */
#endif /* 4.3 */
#endif /* 4.2 */
#endif /* 4.1 */
#endif /* 4.0 */

/* Functions to emit BPF_LD_ABS and BPF_LD_IND instructions.  We
   provide the "standard" names as synonyms of the corresponding GCC
   builtins.  Note how the SKB argument is ignored.  */

static inline long long
load_byte (void *skb __attribute__ ((unused)),
	   unsigned long long off)
{
  return __builtin_bpf_load_byte (off);
}

static inline long long
load_half (void *skb __attribute__ ((unused)),
	   unsigned long long off)
{
  return __builtin_bpf_load_half (off);
}

static inline long long
load_word (void *skb __attribute__ ((unused)),
	   unsigned long long off)
{
  return __builtin_bpf_load_word (off);
}

struct bpf_map_def
{
  unsigned int type;
  unsigned int key_size;
  unsigned int value_size;
  unsigned int max_entries;
  unsigned int map_flags;
  unsigned int inner_map_idx;
  unsigned int numa_node;
};

#endif /* ! __BPF_HELPERS_H */