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

map_ptr_kern.c (17032B)


      1// SPDX-License-Identifier: GPL-2.0
      2// Copyright (c) 2020 Facebook
      3
      4#include <linux/bpf.h>
      5#include <bpf/bpf_helpers.h>
      6
      7#define LOOP_BOUND 0xf
      8#define MAX_ENTRIES 8
      9#define HALF_ENTRIES (MAX_ENTRIES >> 1)
     10
     11_Static_assert(MAX_ENTRIES < LOOP_BOUND, "MAX_ENTRIES must be < LOOP_BOUND");
     12
     13enum bpf_map_type g_map_type = BPF_MAP_TYPE_UNSPEC;
     14__u32 g_line = 0;
     15int page_size = 0; /* userspace should set it */
     16
     17#define VERIFY_TYPE(type, func) ({	\
     18	g_map_type = type;		\
     19	if (!func())			\
     20		return 0;		\
     21})
     22
     23
     24#define VERIFY(expr) ({		\
     25	g_line = __LINE__;	\
     26	if (!(expr))		\
     27		return 0;	\
     28})
     29
     30struct bpf_map {
     31	enum bpf_map_type map_type;
     32	__u32 key_size;
     33	__u32 value_size;
     34	__u32 max_entries;
     35	__u32 id;
     36} __attribute__((preserve_access_index));
     37
     38static inline int check_bpf_map_fields(struct bpf_map *map, __u32 key_size,
     39				       __u32 value_size, __u32 max_entries)
     40{
     41	VERIFY(map->map_type == g_map_type);
     42	VERIFY(map->key_size == key_size);
     43	VERIFY(map->value_size == value_size);
     44	VERIFY(map->max_entries == max_entries);
     45	VERIFY(map->id > 0);
     46
     47	return 1;
     48}
     49
     50static inline int check_bpf_map_ptr(struct bpf_map *indirect,
     51				    struct bpf_map *direct)
     52{
     53	VERIFY(indirect->map_type == direct->map_type);
     54	VERIFY(indirect->key_size == direct->key_size);
     55	VERIFY(indirect->value_size == direct->value_size);
     56	VERIFY(indirect->max_entries == direct->max_entries);
     57	VERIFY(indirect->id == direct->id);
     58
     59	return 1;
     60}
     61
     62static inline int check(struct bpf_map *indirect, struct bpf_map *direct,
     63			__u32 key_size, __u32 value_size, __u32 max_entries)
     64{
     65	VERIFY(check_bpf_map_ptr(indirect, direct));
     66	VERIFY(check_bpf_map_fields(indirect, key_size, value_size,
     67				    max_entries));
     68	return 1;
     69}
     70
     71static inline int check_default(struct bpf_map *indirect,
     72				struct bpf_map *direct)
     73{
     74	VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
     75		     MAX_ENTRIES));
     76	return 1;
     77}
     78
     79static __noinline int
     80check_default_noinline(struct bpf_map *indirect, struct bpf_map *direct)
     81{
     82	VERIFY(check(indirect, direct, sizeof(__u32), sizeof(__u32),
     83		     MAX_ENTRIES));
     84	return 1;
     85}
     86
     87typedef struct {
     88	int counter;
     89} atomic_t;
     90
     91struct bpf_htab {
     92	struct bpf_map map;
     93	atomic_t count;
     94	__u32 n_buckets;
     95	__u32 elem_size;
     96} __attribute__((preserve_access_index));
     97
     98struct {
     99	__uint(type, BPF_MAP_TYPE_HASH);
    100	__uint(map_flags, BPF_F_NO_PREALLOC); /* to test bpf_htab.count */
    101	__uint(max_entries, MAX_ENTRIES);
    102	__type(key, __u32);
    103	__type(value, __u32);
    104} m_hash SEC(".maps");
    105
    106static inline int check_hash(void)
    107{
    108	struct bpf_htab *hash = (struct bpf_htab *)&m_hash;
    109	struct bpf_map *map = (struct bpf_map *)&m_hash;
    110	int i;
    111
    112	VERIFY(check_default_noinline(&hash->map, map));
    113
    114	VERIFY(hash->n_buckets == MAX_ENTRIES);
    115	VERIFY(hash->elem_size == 64);
    116
    117	VERIFY(hash->count.counter == 0);
    118	for (i = 0; i < HALF_ENTRIES; ++i) {
    119		const __u32 key = i;
    120		const __u32 val = 1;
    121
    122		if (bpf_map_update_elem(hash, &key, &val, 0))
    123			return 0;
    124	}
    125	VERIFY(hash->count.counter == HALF_ENTRIES);
    126
    127	return 1;
    128}
    129
    130struct bpf_array {
    131	struct bpf_map map;
    132	__u32 elem_size;
    133} __attribute__((preserve_access_index));
    134
    135struct {
    136	__uint(type, BPF_MAP_TYPE_ARRAY);
    137	__uint(max_entries, MAX_ENTRIES);
    138	__type(key, __u32);
    139	__type(value, __u32);
    140} m_array SEC(".maps");
    141
    142static inline int check_array(void)
    143{
    144	struct bpf_array *array = (struct bpf_array *)&m_array;
    145	struct bpf_map *map = (struct bpf_map *)&m_array;
    146	int i, n_lookups = 0, n_keys = 0;
    147
    148	VERIFY(check_default(&array->map, map));
    149
    150	VERIFY(array->elem_size == 8);
    151
    152	for (i = 0; i < array->map.max_entries && i < LOOP_BOUND; ++i) {
    153		const __u32 key = i;
    154		__u32 *val = bpf_map_lookup_elem(array, &key);
    155
    156		++n_lookups;
    157		if (val)
    158			++n_keys;
    159	}
    160
    161	VERIFY(n_lookups == MAX_ENTRIES);
    162	VERIFY(n_keys == MAX_ENTRIES);
    163
    164	return 1;
    165}
    166
    167struct {
    168	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
    169	__uint(max_entries, MAX_ENTRIES);
    170	__type(key, __u32);
    171	__type(value, __u32);
    172} m_prog_array SEC(".maps");
    173
    174static inline int check_prog_array(void)
    175{
    176	struct bpf_array *prog_array = (struct bpf_array *)&m_prog_array;
    177	struct bpf_map *map = (struct bpf_map *)&m_prog_array;
    178
    179	VERIFY(check_default(&prog_array->map, map));
    180
    181	return 1;
    182}
    183
    184struct {
    185	__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
    186	__uint(max_entries, MAX_ENTRIES);
    187	__type(key, __u32);
    188	__type(value, __u32);
    189} m_perf_event_array SEC(".maps");
    190
    191static inline int check_perf_event_array(void)
    192{
    193	struct bpf_array *perf_event_array = (struct bpf_array *)&m_perf_event_array;
    194	struct bpf_map *map = (struct bpf_map *)&m_perf_event_array;
    195
    196	VERIFY(check_default(&perf_event_array->map, map));
    197
    198	return 1;
    199}
    200
    201struct {
    202	__uint(type, BPF_MAP_TYPE_PERCPU_HASH);
    203	__uint(max_entries, MAX_ENTRIES);
    204	__type(key, __u32);
    205	__type(value, __u32);
    206} m_percpu_hash SEC(".maps");
    207
    208static inline int check_percpu_hash(void)
    209{
    210	struct bpf_htab *percpu_hash = (struct bpf_htab *)&m_percpu_hash;
    211	struct bpf_map *map = (struct bpf_map *)&m_percpu_hash;
    212
    213	VERIFY(check_default(&percpu_hash->map, map));
    214
    215	return 1;
    216}
    217
    218struct {
    219	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
    220	__uint(max_entries, MAX_ENTRIES);
    221	__type(key, __u32);
    222	__type(value, __u32);
    223} m_percpu_array SEC(".maps");
    224
    225static inline int check_percpu_array(void)
    226{
    227	struct bpf_array *percpu_array = (struct bpf_array *)&m_percpu_array;
    228	struct bpf_map *map = (struct bpf_map *)&m_percpu_array;
    229
    230	VERIFY(check_default(&percpu_array->map, map));
    231
    232	return 1;
    233}
    234
    235struct bpf_stack_map {
    236	struct bpf_map map;
    237} __attribute__((preserve_access_index));
    238
    239struct {
    240	__uint(type, BPF_MAP_TYPE_STACK_TRACE);
    241	__uint(max_entries, MAX_ENTRIES);
    242	__type(key, __u32);
    243	__type(value, __u64);
    244} m_stack_trace SEC(".maps");
    245
    246static inline int check_stack_trace(void)
    247{
    248	struct bpf_stack_map *stack_trace =
    249		(struct bpf_stack_map *)&m_stack_trace;
    250	struct bpf_map *map = (struct bpf_map *)&m_stack_trace;
    251
    252	VERIFY(check(&stack_trace->map, map, sizeof(__u32), sizeof(__u64),
    253		     MAX_ENTRIES));
    254
    255	return 1;
    256}
    257
    258struct {
    259	__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
    260	__uint(max_entries, MAX_ENTRIES);
    261	__type(key, __u32);
    262	__type(value, __u32);
    263} m_cgroup_array SEC(".maps");
    264
    265static inline int check_cgroup_array(void)
    266{
    267	struct bpf_array *cgroup_array = (struct bpf_array *)&m_cgroup_array;
    268	struct bpf_map *map = (struct bpf_map *)&m_cgroup_array;
    269
    270	VERIFY(check_default(&cgroup_array->map, map));
    271
    272	return 1;
    273}
    274
    275struct {
    276	__uint(type, BPF_MAP_TYPE_LRU_HASH);
    277	__uint(max_entries, MAX_ENTRIES);
    278	__type(key, __u32);
    279	__type(value, __u32);
    280} m_lru_hash SEC(".maps");
    281
    282static inline int check_lru_hash(void)
    283{
    284	struct bpf_htab *lru_hash = (struct bpf_htab *)&m_lru_hash;
    285	struct bpf_map *map = (struct bpf_map *)&m_lru_hash;
    286
    287	VERIFY(check_default(&lru_hash->map, map));
    288
    289	return 1;
    290}
    291
    292struct {
    293	__uint(type, BPF_MAP_TYPE_LRU_PERCPU_HASH);
    294	__uint(max_entries, MAX_ENTRIES);
    295	__type(key, __u32);
    296	__type(value, __u32);
    297} m_lru_percpu_hash SEC(".maps");
    298
    299static inline int check_lru_percpu_hash(void)
    300{
    301	struct bpf_htab *lru_percpu_hash = (struct bpf_htab *)&m_lru_percpu_hash;
    302	struct bpf_map *map = (struct bpf_map *)&m_lru_percpu_hash;
    303
    304	VERIFY(check_default(&lru_percpu_hash->map, map));
    305
    306	return 1;
    307}
    308
    309struct lpm_trie {
    310	struct bpf_map map;
    311} __attribute__((preserve_access_index));
    312
    313struct lpm_key {
    314	struct bpf_lpm_trie_key trie_key;
    315	__u32 data;
    316};
    317
    318struct {
    319	__uint(type, BPF_MAP_TYPE_LPM_TRIE);
    320	__uint(map_flags, BPF_F_NO_PREALLOC);
    321	__uint(max_entries, MAX_ENTRIES);
    322	__type(key, struct lpm_key);
    323	__type(value, __u32);
    324} m_lpm_trie SEC(".maps");
    325
    326static inline int check_lpm_trie(void)
    327{
    328	struct lpm_trie *lpm_trie = (struct lpm_trie *)&m_lpm_trie;
    329	struct bpf_map *map = (struct bpf_map *)&m_lpm_trie;
    330
    331	VERIFY(check(&lpm_trie->map, map, sizeof(struct lpm_key), sizeof(__u32),
    332		     MAX_ENTRIES));
    333
    334	return 1;
    335}
    336
    337#define INNER_MAX_ENTRIES 1234
    338
    339struct inner_map {
    340	__uint(type, BPF_MAP_TYPE_ARRAY);
    341	__uint(max_entries, INNER_MAX_ENTRIES);
    342	__type(key, __u32);
    343	__type(value, __u32);
    344} inner_map SEC(".maps");
    345
    346struct {
    347	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
    348	__uint(max_entries, MAX_ENTRIES);
    349	__type(key, __u32);
    350	__type(value, __u32);
    351	__array(values, struct {
    352		__uint(type, BPF_MAP_TYPE_ARRAY);
    353		__uint(max_entries, INNER_MAX_ENTRIES);
    354		__type(key, __u32);
    355		__type(value, __u32);
    356	});
    357} m_array_of_maps SEC(".maps") = {
    358	.values = { (void *)&inner_map, 0, 0, 0, 0, 0, 0, 0, 0 },
    359};
    360
    361static inline int check_array_of_maps(void)
    362{
    363	struct bpf_array *array_of_maps = (struct bpf_array *)&m_array_of_maps;
    364	struct bpf_map *map = (struct bpf_map *)&m_array_of_maps;
    365	struct bpf_array *inner_map;
    366	int key = 0;
    367
    368	VERIFY(check_default(&array_of_maps->map, map));
    369	inner_map = bpf_map_lookup_elem(array_of_maps, &key);
    370	VERIFY(inner_map != NULL);
    371	VERIFY(inner_map->map.max_entries == INNER_MAX_ENTRIES);
    372
    373	return 1;
    374}
    375
    376struct {
    377	__uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);
    378	__uint(max_entries, MAX_ENTRIES);
    379	__type(key, __u32);
    380	__type(value, __u32);
    381	__array(values, struct inner_map);
    382} m_hash_of_maps SEC(".maps") = {
    383	.values = {
    384		[2] = &inner_map,
    385	},
    386};
    387
    388static inline int check_hash_of_maps(void)
    389{
    390	struct bpf_htab *hash_of_maps = (struct bpf_htab *)&m_hash_of_maps;
    391	struct bpf_map *map = (struct bpf_map *)&m_hash_of_maps;
    392	struct bpf_htab *inner_map;
    393	int key = 2;
    394
    395	VERIFY(check_default(&hash_of_maps->map, map));
    396	inner_map = bpf_map_lookup_elem(hash_of_maps, &key);
    397	VERIFY(inner_map != NULL);
    398	VERIFY(inner_map->map.max_entries == INNER_MAX_ENTRIES);
    399
    400	return 1;
    401}
    402
    403struct bpf_dtab {
    404	struct bpf_map map;
    405} __attribute__((preserve_access_index));
    406
    407struct {
    408	__uint(type, BPF_MAP_TYPE_DEVMAP);
    409	__uint(max_entries, MAX_ENTRIES);
    410	__type(key, __u32);
    411	__type(value, __u32);
    412} m_devmap SEC(".maps");
    413
    414static inline int check_devmap(void)
    415{
    416	struct bpf_dtab *devmap = (struct bpf_dtab *)&m_devmap;
    417	struct bpf_map *map = (struct bpf_map *)&m_devmap;
    418
    419	VERIFY(check_default(&devmap->map, map));
    420
    421	return 1;
    422}
    423
    424struct bpf_stab {
    425	struct bpf_map map;
    426} __attribute__((preserve_access_index));
    427
    428struct {
    429	__uint(type, BPF_MAP_TYPE_SOCKMAP);
    430	__uint(max_entries, MAX_ENTRIES);
    431	__type(key, __u32);
    432	__type(value, __u32);
    433} m_sockmap SEC(".maps");
    434
    435static inline int check_sockmap(void)
    436{
    437	struct bpf_stab *sockmap = (struct bpf_stab *)&m_sockmap;
    438	struct bpf_map *map = (struct bpf_map *)&m_sockmap;
    439
    440	VERIFY(check_default(&sockmap->map, map));
    441
    442	return 1;
    443}
    444
    445struct bpf_cpu_map {
    446	struct bpf_map map;
    447} __attribute__((preserve_access_index));
    448
    449struct {
    450	__uint(type, BPF_MAP_TYPE_CPUMAP);
    451	__uint(max_entries, MAX_ENTRIES);
    452	__type(key, __u32);
    453	__type(value, __u32);
    454} m_cpumap SEC(".maps");
    455
    456static inline int check_cpumap(void)
    457{
    458	struct bpf_cpu_map *cpumap = (struct bpf_cpu_map *)&m_cpumap;
    459	struct bpf_map *map = (struct bpf_map *)&m_cpumap;
    460
    461	VERIFY(check_default(&cpumap->map, map));
    462
    463	return 1;
    464}
    465
    466struct xsk_map {
    467	struct bpf_map map;
    468} __attribute__((preserve_access_index));
    469
    470struct {
    471	__uint(type, BPF_MAP_TYPE_XSKMAP);
    472	__uint(max_entries, MAX_ENTRIES);
    473	__type(key, __u32);
    474	__type(value, __u32);
    475} m_xskmap SEC(".maps");
    476
    477static inline int check_xskmap(void)
    478{
    479	struct xsk_map *xskmap = (struct xsk_map *)&m_xskmap;
    480	struct bpf_map *map = (struct bpf_map *)&m_xskmap;
    481
    482	VERIFY(check_default(&xskmap->map, map));
    483
    484	return 1;
    485}
    486
    487struct bpf_shtab {
    488	struct bpf_map map;
    489} __attribute__((preserve_access_index));
    490
    491struct {
    492	__uint(type, BPF_MAP_TYPE_SOCKHASH);
    493	__uint(max_entries, MAX_ENTRIES);
    494	__type(key, __u32);
    495	__type(value, __u32);
    496} m_sockhash SEC(".maps");
    497
    498static inline int check_sockhash(void)
    499{
    500	struct bpf_shtab *sockhash = (struct bpf_shtab *)&m_sockhash;
    501	struct bpf_map *map = (struct bpf_map *)&m_sockhash;
    502
    503	VERIFY(check_default(&sockhash->map, map));
    504
    505	return 1;
    506}
    507
    508struct bpf_cgroup_storage_map {
    509	struct bpf_map map;
    510} __attribute__((preserve_access_index));
    511
    512struct {
    513	__uint(type, BPF_MAP_TYPE_CGROUP_STORAGE);
    514	__type(key, struct bpf_cgroup_storage_key);
    515	__type(value, __u32);
    516} m_cgroup_storage SEC(".maps");
    517
    518static inline int check_cgroup_storage(void)
    519{
    520	struct bpf_cgroup_storage_map *cgroup_storage =
    521		(struct bpf_cgroup_storage_map *)&m_cgroup_storage;
    522	struct bpf_map *map = (struct bpf_map *)&m_cgroup_storage;
    523
    524	VERIFY(check(&cgroup_storage->map, map,
    525		     sizeof(struct bpf_cgroup_storage_key), sizeof(__u32), 0));
    526
    527	return 1;
    528}
    529
    530struct reuseport_array {
    531	struct bpf_map map;
    532} __attribute__((preserve_access_index));
    533
    534struct {
    535	__uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY);
    536	__uint(max_entries, MAX_ENTRIES);
    537	__type(key, __u32);
    538	__type(value, __u32);
    539} m_reuseport_sockarray SEC(".maps");
    540
    541static inline int check_reuseport_sockarray(void)
    542{
    543	struct reuseport_array *reuseport_sockarray =
    544		(struct reuseport_array *)&m_reuseport_sockarray;
    545	struct bpf_map *map = (struct bpf_map *)&m_reuseport_sockarray;
    546
    547	VERIFY(check_default(&reuseport_sockarray->map, map));
    548
    549	return 1;
    550}
    551
    552struct {
    553	__uint(type, BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE);
    554	__type(key, struct bpf_cgroup_storage_key);
    555	__type(value, __u32);
    556} m_percpu_cgroup_storage SEC(".maps");
    557
    558static inline int check_percpu_cgroup_storage(void)
    559{
    560	struct bpf_cgroup_storage_map *percpu_cgroup_storage =
    561		(struct bpf_cgroup_storage_map *)&m_percpu_cgroup_storage;
    562	struct bpf_map *map = (struct bpf_map *)&m_percpu_cgroup_storage;
    563
    564	VERIFY(check(&percpu_cgroup_storage->map, map,
    565		     sizeof(struct bpf_cgroup_storage_key), sizeof(__u32), 0));
    566
    567	return 1;
    568}
    569
    570struct bpf_queue_stack {
    571	struct bpf_map map;
    572} __attribute__((preserve_access_index));
    573
    574struct {
    575	__uint(type, BPF_MAP_TYPE_QUEUE);
    576	__uint(max_entries, MAX_ENTRIES);
    577	__type(value, __u32);
    578} m_queue SEC(".maps");
    579
    580static inline int check_queue(void)
    581{
    582	struct bpf_queue_stack *queue = (struct bpf_queue_stack *)&m_queue;
    583	struct bpf_map *map = (struct bpf_map *)&m_queue;
    584
    585	VERIFY(check(&queue->map, map, 0, sizeof(__u32), MAX_ENTRIES));
    586
    587	return 1;
    588}
    589
    590struct {
    591	__uint(type, BPF_MAP_TYPE_STACK);
    592	__uint(max_entries, MAX_ENTRIES);
    593	__type(value, __u32);
    594} m_stack SEC(".maps");
    595
    596static inline int check_stack(void)
    597{
    598	struct bpf_queue_stack *stack = (struct bpf_queue_stack *)&m_stack;
    599	struct bpf_map *map = (struct bpf_map *)&m_stack;
    600
    601	VERIFY(check(&stack->map, map, 0, sizeof(__u32), MAX_ENTRIES));
    602
    603	return 1;
    604}
    605
    606struct bpf_local_storage_map {
    607	struct bpf_map map;
    608} __attribute__((preserve_access_index));
    609
    610struct {
    611	__uint(type, BPF_MAP_TYPE_SK_STORAGE);
    612	__uint(map_flags, BPF_F_NO_PREALLOC);
    613	__type(key, __u32);
    614	__type(value, __u32);
    615} m_sk_storage SEC(".maps");
    616
    617static inline int check_sk_storage(void)
    618{
    619	struct bpf_local_storage_map *sk_storage =
    620		(struct bpf_local_storage_map *)&m_sk_storage;
    621	struct bpf_map *map = (struct bpf_map *)&m_sk_storage;
    622
    623	VERIFY(check(&sk_storage->map, map, sizeof(__u32), sizeof(__u32), 0));
    624
    625	return 1;
    626}
    627
    628struct {
    629	__uint(type, BPF_MAP_TYPE_DEVMAP_HASH);
    630	__uint(max_entries, MAX_ENTRIES);
    631	__type(key, __u32);
    632	__type(value, __u32);
    633} m_devmap_hash SEC(".maps");
    634
    635static inline int check_devmap_hash(void)
    636{
    637	struct bpf_dtab *devmap_hash = (struct bpf_dtab *)&m_devmap_hash;
    638	struct bpf_map *map = (struct bpf_map *)&m_devmap_hash;
    639
    640	VERIFY(check_default(&devmap_hash->map, map));
    641
    642	return 1;
    643}
    644
    645struct bpf_ringbuf_map {
    646	struct bpf_map map;
    647} __attribute__((preserve_access_index));
    648
    649struct {
    650	__uint(type, BPF_MAP_TYPE_RINGBUF);
    651} m_ringbuf SEC(".maps");
    652
    653static inline int check_ringbuf(void)
    654{
    655	struct bpf_ringbuf_map *ringbuf = (struct bpf_ringbuf_map *)&m_ringbuf;
    656	struct bpf_map *map = (struct bpf_map *)&m_ringbuf;
    657
    658	VERIFY(check(&ringbuf->map, map, 0, 0, page_size));
    659
    660	return 1;
    661}
    662
    663SEC("cgroup_skb/egress")
    664int cg_skb(void *ctx)
    665{
    666	VERIFY_TYPE(BPF_MAP_TYPE_HASH, check_hash);
    667	VERIFY_TYPE(BPF_MAP_TYPE_ARRAY, check_array);
    668	VERIFY_TYPE(BPF_MAP_TYPE_PROG_ARRAY, check_prog_array);
    669	VERIFY_TYPE(BPF_MAP_TYPE_PERF_EVENT_ARRAY, check_perf_event_array);
    670	VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_HASH, check_percpu_hash);
    671	VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_ARRAY, check_percpu_array);
    672	VERIFY_TYPE(BPF_MAP_TYPE_STACK_TRACE, check_stack_trace);
    673	VERIFY_TYPE(BPF_MAP_TYPE_CGROUP_ARRAY, check_cgroup_array);
    674	VERIFY_TYPE(BPF_MAP_TYPE_LRU_HASH, check_lru_hash);
    675	VERIFY_TYPE(BPF_MAP_TYPE_LRU_PERCPU_HASH, check_lru_percpu_hash);
    676	VERIFY_TYPE(BPF_MAP_TYPE_LPM_TRIE, check_lpm_trie);
    677	VERIFY_TYPE(BPF_MAP_TYPE_ARRAY_OF_MAPS, check_array_of_maps);
    678	VERIFY_TYPE(BPF_MAP_TYPE_HASH_OF_MAPS, check_hash_of_maps);
    679	VERIFY_TYPE(BPF_MAP_TYPE_DEVMAP, check_devmap);
    680	VERIFY_TYPE(BPF_MAP_TYPE_SOCKMAP, check_sockmap);
    681	VERIFY_TYPE(BPF_MAP_TYPE_CPUMAP, check_cpumap);
    682	VERIFY_TYPE(BPF_MAP_TYPE_XSKMAP, check_xskmap);
    683	VERIFY_TYPE(BPF_MAP_TYPE_SOCKHASH, check_sockhash);
    684	VERIFY_TYPE(BPF_MAP_TYPE_CGROUP_STORAGE, check_cgroup_storage);
    685	VERIFY_TYPE(BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
    686		    check_reuseport_sockarray);
    687	VERIFY_TYPE(BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
    688		    check_percpu_cgroup_storage);
    689	VERIFY_TYPE(BPF_MAP_TYPE_QUEUE, check_queue);
    690	VERIFY_TYPE(BPF_MAP_TYPE_STACK, check_stack);
    691	VERIFY_TYPE(BPF_MAP_TYPE_SK_STORAGE, check_sk_storage);
    692	VERIFY_TYPE(BPF_MAP_TYPE_DEVMAP_HASH, check_devmap_hash);
    693	VERIFY_TYPE(BPF_MAP_TYPE_RINGBUF, check_ringbuf);
    694
    695	return 1;
    696}
    697
    698char _license[] SEC("license") = "GPL";