1*3b2ad502SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2*3b2ad502SAndrii Nakryiko /* Copyright (c) 2021 Facebook */
3*3b2ad502SAndrii Nakryiko 
4*3b2ad502SAndrii Nakryiko #include "vmlinux.h"
5*3b2ad502SAndrii Nakryiko #include <bpf/bpf_helpers.h>
6*3b2ad502SAndrii Nakryiko #include <bpf/bpf_tracing.h>
7*3b2ad502SAndrii Nakryiko 
8*3b2ad502SAndrii Nakryiko /* modifiers and typedefs are ignored when comparing key/value types */
9*3b2ad502SAndrii Nakryiko typedef struct my_key { long x; } key_type;
10*3b2ad502SAndrii Nakryiko typedef struct my_value { long x; } value_type;
11*3b2ad502SAndrii Nakryiko 
12*3b2ad502SAndrii Nakryiko extern struct {
13*3b2ad502SAndrii Nakryiko 	__uint(max_entries, 16);
14*3b2ad502SAndrii Nakryiko 	__type(key, key_type);
15*3b2ad502SAndrii Nakryiko 	__type(value, value_type);
16*3b2ad502SAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_HASH);
17*3b2ad502SAndrii Nakryiko } map1 SEC(".maps");
18*3b2ad502SAndrii Nakryiko 
19*3b2ad502SAndrii Nakryiko struct {
20*3b2ad502SAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY);
21*3b2ad502SAndrii Nakryiko 	__type(key, int);
22*3b2ad502SAndrii Nakryiko 	__type(value, int);
23*3b2ad502SAndrii Nakryiko 	__uint(max_entries, 8);
24*3b2ad502SAndrii Nakryiko } map2 SEC(".maps");
25*3b2ad502SAndrii Nakryiko 
26*3b2ad502SAndrii Nakryiko /* this definition will lose, but it has to exactly match the winner */
27*3b2ad502SAndrii Nakryiko struct {
28*3b2ad502SAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY);
29*3b2ad502SAndrii Nakryiko 	__type(key, int);
30*3b2ad502SAndrii Nakryiko 	__type(value, int);
31*3b2ad502SAndrii Nakryiko 	__uint(max_entries, 16);
32*3b2ad502SAndrii Nakryiko } map_weak __weak SEC(".maps");
33*3b2ad502SAndrii Nakryiko 
34*3b2ad502SAndrii Nakryiko int output_first2;
35*3b2ad502SAndrii Nakryiko int output_second2;
36*3b2ad502SAndrii Nakryiko int output_weak2;
37*3b2ad502SAndrii Nakryiko 
38*3b2ad502SAndrii Nakryiko SEC("raw_tp/sys_enter")
BPF_PROG(handler_enter2)39*3b2ad502SAndrii Nakryiko int BPF_PROG(handler_enter2)
40*3b2ad502SAndrii Nakryiko {
41*3b2ad502SAndrii Nakryiko 	/* update values with key = 2 */
42*3b2ad502SAndrii Nakryiko 	int key = 2, val = 2;
43*3b2ad502SAndrii Nakryiko 	key_type key_struct = { .x = 2 };
44*3b2ad502SAndrii Nakryiko 	value_type val_struct = { .x = 2000 };
45*3b2ad502SAndrii Nakryiko 
46*3b2ad502SAndrii Nakryiko 	bpf_map_update_elem(&map1, &key_struct, &val_struct, 0);
47*3b2ad502SAndrii Nakryiko 	bpf_map_update_elem(&map2, &key, &val, 0);
48*3b2ad502SAndrii Nakryiko 	bpf_map_update_elem(&map_weak, &key, &val, 0);
49*3b2ad502SAndrii Nakryiko 
50*3b2ad502SAndrii Nakryiko 	return 0;
51*3b2ad502SAndrii Nakryiko }
52*3b2ad502SAndrii Nakryiko 
53*3b2ad502SAndrii Nakryiko SEC("raw_tp/sys_exit")
BPF_PROG(handler_exit2)54*3b2ad502SAndrii Nakryiko int BPF_PROG(handler_exit2)
55*3b2ad502SAndrii Nakryiko {
56*3b2ad502SAndrii Nakryiko 	/* lookup values with key = 1, set in another file */
57*3b2ad502SAndrii Nakryiko 	int key = 1, *val;
58*3b2ad502SAndrii Nakryiko 	key_type key_struct = { .x = 1 };
59*3b2ad502SAndrii Nakryiko 	value_type *value_struct;
60*3b2ad502SAndrii Nakryiko 
61*3b2ad502SAndrii Nakryiko 	value_struct = bpf_map_lookup_elem(&map1, &key_struct);
62*3b2ad502SAndrii Nakryiko 	if (value_struct)
63*3b2ad502SAndrii Nakryiko 		output_first2 = value_struct->x;
64*3b2ad502SAndrii Nakryiko 
65*3b2ad502SAndrii Nakryiko 	val = bpf_map_lookup_elem(&map2, &key);
66*3b2ad502SAndrii Nakryiko 	if (val)
67*3b2ad502SAndrii Nakryiko 		output_second2 = *val;
68*3b2ad502SAndrii Nakryiko 
69*3b2ad502SAndrii Nakryiko 	val = bpf_map_lookup_elem(&map_weak, &key);
70*3b2ad502SAndrii Nakryiko 	if (val)
71*3b2ad502SAndrii Nakryiko 		output_weak2 = *val;
72*3b2ad502SAndrii Nakryiko 
73*3b2ad502SAndrii Nakryiko 	return 0;
74*3b2ad502SAndrii Nakryiko }
75*3b2ad502SAndrii Nakryiko 
76*3b2ad502SAndrii Nakryiko char LICENSE[] SEC("license") = "GPL";
77