/* Copyright (C) 2019-2021 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))
#define KERNEL_HELPER(NUM) __attribute__((kernel_helper(NUM)))

/* 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)

/* Prototypes of functions to call kernel helpers.
   Please keep these protoypes sorted by helper number.  */

void *bpf_map_lookup_elem (void *map, const void *key)
  KERNEL_HELPER (1);

int bpf_map_update_elem (void *map, const void *key, const void *value,
			 unsigned long long flags)
  KERNEL_HELPER (2);

int bpf_map_delete_elem (void *map, const void *key)
  KERNEL_HELPER (3);

int bpf_probe_read (void *dst, int size, const void *unsafe_ptr)
  KERNEL_HELPER (4);

unsigned long long bpf_ktime_get_ns (void)
  KERNEL_HELPER (5);

int bpf_trace_printk (const char *fmt, int fmt_size, ...)
  KERNEL_HELPER (6);

unsigned long long bpf_get_prandom_u32 (void)
  KERNEL_HELPER (7);

unsigned long long bpf_get_smp_processor_id (void)
  KERNEL_HELPER (8);

int bpf_skb_store_bytes (void *ctx, int off, void *from, int len,
			 unsigned int start_header)
  KERNEL_HELPER (9);

int bpf_l3_csum_replace (void *ctx, int off, int from, int to, int flags)
  KERNEL_HELPER (10);

int bpf_l4_csum_replace (void *ctx, int off, int from, int to, int flags)
  KERNEL_HELPER (11);

int bpf_tail_call (void *ctx, void *map, unsigned int index)
  KERNEL_HELPER (12);

int bpf_clone_redirect (void *ctx, int ifindex, int flags)
  KERNEL_HELPER (13);

unsigned long long bpf_get_current_pid_tgid (void)
  KERNEL_HELPER (14);

unsigned long long bpf_get_current_uid_gid (void)
  KERNEL_HELPER (15);

int bpf_get_current_comm (void *buf, int buf_size)
  KERNEL_HELPER (16);

unsigned int bpf_get_cgroup_classid (void *ctx)
  KERNEL_HELPER (17);

int bpf_skb_vlan_push (void *ctx, short vlan_proto,
		       unsigned short vlan_tci)
  KERNEL_HELPER (18);

int bpf_skb_vlan_pop (void *ctx)
  KERNEL_HELPER (19);

int bpf_skb_get_tunnel_key (void *ctx, void *key, int size, int flags)
  KERNEL_HELPER (20);

int bpf_skb_set_tunnel_key (void *ctx, void *key, int size, int flags)
  KERNEL_HELPER (21);

unsigned long long bpf_perf_event_read (void *map, unsigned long long flags)
  KERNEL_HELPER (22);

int bpf_redirect (int ifindex, int flags)
  KERNEL_HELPER (23);

unsigned int bpf_get_route_realm (void *ctx)
  KERNEL_HELPER (24);

int bpf_perf_event_output (void *ctx, void *map, unsigned long long flags,
			   void *data, int size)
  KERNEL_HELPER (25);

int bpf_skb_load_bytes (void *ctx, int off, void *to, int len)
  KERNEL_HELPER (26);

int bpf_get_stackid (void *ctx, void *map, int flags)
  KERNEL_HELPER (27);

int bpf_csum_diff (void *from, int from_size, void *to, int to_size, int seed)
  KERNEL_HELPER (28);

int bpf_skb_get_tunnel_opt (void *ctx, void *md, int size)
  KERNEL_HELPER (29);

int bpf_skb_set_tunnel_opt (void *ctx, void *md, int size)
  KERNEL_HELPER (30);

int bpf_skb_change_proto (void *ctx, short proto, unsigned long flags)
  KERNEL_HELPER (31);

int bpf_skb_change_type (void *ctx, unsigned int type)
  KERNEL_HELPER (32);

int bpf_skb_under_cgroup (void *ctx, void *map, int index)
  KERNEL_HELPER (33);

unsigned int bpf_get_hash_recalc (void *ctx)
  KERNEL_HELPER (34);

unsigned long long bpf_get_current_task (void)
  KERNEL_HELPER (35);

int bpf_probe_write_user (void *dst, const void *src, int size)
  KERNEL_HELPER (36);

int bpf_current_task_under_cgroup (void *map, int index)
  KERNEL_HELPER (37);

int bpf_skb_change_tail (void *ctx, unsigned int len, unsigned long flags)
  KERNEL_HELPER (38);

int bpf_skb_pull_data (void *, int len)
  KERNEL_HELPER (39);

long long bpf_csum_update (void *ctx, unsigned int csum)
  KERNEL_HELPER (40);

void bpf_set_hash_invalid (void *ctx)
  KERNEL_HELPER (41);

int bpf_get_numa_node_id (void)
  KERNEL_HELPER (42);

int bpf_skb_change_head (void *, int len, int flags)
  KERNEL_HELPER (43);

int bpf_xdp_adjust_head (void *ctx, int offset)
  KERNEL_HELPER (44);

int bpf_probe_read_str (void *ctx, unsigned int size, const void *unsafe_ptr)
  KERNEL_HELPER (45);

int bpf_get_socket_cookie (void *ctx)
  KERNEL_HELPER (46);

unsigned int bpf_get_socket_uid (void *ctx)
  KERNEL_HELPER (47);

unsigned int bpf_set_hash (void *ctx, unsigned int hash)
  KERNEL_HELPER (48);

int bpf_setsockopt (void *ctx, int level, int optname, void *optval, int optlen)
  KERNEL_HELPER (49);

int bpf_skb_adjust_room (void *ctx, int len_diff, unsigned int mode,
			 unsigned long long flags)
  KERNEL_HELPER (50);

int bpf_redirect_map (void *map, int key, int flags)
  KERNEL_HELPER (51);

int bpf_sk_redirect_map (void *ctx, void *map, int key, int flags)
  KERNEL_HELPER (52);

int bpf_sock_map_update (void *map, void *key, void *value,
			 unsigned long long flags)
  KERNEL_HELPER (53);

int bpf_xdp_adjust_meta (void *ctx, int offset)
  KERNEL_HELPER (54);

int bpf_perf_event_read_value (void *map, unsigned long long flags,
			       void *buf, unsigned int buf_size)
  KERNEL_HELPER (55);

int bpf_perf_prog_read_value (void *ctx, void *buf, unsigned int buf_size)
  KERNEL_HELPER (56);

int bpf_getsockopt (void *ctx, int level, int optname, void *optval,
		    int optlen)
  KERNEL_HELPER (57);

int bpf_override_return (void *ctx, unsigned long rc)
  KERNEL_HELPER (58);

int bpf_sock_ops_cb_flags_set (void *ctx, int flags)
  KERNEL_HELPER (59);

int bpf_msg_redirect_map (void *ctx, void *map, int key, int flags)
  KERNEL_HELPER (60);

int bpf_msg_apply_bytes (void *ctx, int len)
  KERNEL_HELPER (61);

int bpf_msg_cork_bytes (void *ctx, int len)
  KERNEL_HELPER (62);

int bpf_msg_pull_data (void *, int len)
  KERNEL_HELPER (63);

int bpf_bind (void *ctx, void *addr, int addr_len)
  KERNEL_HELPER (64);

int bpf_xdp_adjust_tail (struct xdp_md *xdp_md, int delta)
  KERNEL_HELPER (65);

int bpf_skb_get_xfrm_state (void *ctx, int index, void *state,
			    int size, int flags)
  KERNEL_HELPER (66);

int bpf_get_stack (void *ctx, void *buf, int size, int flags)
  KERNEL_HELPER (67);

int bpf_skb_load_bytes_relative (void *ctx, int off, void *to, int len,
				 unsigned int start_header)
  KERNEL_HELPER (68);

int bpf_fib_lookup (void *ctx, struct bpf_fib_lookup *params,
		    int plen, unsigned int flags)
  KERNEL_HELPER (69);

int bpf_sock_hash_update (void *map, void *key, void *value,
			  unsigned long long flags)
  KERNEL_HELPER (70);

int bpf_msg_redirect_hash (void *ctx, void *map, void *key, int flags)
  KERNEL_HELPER (71);

int bpf_sk_redirect_hash (void *ctx, void *map, void *key, int flags)
  KERNEL_HELPER (72);

int bpf_lwt_push_encap (void *ctx, unsigned int type, void *hdr,
			unsigned int len)
  KERNEL_HELPER (73);

int bpf_lwt_seg6_store_bytes (void *ctx, unsigned int offset,
			      void *from, unsigned int len)
  KERNEL_HELPER (74);

int bpf_lwt_seg6_adjust_srh (void *ctx, unsigned int offset,
			     unsigned int len)
  KERNEL_HELPER (75);

int bpf_lwt_seg6_action (void *ctx, unsigned int action, void *param,
			 unsigned int param_len)
  KERNEL_HELPER (76);

int bpf_rc_repeat (void *ctx)
  KERNEL_HELPER (77);

int bpf_rc_keydown (void *ctx, unsigned int protocol,
		    unsigned long long scancode, unsigned int toggle)
  KERNEL_HELPER (78);

unsigned bpf_skb_cgroup_id (void *ctx)
  KERNEL_HELPER (79);

unsigned long long bpf_get_current_cgroup_id (void)
  KERNEL_HELPER (80);

void *bpf_get_local_storage (void *map, unsigned long long flags)
  KERNEL_HELPER (81);

int bpf_sk_select_reuseport (void *ctx, void *map, void *key, unsigned int flags)
  KERNEL_HELPER (82);

unsigned long long bpf_skb_ancestor_cgroup_id (void *ctx, int level)
  KERNEL_HELPER (83);

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)
  KERNEL_HELPER (84);

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)
  KERNEL_HELPER (85);

int bpf_sk_release (struct bpf_sock *sk)
  KERNEL_HELPER (86);

int bpf_map_push_elem (void *map, const void *value, unsigned long long flags)
  KERNEL_HELPER (87);

int bpf_map_pop_elem (void *map, void *value)
  KERNEL_HELPER (88);

int bpf_map_peek_elem (void *map, void *value)
  KERNEL_HELPER (89);

int bpf_msg_push_data (void *ctx, int start, int cut, int flags)
  KERNEL_HELPER (90);

int bpf_msg_pop_data (void *ctx, int start, int cut, int flags)
  KERNEL_HELPER (91);

int bpf_rc_pointer_rel (void *ctx, int rel_x, int rel_y)
  KERNEL_HELPER (92);

void bpf_spin_lock (struct bpf_spin_lock *lock)
  KERNEL_HELPER (93);

void bpf_spin_unlock (struct bpf_spin_lock *lock)
  KERNEL_HELPER (94);

struct bpf_sock *bpf_sk_fullsock (struct bpf_sock *sk)
  KERNEL_HELPER (95);

struct bpf_sock *bpf_tcp_sock (struct bpf_sock *sk)
  KERNEL_HELPER (96);

int bpf_skb_ecn_set_ce (void *ctx)
  KERNEL_HELPER (97);

struct bpf_sock *bpf_get_listener_sock (struct bpf_sock *sk)
  KERNEL_HELPER (98);

struct bpf_sock *bpf_skc_lookup_tcp (void *ctx,
				     struct bpf_sock_tuple *tuple,
				     unsigned int tuple_size,
				     unsigned long netns,
				     unsigned long flags)
  KERNEL_HELPER (99);

int bpf_tcp_check_syncookie (struct bpf_sock *sk, void *iph,
			     unsigned int iph_len,
			     struct tcp_hdr *th,
			     unsigned int th_len)
  KERNEL_HELPER (100);

int bpf_sysctl_get_name (struct bpf_sysctl *ctx,
			 char *buf, unsigned long buf_len,
			 unsigned long flags)
  KERNEL_HELPER (101);

int bpf_sysctl_get_current_value (struct bpf_sysctl *ctx,
				  char *buf, unsigned long buf_len)
  KERNEL_HELPER (102);

int bpf_sysctl_get_new_value (struct bpf_sysctl *ctx, char *buf,
			      unsigned long buf_len)
  KERNEL_HELPER (103);

int bpf_sysctl_set_new_value (struct bpf_sysctl *ctx, const char *buf,
			      unsigned long buf_len)
  KERNEL_HELPER (104);

int bpf_strtol (const char *buf, unsigned long buf_len,
		unsigned long flags, long *res)
  KERNEL_HELPER (105);

int bpf_strtoul (const char *buf, unsigned long buf_len,
		 unsigned long flags, unsigned long *res)
  KERNEL_HELPER (106);

void *bpf_sk_storage_get (void *map, struct bpf_sock *sk,
			  void *value, long flags)
  KERNEL_HELPER (107);

int bpf_sk_storage_delete (void *map, struct bpf_sock *sk)
  KERNEL_HELPER (108);

/* 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.  */

#define load_byte(SKB,OFF) __builtin_bpf_load_byte ((OFF))
#define load_half(SKB,OFF) __builtin_bpf_load_half ((OFF))
#define load_word(SKB,OFF) __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 */
